request.h 9.0 KB

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