xref: /curl/lib/transfer.h (revision d0377f5a)
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