File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / lib / http.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:15 2020 UTC (5 years, 6 months ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    1: #ifndef HEADER_CURL_HTTP_H
    2: #define HEADER_CURL_HTTP_H
    3: /***************************************************************************
    4:  *                                  _   _ ____  _
    5:  *  Project                     ___| | | |  _ \| |
    6:  *                             / __| | | | |_) | |
    7:  *                            | (__| |_| |  _ <| |___
    8:  *                             \___|\___/|_| \_\_____|
    9:  *
   10:  * Copyright (C) 1998 - 2020, 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.haxx.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:  ***************************************************************************/
   24: #include "curl_setup.h"
   25: 
   26: #ifndef CURL_DISABLE_HTTP
   27: 
   28: #ifdef USE_NGHTTP2
   29: #include <nghttp2/nghttp2.h>
   30: #endif
   31: 
   32: extern const struct Curl_handler Curl_handler_http;
   33: 
   34: #ifdef USE_SSL
   35: extern const struct Curl_handler Curl_handler_https;
   36: #endif
   37: 
   38: /* Header specific functions */
   39: bool Curl_compareheader(const char *headerline,  /* line to check */
   40:                         const char *header,   /* header keyword _with_ colon */
   41:                         const char *content); /* content string to find */
   42: 
   43: char *Curl_copy_header_value(const char *header);
   44: 
   45: char *Curl_checkProxyheaders(const struct connectdata *conn,
   46:                              const char *thisheader);
   47: /* ------------------------------------------------------------------------- */
   48: /*
   49:  * The add_buffer series of functions are used to build one large memory chunk
   50:  * from repeated function invokes. Used so that the entire HTTP request can
   51:  * be sent in one go.
   52:  */
   53: struct Curl_send_buffer {
   54:   char *buffer;
   55:   size_t size_max;
   56:   size_t size_used;
   57: };
   58: typedef struct Curl_send_buffer Curl_send_buffer;
   59: 
   60: Curl_send_buffer *Curl_add_buffer_init(void);
   61: void Curl_add_buffer_free(Curl_send_buffer **inp);
   62: CURLcode Curl_add_bufferf(Curl_send_buffer **inp, const char *fmt, ...)
   63:   WARN_UNUSED_RESULT;
   64: CURLcode Curl_add_buffer(Curl_send_buffer **inp, const void *inptr,
   65:                          size_t size) WARN_UNUSED_RESULT;
   66: CURLcode Curl_add_buffer_send(Curl_send_buffer **inp,
   67:                               struct connectdata *conn,
   68:                               curl_off_t *bytes_written,
   69:                               size_t included_body_bytes,
   70:                               int socketindex);
   71: 
   72: CURLcode Curl_add_timecondition(const struct connectdata *conn,
   73:                                 Curl_send_buffer *buf);
   74: CURLcode Curl_add_custom_headers(struct connectdata *conn,
   75:                                  bool is_connect,
   76:                                  Curl_send_buffer *req_buffer);
   77: CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
   78:                                     Curl_send_buffer **buffer,
   79:                                     struct Curl_easy *handle);
   80: 
   81: /* protocol-specific functions set up to be called by the main engine */
   82: CURLcode Curl_http(struct connectdata *conn, bool *done);
   83: CURLcode Curl_http_done(struct connectdata *, CURLcode, bool premature);
   84: CURLcode Curl_http_connect(struct connectdata *conn, bool *done);
   85: 
   86: /* These functions are in http.c */
   87: CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy,
   88:                               const char *auth);
   89: CURLcode Curl_http_auth_act(struct connectdata *conn);
   90: 
   91: /* If only the PICKNONE bit is set, there has been a round-trip and we
   92:    selected to use no auth at all. Ie, we actively select no auth, as opposed
   93:    to not having one selected. The other CURLAUTH_* defines are present in the
   94:    public curl/curl.h header. */
   95: #define CURLAUTH_PICKNONE (1<<30) /* don't use auth */
   96: 
   97: /* MAX_INITIAL_POST_SIZE indicates the number of bytes that will make the POST
   98:    data get included in the initial data chunk sent to the server. If the
   99:    data is larger than this, it will automatically get split up in multiple
  100:    system calls.
  101: 
  102:    This value used to be fairly big (100K), but we must take into account that
  103:    if the server rejects the POST due for authentication reasons, this data
  104:    will always be unconditionally sent and thus it may not be larger than can
  105:    always be afforded to send twice.
  106: 
  107:    It must not be greater than 64K to work on VMS.
  108: */
  109: #ifndef MAX_INITIAL_POST_SIZE
  110: #define MAX_INITIAL_POST_SIZE (64*1024)
  111: #endif
  112: 
  113: /* EXPECT_100_THRESHOLD is the request body size limit for when libcurl will
  114:  * automatically add an "Expect: 100-continue" header in HTTP requests. When
  115:  * the size is unknown, it will always add it.
  116:  *
  117:  */
  118: #ifndef EXPECT_100_THRESHOLD
  119: #define EXPECT_100_THRESHOLD (1024*1024)
  120: #endif
  121: 
  122: #endif /* CURL_DISABLE_HTTP */
  123: 
  124: #ifdef USE_NGHTTP3
  125: struct h3out; /* see ngtcp2 */
  126: #endif
  127: 
  128: /****************************************************************************
  129:  * HTTP unique setup
  130:  ***************************************************************************/
  131: struct HTTP {
  132:   curl_mimepart *sendit;
  133:   curl_off_t postsize; /* off_t to handle large file sizes */
  134:   const char *postdata;
  135: 
  136:   const char *p_pragma;      /* Pragma: string */
  137:   const char *p_accept;      /* Accept: string */
  138: 
  139:   /* For FORM posting */
  140:   curl_mimepart form;
  141: 
  142:   struct back {
  143:     curl_read_callback fread_func; /* backup storage for fread pointer */
  144:     void *fread_in;           /* backup storage for fread_in pointer */
  145:     const char *postdata;
  146:     curl_off_t postsize;
  147:   } backup;
  148: 
  149:   enum {
  150:     HTTPSEND_NADA,    /* init */
  151:     HTTPSEND_REQUEST, /* sending a request */
  152:     HTTPSEND_BODY,    /* sending body */
  153:     HTTPSEND_LAST     /* never use this */
  154:   } sending;
  155: 
  156: #ifndef CURL_DISABLE_HTTP
  157:   Curl_send_buffer *send_buffer; /* used if the request couldn't be sent in
  158:                                     one chunk, points to an allocated
  159:                                     send_buffer struct */
  160: #endif
  161: #ifdef USE_NGHTTP2
  162:   /*********** for HTTP/2 we store stream-local data here *************/
  163:   int32_t stream_id; /* stream we are interested in */
  164: 
  165:   bool bodystarted;
  166:   /* We store non-final and final response headers here, per-stream */
  167:   Curl_send_buffer *header_recvbuf;
  168:   size_t nread_header_recvbuf; /* number of bytes in header_recvbuf fed into
  169:                                   upper layer */
  170:   Curl_send_buffer *trailer_recvbuf;
  171:   int status_code; /* HTTP status code */
  172:   const uint8_t *pausedata; /* pointer to data received in on_data_chunk */
  173:   size_t pauselen; /* the number of bytes left in data */
  174:   bool close_handled; /* TRUE if stream closure is handled by libcurl */
  175: 
  176:   char **push_headers;       /* allocated array */
  177:   size_t push_headers_used;  /* number of entries filled in */
  178:   size_t push_headers_alloc; /* number of entries allocated */
  179: #endif
  180: #if defined(USE_NGHTTP2) || defined(USE_NGHTTP3)
  181:   bool closed; /* TRUE on HTTP2 stream close */
  182:   char *mem;     /* points to a buffer in memory to store received data */
  183:   size_t len;    /* size of the buffer 'mem' points to */
  184:   size_t memlen; /* size of data copied to mem */
  185: #endif
  186: #if defined(USE_NGHTTP2) || defined(ENABLE_QUIC)
  187:   /* fields used by both HTTP/2 and HTTP/3 */
  188:   const uint8_t *upload_mem; /* points to a buffer to read from */
  189:   size_t upload_len; /* size of the buffer 'upload_mem' points to */
  190:   curl_off_t upload_left; /* number of bytes left to upload */
  191: #endif
  192: 
  193: #ifdef ENABLE_QUIC
  194:   /*********** for HTTP/3 we store stream-local data here *************/
  195:   int64_t stream3_id; /* stream we are interested in */
  196:   bool firstheader;  /* FALSE until headers arrive */
  197:   bool firstbody;  /* FALSE until body arrives */
  198:   bool h3req;    /* FALSE until request is issued */
  199:   bool upload_done;
  200: #endif
  201: #ifdef USE_NGHTTP3
  202:   size_t unacked_window;
  203:   struct h3out *h3out; /* per-stream buffers for upload */
  204:   char *overflow_buf; /* excess data received during a single Curl_read */
  205:   size_t overflow_buflen; /* amount of data currently in overflow_buf */
  206:   size_t overflow_bufsize; /* size of the overflow_buf allocation */
  207: #endif
  208: };
  209: 
  210: #ifdef USE_NGHTTP2
  211: /* h2 settings for this connection */
  212: struct h2settings {
  213:   uint32_t max_concurrent_streams;
  214:   bool enable_push;
  215: };
  216: #endif
  217: 
  218: struct http_conn {
  219: #ifdef USE_NGHTTP2
  220: #define H2_BINSETTINGS_LEN 80
  221:   nghttp2_session *h2;
  222:   uint8_t binsettings[H2_BINSETTINGS_LEN];
  223:   size_t  binlen; /* length of the binsettings data */
  224:   Curl_send *send_underlying; /* underlying send Curl_send callback */
  225:   Curl_recv *recv_underlying; /* underlying recv Curl_recv callback */
  226:   char *inbuf; /* buffer to receive data from underlying socket */
  227:   size_t inbuflen; /* number of bytes filled in inbuf */
  228:   size_t nread_inbuf; /* number of bytes read from in inbuf */
  229:   /* We need separate buffer for transmission and reception because we
  230:      may call nghttp2_session_send() after the
  231:      nghttp2_session_mem_recv() but mem buffer is still not full. In
  232:      this case, we wrongly sends the content of mem buffer if we share
  233:      them for both cases. */
  234:   int32_t pause_stream_id; /* stream ID which paused
  235:                               nghttp2_session_mem_recv */
  236:   size_t drain_total; /* sum of all stream's UrlState.drain */
  237: 
  238:   /* this is a hash of all individual streams (Curl_easy structs) */
  239:   struct h2settings settings;
  240: 
  241:   /* list of settings that will be sent */
  242:   nghttp2_settings_entry local_settings[3];
  243:   size_t local_settings_num;
  244:   uint32_t error_code; /* HTTP/2 error code */
  245: #else
  246:   int unused; /* prevent a compiler warning */
  247: #endif
  248: };
  249: 
  250: CURLcode Curl_http_readwrite_headers(struct Curl_easy *data,
  251:                                      struct connectdata *conn,
  252:                                      ssize_t *nread,
  253:                                      bool *stop_reading);
  254: 
  255: /**
  256:  * Curl_http_output_auth() setups the authentication headers for the
  257:  * host/proxy and the correct authentication
  258:  * method. conn->data->state.authdone is set to TRUE when authentication is
  259:  * done.
  260:  *
  261:  * @param conn all information about the current connection
  262:  * @param request pointer to the request keyword
  263:  * @param path pointer to the requested path
  264:  * @param proxytunnel boolean if this is the request setting up a "proxy
  265:  * tunnel"
  266:  *
  267:  * @returns CURLcode
  268:  */
  269: CURLcode
  270: Curl_http_output_auth(struct connectdata *conn,
  271:                       const char *request,
  272:                       const char *path,
  273:                       bool proxytunnel); /* TRUE if this is the request setting
  274:                                             up the proxy tunnel */
  275: 
  276: #endif /* HEADER_CURL_HTTP_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>