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