• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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