2
0

request.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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's 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 doesn't 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. long bodywrites;
  87. char *location; /* This points to an allocated version of the Location:
  88. header data */
  89. char *newurl; /* Set to the new URL to use when a redirect or a retry is
  90. wanted */
  91. /* Allocated protocol-specific data. Each protocol handler makes sure this
  92. points to data it needs. */
  93. union {
  94. struct FILEPROTO *file;
  95. struct FTP *ftp;
  96. struct HTTP *http;
  97. struct IMAP *imap;
  98. struct ldapreqinfo *ldap;
  99. struct MQTT *mqtt;
  100. struct POP3 *pop3;
  101. struct RTSP *rtsp;
  102. struct smb_request *smb;
  103. struct SMTP *smtp;
  104. struct SSHPROTO *ssh;
  105. struct TELNET *telnet;
  106. } p;
  107. #ifndef CURL_DISABLE_DOH
  108. struct dohdata *doh; /* DoH specific data for this request */
  109. #endif
  110. #ifndef CURL_DISABLE_COOKIES
  111. unsigned char setcookies;
  112. #endif
  113. BIT(header); /* incoming data has HTTP header */
  114. BIT(done); /* request is done, e.g. no more send/recv should
  115. * happen. This can be TRUE before `upload_done` or
  116. * `download_done` is TRUE. */
  117. BIT(content_range); /* set TRUE if Content-Range: was found */
  118. BIT(download_done); /* set to TRUE when download is complete */
  119. BIT(eos_written); /* iff EOS has been written to client */
  120. BIT(eos_read); /* iff EOS has been read from the client */
  121. BIT(rewind_read); /* iff reader needs rewind at next start */
  122. BIT(upload_done); /* set to TRUE when all request data has been sent */
  123. BIT(upload_aborted); /* set to TRUE when upload was aborted. Will also
  124. * show `upload_done` as TRUE. */
  125. BIT(ignorebody); /* we read a response-body but we ignore it! */
  126. BIT(http_bodyless); /* HTTP response status code is between 100 and 199,
  127. 204 or 304 */
  128. BIT(chunk); /* if set, this is a chunked transfer-encoding */
  129. BIT(ignore_cl); /* ignore content-length */
  130. BIT(upload_chunky); /* set TRUE if we are doing chunked transfer-encoding
  131. on upload */
  132. BIT(getheader); /* TRUE if header parsing is wanted */
  133. BIT(no_body); /* the response has no body */
  134. BIT(authneg); /* TRUE when the auth phase has started, which means
  135. that we are creating a request with an auth header,
  136. but it is not the final request in the auth
  137. negotiation. */
  138. BIT(sendbuf_init); /* sendbuf is initialized */
  139. };
  140. /**
  141. * Initialize the state of the request for first use.
  142. */
  143. void Curl_req_init(struct SingleRequest *req);
  144. /**
  145. * The request is about to start. Record time and do a soft reset.
  146. */
  147. CURLcode Curl_req_start(struct SingleRequest *req,
  148. struct Curl_easy *data);
  149. /**
  150. * The request may continue with a follow up. Reset
  151. * members, but keep start time for overall duration calc.
  152. */
  153. CURLcode Curl_req_soft_reset(struct SingleRequest *req,
  154. struct Curl_easy *data);
  155. /**
  156. * The request is done. If not aborted, make sure that buffers are
  157. * flushed to the client.
  158. * @param req the request
  159. * @param data the transfer
  160. * @param aborted TRUE iff the request was aborted/errored
  161. */
  162. CURLcode Curl_req_done(struct SingleRequest *req,
  163. struct Curl_easy *data, bool aborted);
  164. /**
  165. * Free the state of the request, not usable afterwards.
  166. */
  167. void Curl_req_free(struct SingleRequest *req, struct Curl_easy *data);
  168. /**
  169. * Hard reset the state of the request to virgin state base on
  170. * transfer settings.
  171. */
  172. void Curl_req_hard_reset(struct SingleRequest *req, struct Curl_easy *data);
  173. #ifndef USE_HYPER
  174. /**
  175. * Send request headers. If not all could be sent
  176. * they will be buffered. Use `Curl_req_flush()` to make sure
  177. * bytes are really send.
  178. * @param data the transfer making the request
  179. * @param buf the complete header bytes, no body
  180. * @return CURLE_OK (on blocking with *pnwritten == 0) or error.
  181. */
  182. CURLcode Curl_req_send(struct Curl_easy *data, struct dynbuf *buf);
  183. #endif /* !USE_HYPER */
  184. /**
  185. * TRUE iff the request has sent all request headers and data.
  186. */
  187. bool Curl_req_done_sending(struct Curl_easy *data);
  188. /*
  189. * Read more from client and flush all buffered request bytes.
  190. * @return CURLE_OK on success or the error on the sending.
  191. * Never returns CURLE_AGAIN.
  192. */
  193. CURLcode Curl_req_send_more(struct Curl_easy *data);
  194. /**
  195. * TRUE iff the request wants to send, e.g. has buffered bytes.
  196. */
  197. bool Curl_req_want_send(struct Curl_easy *data);
  198. /**
  199. * Stop sending any more request data to the server.
  200. * Will clear the send buffer and mark request sending as done.
  201. */
  202. CURLcode Curl_req_abort_sending(struct Curl_easy *data);
  203. #endif /* HEADER_CURL_REQUEST_H */