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 CURLcode Curl_sendrecv(struct Curl_easy *data, struct curltime *nowp); 37 int Curl_single_getsock(struct Curl_easy *data, 38 struct connectdata *conn, curl_socket_t *socks); 39 CURLcode Curl_retry_request(struct Curl_easy *data, char **url); 40 bool Curl_meets_timecondition(struct Curl_easy *data, time_t timeofdoc); 41 42 /** 43 * Write the transfer raw response bytes, as received from the connection. 44 * Will handle all passed bytes or return an error. By default, this will 45 * write the bytes as BODY to the client. Protocols may provide a 46 * "write_resp" callback in their handler to add specific treatment. E.g. 47 * HTTP parses response headers and passes them differently to the client. 48 * @param data the transfer 49 * @param buf the raw response bytes 50 * @param blen the amount of bytes in `buf` 51 * @param is_eos TRUE iff the connection indicates this to be the last 52 * bytes of the response 53 */ 54 CURLcode Curl_xfer_write_resp(struct Curl_easy *data, 55 const char *buf, size_t blen, 56 bool is_eos); 57 58 /** 59 * Write a single "header" line from a server response. 60 * @param hd0 the 0-terminated, single header line 61 * @param hdlen the length of the header line 62 * @param is_eos TRUE iff this is the end of the response 63 */ 64 CURLcode Curl_xfer_write_resp_hd(struct Curl_easy *data, 65 const char *hd0, size_t hdlen, bool is_eos); 66 67 #define CURL_XFER_NOP (0) 68 #define CURL_XFER_RECV (1<<(0)) 69 #define CURL_XFER_SEND (1<<(1)) 70 #define CURL_XFER_SENDRECV (CURL_XFER_RECV|CURL_XFER_SEND) 71 72 /** 73 * The transfer is neither receiving nor sending now. 74 */ 75 void Curl_xfer_setup_nop(struct Curl_easy *data); 76 77 /** 78 * The transfer will use socket 1 to send/recv. `recv_size` is 79 * the amount to receive or -1 if unknown. `getheader` indicates 80 * response header processing is expected. 81 */ 82 void Curl_xfer_setup1(struct Curl_easy *data, 83 int send_recv, 84 curl_off_t recv_size, 85 bool getheader); 86 87 /** 88 * The transfer will use socket 2 to send/recv. `recv_size` is 89 * the amount to receive or -1 if unknown. With `shutdown` being 90 * set, the transfer is only allowed to either send OR receive 91 * and the socket 2 connection will be shutdown at the end of 92 * the transfer. An unclean shutdown will fail the transfer 93 * unless `shutdown_err_ignore` is TRUE. 94 */ 95 void Curl_xfer_setup2(struct Curl_easy *data, 96 int send_recv, 97 curl_off_t recv_size, 98 bool shutdown, bool shutdown_err_ignore); 99 100 /** 101 * Multi has set transfer to DONE. Last chance to trigger 102 * missing response things like writing an EOS to the client. 103 */ 104 CURLcode Curl_xfer_write_done(struct Curl_easy *data, bool premature); 105 106 /** 107 * Return TRUE iff transfer has pending data to send. Checks involved 108 * connection filters. 109 */ 110 bool Curl_xfer_needs_flush(struct Curl_easy *data); 111 112 /** 113 * Flush any pending send data on the transfer connection. 114 */ 115 CURLcode Curl_xfer_flush(struct Curl_easy *data); 116 117 /** 118 * Send data on the socket/connection filter designated 119 * for transfer's outgoing data. 120 * Will return CURLE_OK on blocking with (*pnwritten == 0). 121 */ 122 CURLcode Curl_xfer_send(struct Curl_easy *data, 123 const void *buf, size_t blen, bool eos, 124 size_t *pnwritten); 125 126 /** 127 * Receive data on the socket/connection filter designated 128 * for transfer's incoming data. 129 * Will return CURLE_AGAIN on blocking with (*pnrcvd == 0). 130 */ 131 CURLcode Curl_xfer_recv(struct Curl_easy *data, 132 char *buf, size_t blen, 133 ssize_t *pnrcvd); 134 135 CURLcode Curl_xfer_send_close(struct Curl_easy *data); 136 CURLcode Curl_xfer_send_shutdown(struct Curl_easy *data, bool *done); 137 138 /** 139 * Return TRUE iff the transfer is not done, but further progress 140 * is blocked. For example when it is only receiving and its writer 141 * is PAUSED. 142 */ 143 bool Curl_xfer_is_blocked(struct Curl_easy *data); 144 145 #endif /* HEADER_CURL_TRANSFER_H */ 146