transfer.h (5915B)
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 bool Curl_xfer_write_is_paused(struct Curl_easy *data); 59 60 /** 61 * Write a single "header" line from a server response. 62 * @param hd0 the null-terminated, single header line 63 * @param hdlen the length of the header line 64 * @param is_eos TRUE iff this is the end of the response 65 */ 66 CURLcode Curl_xfer_write_resp_hd(struct Curl_easy *data, 67 const char *hd0, size_t hdlen, bool is_eos); 68 69 #define CURL_XFER_NOP (0) 70 #define CURL_XFER_RECV (1<<(0)) 71 #define CURL_XFER_SEND (1<<(1)) 72 #define CURL_XFER_SENDRECV (CURL_XFER_RECV|CURL_XFER_SEND) 73 74 /** 75 * The transfer is neither receiving nor sending now. 76 */ 77 void Curl_xfer_setup_nop(struct Curl_easy *data); 78 79 /** 80 * The transfer will use socket 1 to send/recv. `recv_size` is 81 * the amount to receive or -1 if unknown. `getheader` indicates 82 * response header processing is expected. 83 */ 84 void Curl_xfer_setup1(struct Curl_easy *data, 85 int send_recv, 86 curl_off_t recv_size, 87 bool getheader); 88 89 /** 90 * The transfer will use socket 2 to send/recv. `recv_size` is 91 * the amount to receive or -1 if unknown. With `shutdown` being 92 * set, the transfer is only allowed to either send OR receive 93 * and the socket 2 connection will be shutdown at the end of 94 * the transfer. An unclean shutdown will fail the transfer 95 * unless `shutdown_err_ignore` is TRUE. 96 */ 97 void Curl_xfer_setup2(struct Curl_easy *data, 98 int send_recv, 99 curl_off_t recv_size, 100 bool shutdown, bool shutdown_err_ignore); 101 102 /** 103 * Multi has set transfer to DONE. Last chance to trigger 104 * missing response things like writing an EOS to the client. 105 */ 106 CURLcode Curl_xfer_write_done(struct Curl_easy *data, bool premature); 107 108 /** 109 * Return TRUE iff transfer has pending data to send. Checks involved 110 * connection filters. 111 */ 112 bool Curl_xfer_needs_flush(struct Curl_easy *data); 113 114 /** 115 * Flush any pending send data on the transfer connection. 116 */ 117 CURLcode Curl_xfer_flush(struct Curl_easy *data); 118 119 /** 120 * Send data on the socket/connection filter designated 121 * for transfer's outgoing data. 122 * Will return CURLE_OK on blocking with (*pnwritten == 0). 123 */ 124 CURLcode Curl_xfer_send(struct Curl_easy *data, 125 const void *buf, size_t blen, bool eos, 126 size_t *pnwritten); 127 128 /** 129 * Receive data on the socket/connection filter designated 130 * for transfer's incoming data. 131 * Will return CURLE_AGAIN on blocking with (*pnrcvd == 0). 132 */ 133 CURLcode Curl_xfer_recv(struct Curl_easy *data, 134 char *buf, size_t blen, 135 size_t *pnrcvd); 136 137 CURLcode Curl_xfer_send_close(struct Curl_easy *data); 138 CURLcode Curl_xfer_send_shutdown(struct Curl_easy *data, bool *done); 139 140 /* Return TRUE if the transfer is not done, but further progress 141 * is blocked. For example when it is only receiving and its writer 142 * is PAUSED. */ 143 bool Curl_xfer_is_blocked(struct Curl_easy *data); 144 145 /* Query if send/recv for transfer is paused. */ 146 bool Curl_xfer_send_is_paused(struct Curl_easy *data); 147 bool Curl_xfer_recv_is_paused(struct Curl_easy *data); 148 149 /* Enable/Disable pausing of send/recv for the transfer. */ 150 CURLcode Curl_xfer_pause_send(struct Curl_easy *data, bool enable); 151 CURLcode Curl_xfer_pause_recv(struct Curl_easy *data, bool enable); 152 153 154 #endif /* HEADER_CURL_TRANSFER_H */