xref: /aosp_15_r20/external/curl/lib/transfer.h (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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