1 #ifndef HEADER_CURL_TRANSFER_H 2 #define HEADER_CURL_TRANSFER_H 3 /*************************************************************************** 4 * _ _ ____ _ 5 * Project ___| | | | _ \| | 6 * / __| | | | |_) | | 7 * | (__| |_| | _ <| |___ 8 * \___|\___/|_| \_\_____| 9 * 10 * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. 11 * 12 * This software is licensed as described in the file COPYING, which 13 * you should have received as part of this distribution. The terms 14 * are also available at https://curl.se/docs/copyright.html. 15 * 16 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 17 * copies of the Software, and permit persons to whom the Software is 18 * furnished to do so, under the terms of the COPYING file. 19 * 20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21 * KIND, either express or implied. 22 * 23 * SPDX-License-Identifier: curl 24 * 25 ***************************************************************************/ 26 27 #define Curl_headersep(x) ((((x)==':') || ((x)==';'))) 28 char *Curl_checkheaders(const struct Curl_easy *data, 29 const char *thisheader, 30 const size_t thislen); 31 32 void Curl_init_CONNECT(struct Curl_easy *data); 33 34 CURLcode Curl_pretransfer(struct Curl_easy *data); 35 36 typedef enum { 37 FOLLOW_NONE, /* not used within the function, just a placeholder to 38 allow initing to this */ 39 FOLLOW_FAKE, /* only records stuff, not actually following */ 40 FOLLOW_RETRY, /* set if this is a request retry as opposed to a real 41 redirect following */ 42 FOLLOW_REDIR /* a full true redirect */ 43 } followtype; 44 45 CURLcode Curl_sendrecv(struct Curl_easy *data, struct curltime *nowp); 46 int Curl_single_getsock(struct Curl_easy *data, 47 struct connectdata *conn, curl_socket_t *socks); 48 CURLcode Curl_retry_request(struct Curl_easy *data, char **url); 49 bool Curl_meets_timecondition(struct Curl_easy *data, time_t timeofdoc); 50 51 /** 52 * Write the transfer raw response bytes, as received from the connection. 53 * Will handle all passed bytes or return an error. By default, this will 54 * write the bytes as BODY to the client. Protocols may provide a 55 * "write_resp" callback in their handler to add specific treatment. E.g. 56 * HTTP parses response headers and passes them differently to the client. 57 * @param data the transfer 58 * @param buf the raw response bytes 59 * @param blen the amount of bytes in `buf` 60 * @param is_eos TRUE iff the connection indicates this to be the last 61 * bytes of the response 62 */ 63 CURLcode Curl_xfer_write_resp(struct Curl_easy *data, 64 const char *buf, size_t blen, 65 bool is_eos); 66 67 /** 68 * Write a single "header" line from a server response. 69 * @param hd0 the 0-terminated, single header line 70 * @param hdlen the length of the header line 71 * @param is_eos TRUE iff this is the end of the response 72 */ 73 CURLcode Curl_xfer_write_resp_hd(struct Curl_easy *data, 74 const char *hd0, size_t hdlen, bool is_eos); 75 76 #define CURL_XFER_NOP (0) 77 #define CURL_XFER_RECV (1<<(0)) 78 #define CURL_XFER_SEND (1<<(1)) 79 #define CURL_XFER_SENDRECV (CURL_XFER_RECV|CURL_XFER_SEND) 80 81 /** 82 * The transfer is neither receiving nor sending now. 83 */ 84 void Curl_xfer_setup_nop(struct Curl_easy *data); 85 86 /** 87 * The transfer will use socket 1 to send/recv. `recv_size` is 88 * the amount to receive or -1 if unknown. `getheader` indicates 89 * response header processing is expected. 90 */ 91 void Curl_xfer_setup1(struct Curl_easy *data, 92 int send_recv, 93 curl_off_t recv_size, 94 bool getheader); 95 96 /** 97 * The transfer will use socket 2 to send/recv. `recv_size` is 98 * the amount to receive or -1 if unknown. With `shutdown` being 99 * set, the transfer is only allowed to either send OR receive 100 * and the socket 2 connection will be shutdown at the end of 101 * the transfer. An unclean shutdown will fail the transfer 102 * unless `shutdown_err_ignore` is TRUE. 103 */ 104 void Curl_xfer_setup2(struct Curl_easy *data, 105 int send_recv, 106 curl_off_t recv_size, 107 bool shutdown, bool shutdown_err_ignore); 108 109 /** 110 * Multi has set transfer to DONE. Last chance to trigger 111 * missing response things like writing an EOS to the client. 112 */ 113 CURLcode Curl_xfer_write_done(struct Curl_easy *data, bool premature); 114 115 /** 116 * Return TRUE iff transfer has pending data to send. Checks involved 117 * connection filters. 118 */ 119 bool Curl_xfer_needs_flush(struct Curl_easy *data); 120 121 /** 122 * Flush any pending send data on the transfer connection. 123 */ 124 CURLcode Curl_xfer_flush(struct Curl_easy *data); 125 126 /** 127 * Send data on the socket/connection filter designated 128 * for transfer's outgoing data. 129 * Will return CURLE_OK on blocking with (*pnwritten == 0). 130 */ 131 CURLcode Curl_xfer_send(struct Curl_easy *data, 132 const void *buf, size_t blen, bool eos, 133 size_t *pnwritten); 134 135 /** 136 * Receive data on the socket/connection filter designated 137 * for transfer's incoming data. 138 * Will return CURLE_AGAIN on blocking with (*pnrcvd == 0). 139 */ 140 CURLcode Curl_xfer_recv(struct Curl_easy *data, 141 char *buf, size_t blen, 142 ssize_t *pnrcvd); 143 144 CURLcode Curl_xfer_send_close(struct Curl_easy *data); 145 CURLcode Curl_xfer_send_shutdown(struct Curl_easy *data, bool *done); 146 147 /** 148 * Return TRUE iff the transfer is not done, but further progress 149 * is blocked. For example when it is only receiving and its writer 150 * is PAUSED. 151 */ 152 bool Curl_xfer_is_blocked(struct Curl_easy *data); 153 154 #endif /* HEADER_CURL_TRANSFER_H */ 155