request.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #ifndef HEADER_CURL_REQUEST_H
  2. #define HEADER_CURL_REQUEST_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. /* This file is for lib internal stuff */
  27. #include "curl_setup.h"
  28. #include "bufq.h"
  29. /* forward declarations */
  30. struct UserDefined;
  31. #ifndef CURL_DISABLE_DOH
  32. struct doh_probes;
  33. #endif
  34. enum expect100 {
  35. EXP100_SEND_DATA, /* enough waiting, just send the body now */
  36. EXP100_AWAITING_CONTINUE, /* waiting for the 100 Continue header */
  37. EXP100_SENDING_REQUEST, /* still sending the request but will wait for
  38. the 100 header once done with the request */
  39. EXP100_FAILED /* used on 417 Expectation Failed */
  40. };
  41. enum upgrade101 {
  42. UPGR101_INIT, /* default state */
  43. UPGR101_WS, /* upgrade to WebSockets requested */
  44. UPGR101_H2, /* upgrade to HTTP/2 requested */
  45. UPGR101_RECEIVED, /* 101 response received */
  46. UPGR101_WORKING /* talking upgraded protocol */
  47. };
  48. /*
  49. * Request specific data in the easy handle (Curl_easy). Previously,
  50. * these members were on the connectdata struct but since a conn struct may
  51. * now be shared between different Curl_easys, we store connection-specific
  52. * data here. This struct only keeps stuff that is interesting for *this*
  53. * request, as it will be cleared between multiple ones
  54. */
  55. struct SingleRequest {
  56. curl_off_t size; /* -1 if unknown at this point */
  57. curl_off_t maxdownload; /* in bytes, the maximum amount of data to fetch,
  58. -1 means unlimited */
  59. curl_off_t bytecount; /* total number of bytes read */
  60. curl_off_t writebytecount; /* number of bytes written */
  61. struct curltime start; /* transfer started at this time */
  62. unsigned int headerbytecount; /* received server headers (not CONNECT
  63. headers) */
  64. unsigned int allheadercount; /* all received headers (server + CONNECT) */
  65. unsigned int deductheadercount; /* this amount of bytes does not count when
  66. we check if anything has been transferred
  67. at the end of a connection. We use this
  68. counter to make only a 100 reply (without
  69. a following second response code) result
  70. in a CURLE_GOT_NOTHING error code */
  71. int headerline; /* counts header lines to better track the
  72. first one */
  73. curl_off_t offset; /* possible resume offset read from the
  74. Content-Range: header */
  75. int httpversion; /* Version in response (09, 10, 11, etc.) */
  76. int httpcode; /* error code from the 'HTTP/1.? XXX' or
  77. 'RTSP/1.? XXX' line */
  78. int keepon;
  79. enum upgrade101 upgr101; /* 101 upgrade state */
  80. /* Client Writer stack, handles transfer- and content-encodings, protocol
  81. * checks, pausing by client callbacks. */
  82. struct Curl_cwriter *writer_stack;
  83. /* Client Reader stack, handles transfer- and content-encodings, protocol
  84. * checks, pausing by client callbacks. */
  85. struct Curl_creader *reader_stack;
  86. struct bufq sendbuf; /* data which needs to be send to the server */
  87. size_t sendbuf_hds_len; /* amount of header bytes in sendbuf */
  88. time_t timeofdoc;
  89. char *location; /* This points to an allocated version of the Location:
  90. header data */
  91. char *newurl; /* Set to the new URL to use when a redirect or a retry is
  92. wanted */
  93. /* Allocated protocol-specific data. Each protocol handler makes sure this
  94. points to data it needs. */
  95. union {
  96. struct FILEPROTO *file;
  97. struct FTP *ftp;
  98. struct IMAP *imap;
  99. struct ldapreqinfo *ldap;
  100. struct MQTT *mqtt;
  101. struct POP3 *pop3;
  102. struct RTSP *rtsp;
  103. struct smb_request *smb;
  104. struct SMTP *smtp;
  105. struct SSHPROTO *ssh;
  106. struct TELNET *telnet;
  107. } p;
  108. #ifndef CURL_DISABLE_DOH
  109. struct doh_probes *doh; /* DoH specific data for this request */
  110. #endif
  111. #ifndef CURL_DISABLE_COOKIES
  112. unsigned char setcookies;
  113. #endif
  114. BIT(header); /* incoming data has HTTP header */
  115. BIT(done); /* request is done, e.g. no more send/recv should
  116. * happen. This can be TRUE before `upload_done` or
  117. * `download_done` is TRUE. */
  118. BIT(content_range); /* set TRUE if Content-Range: was found */
  119. BIT(download_done); /* set to TRUE when download is complete */
  120. BIT(eos_written); /* iff EOS has been written to client */
  121. BIT(eos_read); /* iff EOS has been read from the client */
  122. BIT(eos_sent); /* iff EOS has been sent to the server */
  123. BIT(rewind_read); /* iff reader needs rewind at next start */
  124. BIT(upload_done); /* set to TRUE when all request data has been sent */
  125. BIT(upload_aborted); /* set to TRUE when upload was aborted. Will also
  126. * show `upload_done` as TRUE. */
  127. BIT(ignorebody); /* we read a response-body but we ignore it! */
  128. BIT(http_bodyless); /* HTTP response status code is between 100 and 199,
  129. 204 or 304 */
  130. BIT(chunk); /* if set, this is a chunked transfer-encoding */
  131. BIT(resp_trailer); /* response carried 'Trailer:' header field */
  132. BIT(ignore_cl); /* ignore content-length */
  133. BIT(upload_chunky); /* set TRUE if we are doing chunked transfer-encoding
  134. on upload */
  135. BIT(getheader); /* TRUE if header parsing is wanted */
  136. BIT(no_body); /* the response has no body */
  137. BIT(authneg); /* TRUE when the auth phase has started, which means
  138. that we are creating a request with an auth header,
  139. but it is not the final request in the auth
  140. negotiation. */
  141. BIT(sendbuf_init); /* sendbuf is initialized */
  142. BIT(shutdown); /* request end will shutdown connection */
  143. BIT(shutdown_err_ignore); /* errors in shutdown will not fail request */
  144. #ifdef USE_HYPER
  145. BIT(bodywritten);
  146. #endif
  147. };
  148. /**
  149. * Initialize the state of the request for first use.
  150. */
  151. void Curl_req_init(struct SingleRequest *req);
  152. /**
  153. * The request is about to start. Record time and do a soft reset.
  154. */
  155. CURLcode Curl_req_start(struct SingleRequest *req,
  156. struct Curl_easy *data);
  157. /**
  158. * The request may continue with a follow up. Reset
  159. * members, but keep start time for overall duration calc.
  160. */
  161. CURLcode Curl_req_soft_reset(struct SingleRequest *req,
  162. struct Curl_easy *data);
  163. /**
  164. * The request is done. If not aborted, make sure that buffers are
  165. * flushed to the client.
  166. * @param req the request
  167. * @param data the transfer
  168. * @param aborted TRUE iff the request was aborted/errored
  169. */
  170. CURLcode Curl_req_done(struct SingleRequest *req,
  171. struct Curl_easy *data, bool aborted);
  172. /**
  173. * Free the state of the request, not usable afterwards.
  174. */
  175. void Curl_req_free(struct SingleRequest *req, struct Curl_easy *data);
  176. /**
  177. * Hard reset the state of the request to virgin state base on
  178. * transfer settings.
  179. */
  180. void Curl_req_hard_reset(struct SingleRequest *req, struct Curl_easy *data);
  181. #ifndef USE_HYPER
  182. /**
  183. * Send request headers. If not all could be sent
  184. * they will be buffered. Use `Curl_req_flush()` to make sure
  185. * bytes are really send.
  186. * @param data the transfer making the request
  187. * @param buf the complete header bytes, no body
  188. * @return CURLE_OK (on blocking with *pnwritten == 0) or error.
  189. */
  190. CURLcode Curl_req_send(struct Curl_easy *data, struct dynbuf *buf);
  191. #endif /* !USE_HYPER */
  192. /**
  193. * TRUE iff the request has sent all request headers and data.
  194. */
  195. bool Curl_req_done_sending(struct Curl_easy *data);
  196. /*
  197. * Read more from client and flush all buffered request bytes.
  198. * @return CURLE_OK on success or the error on the sending.
  199. * Never returns CURLE_AGAIN.
  200. */
  201. CURLcode Curl_req_send_more(struct Curl_easy *data);
  202. /**
  203. * TRUE iff the request wants to send, e.g. has buffered bytes.
  204. */
  205. bool Curl_req_want_send(struct Curl_easy *data);
  206. /**
  207. * TRUE iff the request has no buffered bytes yet to send.
  208. */
  209. bool Curl_req_sendbuf_empty(struct Curl_easy *data);
  210. /**
  211. * Stop sending any more request data to the server.
  212. * Will clear the send buffer and mark request sending as done.
  213. */
  214. CURLcode Curl_req_abort_sending(struct Curl_easy *data);
  215. /**
  216. * Stop sending and receiving any more request data.
  217. * Will abort sending if not done.
  218. */
  219. CURLcode Curl_req_stop_send_recv(struct Curl_easy *data);
  220. /**
  221. * Invoked when all request data has been uploaded.
  222. */
  223. CURLcode Curl_req_set_upload_done(struct Curl_easy *data);
  224. #endif /* HEADER_CURL_REQUEST_H */