src/http/ngx_http_request.h - nginx

Data types defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #ifndef _NGX_HTTP_REQUEST_H_INCLUDED_
  6. #define _NGX_HTTP_REQUEST_H_INCLUDED_


  7. #define NGX_HTTP_MAX_URI_CHANGES           10
  8. #define NGX_HTTP_MAX_SUBREQUESTS           50

  9. /* must be 2^n */
  10. #define NGX_HTTP_LC_HEADER_LEN             32


  11. #define NGX_HTTP_DISCARD_BUFFER_SIZE       4096
  12. #define NGX_HTTP_LINGERING_BUFFER_SIZE     4096


  13. #define NGX_HTTP_VERSION_9                 9
  14. #define NGX_HTTP_VERSION_10                1000
  15. #define NGX_HTTP_VERSION_11                1001
  16. #define NGX_HTTP_VERSION_20                2000
  17. #define NGX_HTTP_VERSION_30                3000

  18. #define NGX_HTTP_UNKNOWN                   0x00000001
  19. #define NGX_HTTP_GET                       0x00000002
  20. #define NGX_HTTP_HEAD                      0x00000004
  21. #define NGX_HTTP_POST                      0x00000008
  22. #define NGX_HTTP_PUT                       0x00000010
  23. #define NGX_HTTP_DELETE                    0x00000020
  24. #define NGX_HTTP_MKCOL                     0x00000040
  25. #define NGX_HTTP_COPY                      0x00000080
  26. #define NGX_HTTP_MOVE                      0x00000100
  27. #define NGX_HTTP_OPTIONS                   0x00000200
  28. #define NGX_HTTP_PROPFIND                  0x00000400
  29. #define NGX_HTTP_PROPPATCH                 0x00000800
  30. #define NGX_HTTP_LOCK                      0x00001000
  31. #define NGX_HTTP_UNLOCK                    0x00002000
  32. #define NGX_HTTP_PATCH                     0x00004000
  33. #define NGX_HTTP_TRACE                     0x00008000
  34. #define NGX_HTTP_CONNECT                   0x00010000

  35. #define NGX_HTTP_CONNECTION_CLOSE          1
  36. #define NGX_HTTP_CONNECTION_KEEP_ALIVE     2


  37. #define NGX_NONE                           1


  38. #define NGX_HTTP_PARSE_HEADER_DONE         1

  39. #define NGX_HTTP_CLIENT_ERROR              10
  40. #define NGX_HTTP_PARSE_INVALID_METHOD      10
  41. #define NGX_HTTP_PARSE_INVALID_REQUEST     11
  42. #define NGX_HTTP_PARSE_INVALID_VERSION     12
  43. #define NGX_HTTP_PARSE_INVALID_09_METHOD   13

  44. #define NGX_HTTP_PARSE_INVALID_HEADER      14


  45. /* unused                                  1 */
  46. #define NGX_HTTP_SUBREQUEST_IN_MEMORY      2
  47. #define NGX_HTTP_SUBREQUEST_WAITED         4
  48. #define NGX_HTTP_SUBREQUEST_CLONE          8
  49. #define NGX_HTTP_SUBREQUEST_BACKGROUND     16

  50. #define NGX_HTTP_LOG_UNSAFE                1


  51. #define NGX_HTTP_CONTINUE                  100
  52. #define NGX_HTTP_SWITCHING_PROTOCOLS       101
  53. #define NGX_HTTP_PROCESSING                102
  54. #define NGX_HTTP_EARLY_HINTS               103

  55. #define NGX_HTTP_OK                        200
  56. #define NGX_HTTP_CREATED                   201
  57. #define NGX_HTTP_ACCEPTED                  202
  58. #define NGX_HTTP_NO_CONTENT                204
  59. #define NGX_HTTP_PARTIAL_CONTENT           206

  60. #define NGX_HTTP_SPECIAL_RESPONSE          300
  61. #define NGX_HTTP_MOVED_PERMANENTLY         301
  62. #define NGX_HTTP_MOVED_TEMPORARILY         302
  63. #define NGX_HTTP_SEE_OTHER                 303
  64. #define NGX_HTTP_NOT_MODIFIED              304
  65. #define NGX_HTTP_TEMPORARY_REDIRECT        307
  66. #define NGX_HTTP_PERMANENT_REDIRECT        308

  67. #define NGX_HTTP_BAD_REQUEST               400
  68. #define NGX_HTTP_UNAUTHORIZED              401
  69. #define NGX_HTTP_FORBIDDEN                 403
  70. #define NGX_HTTP_NOT_FOUND                 404
  71. #define NGX_HTTP_NOT_ALLOWED               405
  72. #define NGX_HTTP_PROXY_AUTH_REQUIRED       407
  73. #define NGX_HTTP_REQUEST_TIME_OUT          408
  74. #define NGX_HTTP_CONFLICT                  409
  75. #define NGX_HTTP_LENGTH_REQUIRED           411
  76. #define NGX_HTTP_PRECONDITION_FAILED       412
  77. #define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE  413
  78. #define NGX_HTTP_REQUEST_URI_TOO_LARGE     414
  79. #define NGX_HTTP_UNSUPPORTED_MEDIA_TYPE    415
  80. #define NGX_HTTP_RANGE_NOT_SATISFIABLE     416
  81. #define NGX_HTTP_MISDIRECTED_REQUEST       421
  82. #define NGX_HTTP_TOO_MANY_REQUESTS         429


  83. /* Our own HTTP codes */

  84. /* The special code to close connection without any response */
  85. #define NGX_HTTP_CLOSE                     444

  86. #define NGX_HTTP_NGINX_CODES               494

  87. #define NGX_HTTP_REQUEST_HEADER_TOO_LARGE  494

  88. #define NGX_HTTPS_CERT_ERROR               495
  89. #define NGX_HTTPS_NO_CERT                  496

  90. /*
  91. * We use the special code for the plain HTTP requests that are sent to
  92. * HTTPS port to distinguish it from 4XX in an error page redirection
  93. */
  94. #define NGX_HTTP_TO_HTTPS                  497

  95. /* 498 is the canceled code for the requests with invalid host name */

  96. /*
  97. * HTTP does not define the code for the case when a client closed
  98. * the connection while we are processing its request so we introduce
  99. * own code to log such situation when a client has closed the connection
  100. * before we even try to send the HTTP header to it
  101. */
  102. #define NGX_HTTP_CLIENT_CLOSED_REQUEST     499


  103. #define NGX_HTTP_INTERNAL_SERVER_ERROR     500
  104. #define NGX_HTTP_NOT_IMPLEMENTED           501
  105. #define NGX_HTTP_BAD_GATEWAY               502
  106. #define NGX_HTTP_SERVICE_UNAVAILABLE       503
  107. #define NGX_HTTP_GATEWAY_TIME_OUT          504
  108. #define NGX_HTTP_VERSION_NOT_SUPPORTED     505
  109. #define NGX_HTTP_INSUFFICIENT_STORAGE      507


  110. #define NGX_HTTP_LOWLEVEL_BUFFERED         0xf0
  111. #define NGX_HTTP_WRITE_BUFFERED            0x10
  112. #define NGX_HTTP_GZIP_BUFFERED             0x20
  113. #define NGX_HTTP_SSI_BUFFERED              0x01
  114. #define NGX_HTTP_SUB_BUFFERED              0x02
  115. #define NGX_HTTP_COPY_BUFFERED             0x04


  116. typedef enum {
  117.     NGX_HTTP_INITING_REQUEST_STATE = 0,
  118.     NGX_HTTP_READING_REQUEST_STATE,
  119.     NGX_HTTP_PROCESS_REQUEST_STATE,

  120.     NGX_HTTP_CONNECT_UPSTREAM_STATE,
  121.     NGX_HTTP_WRITING_UPSTREAM_STATE,
  122.     NGX_HTTP_READING_UPSTREAM_STATE,

  123.     NGX_HTTP_WRITING_REQUEST_STATE,
  124.     NGX_HTTP_LINGERING_CLOSE_STATE,
  125.     NGX_HTTP_KEEPALIVE_STATE
  126. } ngx_http_state_e;


  127. typedef struct {
  128.     ngx_str_t                         name;
  129.     ngx_uint_t                        offset;
  130.     ngx_http_header_handler_pt        handler;
  131. } ngx_http_header_t;


  132. typedef struct {
  133.     ngx_str_t                         name;
  134.     ngx_uint_t                        offset;
  135. } ngx_http_header_out_t;


  136. typedef struct {
  137.     ngx_list_t                        headers;
  138.     ngx_uint_t                        count;

  139.     ngx_table_elt_t                  *host;
  140.     ngx_table_elt_t                  *connection;
  141.     ngx_table_elt_t                  *if_modified_since;
  142.     ngx_table_elt_t                  *if_unmodified_since;
  143.     ngx_table_elt_t                  *if_match;
  144.     ngx_table_elt_t                  *if_none_match;
  145.     ngx_table_elt_t                  *user_agent;
  146.     ngx_table_elt_t                  *referer;
  147.     ngx_table_elt_t                  *content_length;
  148.     ngx_table_elt_t                  *content_range;
  149.     ngx_table_elt_t                  *content_type;

  150.     ngx_table_elt_t                  *range;
  151.     ngx_table_elt_t                  *if_range;

  152.     ngx_table_elt_t                  *transfer_encoding;
  153.     ngx_table_elt_t                  *te;
  154.     ngx_table_elt_t                  *expect;
  155.     ngx_table_elt_t                  *upgrade;

  156. #if (NGX_HTTP_GZIP || NGX_HTTP_HEADERS)
  157.     ngx_table_elt_t                  *accept_encoding;
  158.     ngx_table_elt_t                  *via;
  159. #endif

  160.     ngx_table_elt_t                  *authorization;
  161.     ngx_table_elt_t                  *proxy_authorization;

  162.     ngx_table_elt_t                  *keep_alive;

  163. #if (NGX_HTTP_X_FORWARDED_FOR)
  164.     ngx_table_elt_t                  *x_forwarded_for;
  165. #endif

  166. #if (NGX_HTTP_REALIP)
  167.     ngx_table_elt_t                  *x_real_ip;
  168. #endif

  169. #if (NGX_HTTP_HEADERS)
  170.     ngx_table_elt_t                  *accept;
  171.     ngx_table_elt_t                  *accept_language;
  172. #endif

  173. #if (NGX_HTTP_DAV)
  174.     ngx_table_elt_t                  *depth;
  175.     ngx_table_elt_t                  *destination;
  176.     ngx_table_elt_t                  *overwrite;
  177.     ngx_table_elt_t                  *date;
  178. #endif

  179.     ngx_table_elt_t                  *cookie;

  180.     ngx_str_t                         user;
  181.     ngx_str_t                         passwd;

  182.     ngx_str_t                         server;
  183.     off_t                             content_length_n;
  184.     time_t                            keep_alive_n;

  185.     unsigned                          connection_type:2;
  186.     unsigned                          chunked:1;
  187.     unsigned                          multi:1;
  188.     unsigned                          multi_linked:1;
  189.     unsigned                          msie:1;
  190.     unsigned                          msie6:1;
  191.     unsigned                          opera:1;
  192.     unsigned                          gecko:1;
  193.     unsigned                          chrome:1;
  194.     unsigned                          safari:1;
  195.     unsigned                          konqueror:1;
  196. } ngx_http_headers_in_t;


  197. typedef struct {
  198.     ngx_list_t                        headers;
  199.     ngx_list_t                        trailers;

  200.     ngx_uint_t                        status;
  201.     ngx_str_t                         status_line;

  202.     ngx_table_elt_t                  *server;
  203.     ngx_table_elt_t                  *date;
  204.     ngx_table_elt_t                  *content_length;
  205.     ngx_table_elt_t                  *content_encoding;
  206.     ngx_table_elt_t                  *location;
  207.     ngx_table_elt_t                  *refresh;
  208.     ngx_table_elt_t                  *last_modified;
  209.     ngx_table_elt_t                  *content_range;
  210.     ngx_table_elt_t                  *accept_ranges;
  211.     ngx_table_elt_t                  *www_authenticate;
  212.     ngx_table_elt_t                  *proxy_authenticate;
  213.     ngx_table_elt_t                  *expires;
  214.     ngx_table_elt_t                  *etag;

  215.     ngx_table_elt_t                  *cache_control;
  216.     ngx_table_elt_t                  *link;

  217.     ngx_str_t                        *override_charset;

  218.     size_t                            content_type_len;
  219.     ngx_str_t                         content_type;
  220.     ngx_str_t                         charset;
  221.     u_char                           *content_type_lowcase;
  222.     ngx_uint_t                        content_type_hash;

  223.     off_t                             content_length_n;
  224.     off_t                             content_offset;
  225.     time_t                            date_time;
  226.     time_t                            last_modified_time;
  227. } ngx_http_headers_out_t;


  228. typedef void (*ngx_http_client_body_handler_pt)(ngx_http_request_t *r);

  229. typedef struct {
  230.     ngx_temp_file_t                  *temp_file;
  231.     ngx_chain_t                      *bufs;
  232.     ngx_buf_t                        *buf;
  233.     off_t                             rest;
  234.     off_t                             received;
  235.     ngx_chain_t                      *free;
  236.     ngx_chain_t                      *busy;
  237.     ngx_http_chunked_t               *chunked;
  238.     ngx_http_client_body_handler_pt   post_handler;
  239.     unsigned                          filter_need_buffering:1;
  240.     unsigned                          last_sent:1;
  241.     unsigned                          last_saved:1;
  242. } ngx_http_request_body_t;


  243. typedef struct ngx_http_addr_conf_s  ngx_http_addr_conf_t;

  244. typedef struct {
  245.     ngx_http_addr_conf_t             *addr_conf;
  246.     ngx_http_conf_ctx_t              *conf_ctx;

  247. #if (NGX_HTTP_SSL || NGX_COMPAT)
  248.     ngx_str_t                        *ssl_servername;
  249. #if (NGX_PCRE)
  250.     ngx_http_regex_t                 *ssl_servername_regex;
  251. #endif
  252. #endif

  253.     ngx_chain_t                      *busy;
  254.     ngx_int_t                         nbusy;

  255.     ngx_chain_t                      *free;

  256.     ngx_msec_t                        keepalive_timeout;

  257.     unsigned                          ssl:1;
  258.     unsigned                          proxy_protocol:1;
  259. } ngx_http_connection_t;


  260. typedef void (*ngx_http_cleanup_pt)(void *data);

  261. typedef struct ngx_http_cleanup_s  ngx_http_cleanup_t;

  262. struct ngx_http_cleanup_s {
  263.     ngx_http_cleanup_pt               handler;
  264.     void                             *data;
  265.     ngx_http_cleanup_t               *next;
  266. };


  267. typedef ngx_int_t (*ngx_http_post_subrequest_pt)(ngx_http_request_t *r,
  268.     void *data, ngx_int_t rc);

  269. typedef struct {
  270.     ngx_http_post_subrequest_pt       handler;
  271.     void                             *data;
  272. } ngx_http_post_subrequest_t;


  273. typedef struct ngx_http_postponed_request_s  ngx_http_postponed_request_t;

  274. struct ngx_http_postponed_request_s {
  275.     ngx_http_request_t               *request;
  276.     ngx_chain_t                      *out;
  277.     ngx_http_postponed_request_t     *next;
  278. };


  279. typedef struct ngx_http_posted_request_s  ngx_http_posted_request_t;

  280. struct ngx_http_posted_request_s {
  281.     ngx_http_request_t               *request;
  282.     ngx_http_posted_request_t        *next;
  283. };


  284. typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);
  285. typedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r);


  286. struct ngx_http_request_s {
  287.     uint32_t                          signature;         /* "HTTP" */

  288.     ngx_connection_t                 *connection;

  289.     void                            **ctx;
  290.     void                            **main_conf;
  291.     void                            **srv_conf;
  292.     void                            **loc_conf;

  293.     ngx_http_event_handler_pt         read_event_handler;
  294.     ngx_http_event_handler_pt         write_event_handler;

  295. #if (NGX_HTTP_CACHE)
  296.     ngx_http_cache_t                 *cache;
  297. #endif

  298.     ngx_http_upstream_t              *upstream;
  299.     ngx_array_t                      *upstream_states;
  300.                                          /* of ngx_http_upstream_state_t */

  301.     ngx_pool_t                       *pool;
  302.     ngx_buf_t                        *header_in;

  303.     ngx_http_headers_in_t             headers_in;
  304.     ngx_http_headers_out_t            headers_out;

  305.     ngx_http_request_body_t          *request_body;

  306.     time_t                            lingering_time;
  307.     time_t                            start_sec;
  308.     ngx_msec_t                        start_msec;

  309.     ngx_uint_t                        method;
  310.     ngx_uint_t                        http_version;

  311.     ngx_str_t                         request_line;
  312.     ngx_str_t                         uri;
  313.     ngx_str_t                         args;
  314.     ngx_str_t                         exten;
  315.     ngx_str_t                         unparsed_uri;

  316.     ngx_str_t                         method_name;
  317.     ngx_str_t                         http_protocol;
  318.     ngx_str_t                         schema;

  319.     ngx_chain_t                      *out;
  320.     ngx_http_request_t               *main;
  321.     ngx_http_request_t               *parent;
  322.     ngx_http_postponed_request_t     *postponed;
  323.     ngx_http_post_subrequest_t       *post_subrequest;
  324.     ngx_http_posted_request_t        *posted_requests;

  325.     ngx_int_t                         phase_handler;
  326.     ngx_http_handler_pt               content_handler;
  327.     ngx_uint_t                        access_code;

  328.     ngx_http_variable_value_t        *variables;

  329. #if (NGX_PCRE)
  330.     ngx_uint_t                        ncaptures;
  331.     int                              *captures;
  332.     u_char                           *captures_data;
  333. #endif

  334.     size_t                            limit_rate;
  335.     size_t                            limit_rate_after;

  336.     /* used to learn the Apache compatible response length without a header */
  337.     size_t                            header_size;

  338.     off_t                             request_length;

  339.     ngx_uint_t                        err_status;

  340.     ngx_http_connection_t            *http_connection;
  341.     ngx_http_v2_stream_t             *stream;
  342.     ngx_http_v3_parse_t              *v3_parse;

  343.     ngx_http_log_handler_pt           log_handler;

  344.     ngx_http_cleanup_t               *cleanup;

  345.     in_port_t                         port;

  346.     unsigned                          count:16;
  347.     unsigned                          subrequests:8;
  348.     unsigned                          blocked:8;

  349.     unsigned                          aio:1;

  350.     unsigned                          http_state:4;

  351.     /* URI with "/." and on Win32 with "//" */
  352.     unsigned                          complex_uri:1;

  353.     /* URI with "%" */
  354.     unsigned                          quoted_uri:1;

  355.     /* URI with "+" */
  356.     unsigned                          plus_in_uri:1;

  357.     /* URI with empty path */
  358.     unsigned                          empty_path_in_uri:1;

  359.     unsigned                          invalid_header:1;

  360.     unsigned                          add_uri_to_alias:1;
  361.     unsigned                          valid_location:1;
  362.     unsigned                          valid_unparsed_uri:1;
  363.     unsigned                          uri_changed:1;
  364.     unsigned                          uri_changes:4;

  365.     unsigned                          request_body_in_single_buf:1;
  366.     unsigned                          request_body_in_file_only:1;
  367.     unsigned                          request_body_in_persistent_file:1;
  368.     unsigned                          request_body_in_clean_file:1;
  369.     unsigned                          request_body_file_group_access:1;
  370.     unsigned                          request_body_file_log_level:3;
  371.     unsigned                          request_body_no_buffering:1;

  372.     unsigned                          subrequest_in_memory:1;
  373.     unsigned                          waited:1;

  374. #if (NGX_HTTP_CACHE)
  375.     unsigned                          cached:1;
  376. #endif

  377. #if (NGX_HTTP_GZIP)
  378.     unsigned                          gzip_tested:1;
  379.     unsigned                          gzip_ok:1;
  380.     unsigned                          gzip_vary:1;
  381. #endif

  382. #if (NGX_PCRE)
  383.     unsigned                          realloc_captures:1;
  384. #endif

  385.     unsigned                          proxy:1;
  386.     unsigned                          bypass_cache:1;
  387.     unsigned                          no_cache:1;

  388.     /*
  389.      * instead of using the request context data in
  390.      * ngx_http_limit_conn_module and ngx_http_limit_req_module
  391.      * we use the bit fields in the request structure
  392.      */
  393.     unsigned                          limit_conn_status:2;
  394.     unsigned                          limit_req_status:3;

  395.     unsigned                          limit_rate_set:1;
  396.     unsigned                          limit_rate_after_set:1;

  397. #if 0
  398.     unsigned                          cacheable:1;
  399. #endif

  400.     unsigned                          pipeline:1;
  401.     unsigned                          chunked:1;
  402.     unsigned                          header_only:1;
  403.     unsigned                          expect_trailers:1;
  404.     unsigned                          keepalive:1;
  405.     unsigned                          lingering_close:1;
  406.     unsigned                          discard_body:1;
  407.     unsigned                          reading_body:1;
  408.     unsigned                          internal:1;
  409.     unsigned                          error_page:1;
  410.     unsigned                          filter_finalize:1;
  411.     unsigned                          post_action:1;
  412.     unsigned                          request_complete:1;
  413.     unsigned                          request_output:1;
  414.     unsigned                          header_sent:1;
  415.     unsigned                          response_sent:1;
  416.     unsigned                          expect_tested:1;
  417.     unsigned                          root_tested:1;
  418.     unsigned                          done:1;
  419.     unsigned                          logged:1;
  420.     unsigned                          terminated:1;

  421.     unsigned                          buffered:4;

  422.     unsigned                          main_filter_need_in_memory:1;
  423.     unsigned                          filter_need_in_memory:1;
  424.     unsigned                          filter_need_temporary:1;
  425.     unsigned                          preserve_body:1;
  426.     unsigned                          allow_ranges:1;
  427.     unsigned                          subrequest_ranges:1;
  428.     unsigned                          single_range:1;
  429.     unsigned                          disable_not_modified:1;
  430.     unsigned                          stat_reading:1;
  431.     unsigned                          stat_writing:1;
  432.     unsigned                          stat_processing:1;

  433.     unsigned                          background:1;
  434.     unsigned                          health_check:1;

  435.     /* used to parse HTTP headers */

  436.     ngx_uint_t                        state;

  437.     ngx_uint_t                        header_hash;
  438.     ngx_uint_t                        lowcase_index;
  439.     u_char                            lowcase_header[NGX_HTTP_LC_HEADER_LEN];

  440.     u_char                           *header_name_start;
  441.     u_char                           *header_name_end;
  442.     u_char                           *header_start;
  443.     u_char                           *header_end;

  444.     /*
  445.      * a memory that can be reused after parsing a request line
  446.      * via ngx_http_ephemeral_t
  447.      */

  448.     u_char                           *uri_start;
  449.     u_char                           *uri_end;
  450.     u_char                           *uri_ext;
  451.     u_char                           *args_start;
  452.     u_char                           *request_start;
  453.     u_char                           *request_end;
  454.     u_char                           *method_end;
  455.     u_char                           *schema_start;
  456.     u_char                           *schema_end;
  457.     u_char                           *host_start;
  458.     u_char                           *host_end;

  459.     unsigned                          http_minor:16;
  460.     unsigned                          http_major:16;
  461. };


  462. typedef struct {
  463.     ngx_http_posted_request_t         terminal_posted_request;
  464. } ngx_http_ephemeral_t;


  465. #define ngx_http_ephemeral(r)   (void *) (&r->uri_start)

  466. #define ngx_http_proxy_auth(r)  ((r)->method == NGX_HTTP_CONNECT)


  467. extern ngx_http_header_t       ngx_http_headers_in[];
  468. extern ngx_http_header_out_t   ngx_http_headers_out[];


  469. #define ngx_http_set_log_request(log, r)                                      \
  470.     ((ngx_http_log_ctx_t *) log->data)->current_request = r


  471. #endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */