1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifndef HEADER_CURL_HTTP_H 2e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define HEADER_CURL_HTTP_H 35ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*************************************************************************** 45ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * _ _ ____ _ 55ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Project ___| | | | _ \| | 65ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * / __| | | | |_) | | 75ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * | (__| |_| | _ <| |___ 85ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * \___|\___/|_| \_\_____| 95ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 10e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al. 115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is licensed as described in the file COPYING, which 135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * you should have received as part of this distribution. The terms 145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * are also available at http://curl.haxx.se/docs/copyright.html. 155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * You may opt to use, copy, modify, merge, publish, distribute and/or sell 175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * copies of the Software, and permit persons to whom the Software is 185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * furnished to do so, under the terms of the COPYING file. 195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * KIND, either express or implied. 225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ***************************************************************************/ 24e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "curl_setup.h" 25e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef CURL_DISABLE_HTTP 275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 28e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef USE_NGHTTP2 29e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include <nghttp2/nghttp2.h> 30e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 31e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenextern const struct Curl_handler Curl_handler_http; 335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifdef USE_SSL 355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenextern const struct Curl_handler Curl_handler_https; 365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 38e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* Header specific functions */ 395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenbool Curl_compareheader(const char *headerline, /* line to check */ 405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen const char *header, /* header keyword _with_ colon */ 415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen const char *content); /* content string to find */ 425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 43e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETchar *Curl_checkheaders(const struct connectdata *conn, 44e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const char *thisheader); 45e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETchar *Curl_copy_header_value(const char *header); 465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 47e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETchar *Curl_checkProxyheaders(const struct connectdata *conn, 48e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const char *thisheader); 495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* ------------------------------------------------------------------------- */ 505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* 515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * The add_buffer series of functions are used to build one large memory chunk 525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * from repeated function invokes. Used so that the entire HTTP request can 535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * be sent in one go. 545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen */ 555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenstruct Curl_send_buffer { 565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen char *buffer; 575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen size_t size_max; 585ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen size_t size_used; 595ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen}; 605ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsentypedef struct Curl_send_buffer Curl_send_buffer; 615ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCurl_send_buffer *Curl_add_buffer_init(void); 63e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETvoid Curl_add_buffer_free(Curl_send_buffer *buff); 645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_add_bufferf(Curl_send_buffer *in, const char *fmt, ...); 655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_add_buffer(Curl_send_buffer *in, const void *inptr, size_t size); 665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_add_buffer_send(Curl_send_buffer *in, 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct connectdata *conn, 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels long *bytes_written, 699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels size_t included_body_bytes, 709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int socketindex); 715ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_add_timecondition(struct SessionHandle *data, 735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen Curl_send_buffer *buf); 745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_add_custom_headers(struct connectdata *conn, 75e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET bool is_connect, 76e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Curl_send_buffer *req_buffer); 775ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 785ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* protocol-specific functions set up to be called by the main engine */ 795ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_http(struct connectdata *conn, bool *done); 805ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_http_done(struct connectdata *, CURLcode, bool premature); 815ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_http_connect(struct connectdata *conn, bool *done); 82e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURLcode Curl_http_setup_conn(struct connectdata *conn); 835ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 845ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* The following functions are defined in http_chunks.c */ 855ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenvoid Curl_httpchunk_init(struct connectdata *conn); 865ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap, 875ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ssize_t length, ssize_t *wrote); 885ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 895ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* These functions are in http.c */ 905ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenvoid Curl_http_auth_stage(struct SessionHandle *data, int stage); 91e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy, 92e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const char *auth); 935ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_http_auth_act(struct connectdata *conn); 945ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_http_perhapsrewind(struct connectdata *conn); 955ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 965ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* If only the PICKNONE bit is set, there has been a round-trip and we 975ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen selected to use no auth at all. Ie, we actively select no auth, as opposed 985ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen to not having one selected. The other CURLAUTH_* defines are present in the 995ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen public curl/curl.h header. */ 1005ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define CURLAUTH_PICKNONE (1<<30) /* don't use auth */ 1015ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1025ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/* MAX_INITIAL_POST_SIZE indicates the number of bytes that will make the POST 1035ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen data get included in the initial data chunk sent to the server. If the 1045ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen data is larger than this, it will automatically get split up in multiple 1055ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen system calls. 1065ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1075ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen This value used to be fairly big (100K), but we must take into account that 1085ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if the server rejects the POST due for authentication reasons, this data 1095ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen will always be uncondtionally sent and thus it may not be larger than can 1105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen always be afforded to send twice. 1115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1125ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen It must not be greater than 64K to work on VMS. 1135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen*/ 1145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef MAX_INITIAL_POST_SIZE 1155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define MAX_INITIAL_POST_SIZE (64*1024) 1165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 1175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#ifndef TINY_INITIAL_POST_SIZE 1195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#define TINY_INITIAL_POST_SIZE 1024 1205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif 1215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#endif /* CURL_DISABLE_HTTP */ 1235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/**************************************************************************** 1255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * HTTP unique setup 1265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ***************************************************************************/ 1275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsenstruct HTTP { 1285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct FormData *sendit; 1295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen curl_off_t postsize; /* off_t to handle large file sizes */ 1305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen const char *postdata; 1315ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen const char *p_pragma; /* Pragma: string */ 1335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen const char *p_accept; /* Accept: string */ 1345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen curl_off_t readbytecount; 1355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen curl_off_t writebytecount; 1365ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* For FORM posting */ 1385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct Form form; 1395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct back { 1415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen curl_read_callback fread_func; /* backup storage for fread pointer */ 1425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen void *fread_in; /* backup storage for fread_in pointer */ 1435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen const char *postdata; 1445ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen curl_off_t postsize; 1455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } backup; 1465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen enum { 1485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen HTTPSEND_NADA, /* init */ 1495ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen HTTPSEND_REQUEST, /* sending a request */ 1505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen HTTPSEND_BODY, /* sending body */ 1515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen HTTPSEND_LAST /* never use this */ 1525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } sending; 1535ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 1545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen void *send_buffer; /* used if the request couldn't be sent in one chunk, 1555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen points to an allocated send_buffer struct */ 156e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 157e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef USE_NGHTTP2 158e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /*********** for HTTP/2 we store stream-local data here *************/ 159e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET int32_t stream_id; /* stream we are interested in */ 160e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 161e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET bool bodystarted; 162e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* We store non-final and final response headers here, per-stream */ 163e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Curl_send_buffer *header_recvbuf; 164e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET size_t nread_header_recvbuf; /* number of bytes in header_recvbuf fed into 165e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET upper layer */ 166e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET int status_code; /* HTTP status code */ 167e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const uint8_t *pausedata; /* pointer to data received in on_data_chunk */ 168e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET size_t pauselen; /* the number of bytes left in data */ 169e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET bool closed; /* TRUE on HTTP2 stream close */ 170e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET uint32_t error_code; /* HTTP/2 error code */ 171e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 172e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET char *mem; /* points to a buffer in memory to store received data */ 173e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET size_t len; /* size of the buffer 'mem' points to */ 174e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET size_t memlen; /* size of data copied to mem */ 175e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 176e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const uint8_t *upload_mem; /* points to a buffer to read from */ 177e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET size_t upload_len; /* size of the buffer 'upload_mem' points to */ 178e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET curl_off_t upload_left; /* number of bytes left to upload */ 179e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 180e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}; 181e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 182e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETtypedef int (*sending)(void); /* Curl_send */ 183e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETtypedef int (*recving)(void); /* Curl_recv */ 184e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 185e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef USE_NGHTTP2 186e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* h2 settings for this connection */ 187e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETstruct h2settings { 188e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET uint32_t max_concurrent_streams; 189e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET bool enable_push; 190e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET}; 191e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 192e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 193e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 194e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETstruct http_conn { 195e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef USE_NGHTTP2 196e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define H2_BINSETTINGS_LEN 80 197e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET nghttp2_session *h2; 198e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET uint8_t binsettings[H2_BINSETTINGS_LEN]; 199e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET size_t binlen; /* length of the binsettings data */ 200e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET sending send_underlying; /* underlying send Curl_send callback */ 201e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET recving recv_underlying; /* underlying recv Curl_recv callback */ 202e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET char *inbuf; /* buffer to receive data from underlying socket */ 203e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET size_t inbuflen; /* number of bytes filled in inbuf */ 204e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET size_t nread_inbuf; /* number of bytes read from in inbuf */ 205e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* We need separate buffer for transmission and reception because we 206e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET may call nghttp2_session_send() after the 207e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET nghttp2_session_mem_recv() but mem buffer is still not full. In 208e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET this case, we wrongly sends the content of mem buffer if we share 209e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET them for both cases. */ 210e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET int32_t pause_stream_id; /* stream ID which paused 211e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET nghttp2_session_mem_recv */ 212e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 213e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* this is a hash of all individual streams (SessionHandle structs) */ 214e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct curl_hash streamsh; 215e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET struct h2settings settings; 216e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#else 217e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET int unused; /* prevent a compiler warning */ 218e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 2195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen}; 2205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 2215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian MonsenCURLcode Curl_http_readwrite_headers(struct SessionHandle *data, 2225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct connectdata *conn, 2235ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ssize_t *nread, 2245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen bool *stop_reading); 2255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 226e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/** 227e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Curl_http_output_auth() setups the authentication headers for the 228e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * host/proxy and the correct authentication 229e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * method. conn->data->state.authdone is set to TRUE when authentication is 230e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * done. 231e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 232e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * @param conn all information about the current connection 233e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * @param request pointer to the request keyword 234e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * @param path pointer to the requested path 235e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * @param proxytunnel boolean if this is the request setting up a "proxy 236e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * tunnel" 237e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 238e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * @returns CURLcode 239e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 240e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCURLcode 241e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETCurl_http_output_auth(struct connectdata *conn, 242e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const char *request, 243e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET const char *path, 244e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET bool proxytunnel); /* TRUE if this is the request setting 245e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET up the proxy tunnel */ 246e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 247e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif /* HEADER_CURL_HTTP_H */ 248e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 249