src/http/ngx_http_request.h - nginx source code

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_OK                        200
  55. #define NGX_HTTP_CREATED                   201
  56. #define NGX_HTTP_ACCEPTED                  202
  57. #define NGX_HTTP_NO_CONTENT                204
  58. #define NGX_HTTP_PARTIAL_CONTENT           206

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

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


  81. /* Our own HTTP codes */

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

  84. #define NGX_HTTP_NGINX_CODES               494

  85. #define NGX_HTTP_REQUEST_HEADER_TOO_LARGE  494

  86. #define NGX_HTTPS_CERT_ERROR               495
  87. #define NGX_HTTPS_NO_CERT                  496

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

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

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


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


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


  114. typedef enum {
  115.     NGX_HTTP_INITING_REQUEST_STATE = 0,
  116.     NGX_HTTP_READING_REQUEST_STATE,
  117.     NGX_HTTP_PROCESS_REQUEST_STATE,

  118.     NGX_HTTP_CONNECT_UPSTREAM_STATE,
  119.     NGX_HTTP_WRITING_UPSTREAM_STATE,
  120.     NGX_HTTP_READING_UPSTREAM_STATE,

  121.     NGX_HTTP_WRITING_REQUEST_STATE,
  122.     NGX_HTTP_LINGERING_CLOSE_STATE,
  123.     NGX_HTTP_KEEPALIVE_STATE
  124. } ngx_http_state_e;


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


  130. typedef struct {
  131.     ngx_str_t                         name;
  132.     ngx_uint_t                        offset;
  133. } ngx_http_header_out_t;


  134. typedef struct {
  135.     ngx_list_t                        headers;

  136.     ngx_table_elt_t                  *host;
  137.     ngx_table_elt_t                  *connection;
  138.     ngx_table_elt_t                  *if_modified_since;
  139.     ngx_table_elt_t                  *if_unmodified_since;
  140.     ngx_table_elt_t                  *if_match;
  141.     ngx_table_elt_t                  *if_none_match;
  142.     ngx_table_elt_t                  *user_agent;
  143.     ngx_table_elt_t                  *referer;
  144.     ngx_table_elt_t                  *content_length;
  145.     ngx_table_elt_t                  *content_range;
  146.     ngx_table_elt_t                  *content_type;

  147.     ngx_table_elt_t                  *range;
  148.     ngx_table_elt_t                  *if_range;

  149.     ngx_table_elt_t                  *transfer_encoding;
  150.     ngx_table_elt_t                  *te;
  151.     ngx_table_elt_t                  *expect;
  152.     ngx_table_elt_t                  *upgrade;

  153. #if (NGX_HTTP_GZIP || NGX_HTTP_HEADERS)
  154.     ngx_table_elt_t                  *accept_encoding;
  155.     ngx_table_elt_t                  *via;
  156. #endif

  157.     ngx_table_elt_t                  *authorization;

  158.     ngx_table_elt_t                  *keep_alive;

  159. #if (NGX_HTTP_X_FORWARDED_FOR)
  160.     ngx_table_elt_t                  *x_forwarded_for;
  161. #endif

  162. #if (NGX_HTTP_REALIP)
  163.     ngx_table_elt_t                  *x_real_ip;
  164. #endif

  165. #if (NGX_HTTP_HEADERS)
  166.     ngx_table_elt_t                  *accept;
  167.     ngx_table_elt_t                  *accept_language;
  168. #endif

  169. #if (NGX_HTTP_DAV)
  170.     ngx_table_elt_t                  *depth;
  171.     ngx_table_elt_t                  *destination;
  172.     ngx_table_elt_t                  *overwrite;
  173.     ngx_table_elt_t                  *date;
  174. #endif

  175.     ngx_table_elt_t                  *cookie;

  176.     ngx_str_t                         user;
  177.     ngx_str_t                         passwd;

  178.     ngx_str_t                         server;
  179.     off_t                             content_length_n;
  180.     time_t                            keep_alive_n;

  181.     unsigned                          connection_type:2;
  182.     unsigned                          chunked:1;
  183.     unsigned                          multi:1;
  184.     unsigned                          multi_linked:1;
  185.     unsigned                          msie:1;
  186.     unsigned                          msie6:1;
  187.     unsigned                          opera:1;
  188.     unsigned                          gecko:1;
  189.     unsigned                          chrome:1;
  190.     unsigned                          safari:1;
  191.     unsigned                          konqueror:1;
  192. } ngx_http_headers_in_t;


  193. typedef struct {
  194.     ngx_list_t                        headers;
  195.     ngx_list_t                        trailers;

  196.     ngx_uint_t                        status;
  197.     ngx_str_t                         status_line;

  198.     ngx_table_elt_t                  *server;
  199.     ngx_table_elt_t                  *date;
  200.     ngx_table_elt_t                  *content_length;
  201.     ngx_table_elt_t                  *content_encoding;
  202.     ngx_table_elt_t                  *location;
  203.     ngx_table_elt_t                  *refresh;
  204.     ngx_table_elt_t                  *last_modified;
  205.     ngx_table_elt_t                  *content_range;
  206.     ngx_table_elt_t                  *accept_ranges;
  207.     ngx_table_elt_t                  *www_authenticate;
  208.     ngx_table_elt_t                  *expires;
  209.     ngx_table_elt_t                  *etag;

  210.     ngx_table_elt_t                  *cache_control;
  211.     ngx_table_elt_t                  *link;

  212.     ngx_str_t                        *override_charset;

  213.     size_t                            content_type_len;
  214.     ngx_str_t                         content_type;
  215.     ngx_str_t                         charset;
  216.     u_char                           *content_type_lowcase;
  217.     ngx_uint_t                        content_type_hash;

  218.     off_t                             content_length_n;
  219.     off_t                             content_offset;
  220.     time_t                            date_time;
  221.     time_t                            last_modified_time;
  222. } ngx_http_headers_out_t;


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

  224. typedef struct {
  225.     ngx_temp_file_t                  *temp_file;
  226.     ngx_chain_t                      *bufs;
  227.     ngx_buf_t                        *buf;
  228.     off_t                             rest;
  229.     off_t                             received;
  230.     ngx_chain_t                      *free;
  231.     ngx_chain_t                      *busy;
  232.     ngx_http_chunked_t               *chunked;
  233.     ngx_http_client_body_handler_pt   post_handler;
  234.     unsigned                          filter_need_buffering:1;
  235.     unsigned                          last_sent:1;
  236.     unsigned                          last_saved:1;
  237. } ngx_http_request_body_t;


  238. typedef struct ngx_http_addr_conf_s  ngx_http_addr_conf_t;

  239. typedef struct {
  240.     ngx_http_addr_conf_t             *addr_conf;
  241.     ngx_http_conf_ctx_t              *conf_ctx;

  242. #if (NGX_HTTP_SSL || NGX_COMPAT)
  243.     ngx_str_t                        *ssl_servername;
  244. #if (NGX_PCRE)
  245.     ngx_http_regex_t                 *ssl_servername_regex;
  246. #endif
  247. #endif

  248.     ngx_chain_t                      *busy;
  249.     ngx_int_t                         nbusy;

  250.     ngx_chain_t                      *free;

  251.     unsigned                          ssl:1;
  252.     unsigned                          proxy_protocol:1;
  253. } ngx_http_connection_t;


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

  255. typedef struct ngx_http_cleanup_s  ngx_http_cleanup_t;

  256. struct ngx_http_cleanup_s {
  257.     ngx_http_cleanup_pt               handler;
  258.     void                             *data;
  259.     ngx_http_cleanup_t               *next;
  260. };


  261. typedef ngx_int_t (*ngx_http_post_subrequest_pt)(ngx_http_request_t *r,
  262.     void *data, ngx_int_t rc);

  263. typedef struct {
  264.     ngx_http_post_subrequest_pt       handler;
  265.     void                             *data;
  266. } ngx_http_post_subrequest_t;


  267. typedef struct ngx_http_postponed_request_s  ngx_http_postponed_request_t;

  268. struct ngx_http_postponed_request_s {
  269.     ngx_http_request_t               *request;
  270.     ngx_chain_t                      *out;
  271.     ngx_http_postponed_request_t     *next;
  272. };


  273. typedef struct ngx_http_posted_request_s  ngx_http_posted_request_t;

  274. struct ngx_http_posted_request_s {
  275.     ngx_http_request_t               *request;
  276.     ngx_http_posted_request_t        *next;
  277. };


  278. typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);
  279. typedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r);


  280. struct ngx_http_request_s {
  281.     uint32_t                          signature;         /* "HTTP" */

  282.     ngx_connection_t                 *connection;

  283.     void                            **ctx;
  284.     void                            **main_conf;
  285.     void                            **srv_conf;
  286.     void                            **loc_conf;

  287.     ngx_http_event_handler_pt         read_event_handler;
  288.     ngx_http_event_handler_pt         write_event_handler;

  289. #if (NGX_HTTP_CACHE)
  290.     ngx_http_cache_t                 *cache;
  291. #endif

  292.     ngx_http_upstream_t              *upstream;
  293.     ngx_array_t                      *upstream_states;
  294.                                          /* of ngx_http_upstream_state_t */

  295.     ngx_pool_t                       *pool;
  296.     ngx_buf_t                        *header_in;

  297.     ngx_http_headers_in_t             headers_in;
  298.     ngx_http_headers_out_t            headers_out;

  299.     ngx_http_request_body_t          *request_body;

  300.     time_t                            lingering_time;
  301.     time_t                            start_sec;
  302.     ngx_msec_t                        start_msec;

  303.     ngx_uint_t                        method;
  304.     ngx_uint_t                        http_version;

  305.     ngx_str_t                         request_line;
  306.     ngx_str_t                         uri;
  307.     ngx_str_t                         args;
  308.     ngx_str_t                         exten;
  309.     ngx_str_t                         unparsed_uri;

  310.     ngx_str_t                         method_name;
  311.     ngx_str_t                         http_protocol;
  312.     ngx_str_t                         schema;

  313.     ngx_chain_t                      *out;
  314.     ngx_http_request_t               *main;
  315.     ngx_http_request_t               *parent;
  316.     ngx_http_postponed_request_t     *postponed;
  317.     ngx_http_post_subrequest_t       *post_subrequest;
  318.     ngx_http_posted_request_t        *posted_requests;

  319.     ngx_int_t                         phase_handler;
  320.     ngx_http_handler_pt               content_handler;
  321.     ngx_uint_t                        access_code;

  322.     ngx_http_variable_value_t        *variables;

  323. #if (NGX_PCRE)
  324.     ngx_uint_t                        ncaptures;
  325.     int                              *captures;
  326.     u_char                           *captures_data;
  327. #endif

  328.     size_t                            limit_rate;
  329.     size_t                            limit_rate_after;

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

  332.     off_t                             request_length;

  333.     ngx_uint_t                        err_status;

  334.     ngx_http_connection_t            *http_connection;
  335.     ngx_http_v2_stream_t             *stream;
  336.     ngx_http_v3_parse_t              *v3_parse;

  337.     ngx_http_log_handler_pt           log_handler;

  338.     ngx_http_cleanup_t               *cleanup;

  339.     unsigned                          count:16;
  340.     unsigned                          subrequests:8;
  341.     unsigned                          blocked:8;

  342.     unsigned                          aio:1;

  343.     unsigned                          http_state:4;

  344.     /* URI with "/." and on Win32 with "//" */
  345.     unsigned                          complex_uri:1;

  346.     /* URI with "%" */
  347.     unsigned                          quoted_uri:1;

  348.     /* URI with "+" */
  349.     unsigned                          plus_in_uri:1;

  350.     /* URI with empty path */
  351.     unsigned                          empty_path_in_uri:1;

  352.     unsigned                          invalid_header:1;

  353.     unsigned                          add_uri_to_alias:1;
  354.     unsigned                          valid_location:1;
  355.     unsigned                          valid_unparsed_uri:1;
  356.     unsigned                          uri_changed:1;
  357.     unsigned                          uri_changes:4;

  358.     unsigned                          request_body_in_single_buf:1;
  359.     unsigned                          request_body_in_file_only:1;
  360.     unsigned                          request_body_in_persistent_file:1;
  361.     unsigned                          request_body_in_clean_file:1;
  362.     unsigned                          request_body_file_group_access:1;
  363.     unsigned                          request_body_file_log_level:3;
  364.     unsigned                          request_body_no_buffering:1;

  365.     unsigned                          subrequest_in_memory:1;
  366.     unsigned                          waited:1;

  367. #if (NGX_HTTP_CACHE)
  368.     unsigned                          cached:1;
  369. #endif

  370. #if (NGX_HTTP_GZIP)
  371.     unsigned                          gzip_tested:1;
  372.     unsigned                          gzip_ok:1;
  373.     unsigned                          gzip_vary:1;
  374. #endif

  375. #if (NGX_PCRE)
  376.     unsigned                          realloc_captures:1;
  377. #endif

  378.     unsigned                          proxy:1;
  379.     unsigned                          bypass_cache:1;
  380.     unsigned                          no_cache:1;

  381.     /*
  382.      * instead of using the request context data in
  383.      * ngx_http_limit_conn_module and ngx_http_limit_req_module
  384.      * we use the bit fields in the request structure
  385.      */
  386.     unsigned                          limit_conn_status:2;
  387.     unsigned                          limit_req_status:3;

  388.     unsigned                          limit_rate_set:1;
  389.     unsigned                          limit_rate_after_set:1;

  390. #if 0
  391.     unsigned                          cacheable:1;
  392. #endif

  393.     unsigned                          pipeline:1;
  394.     unsigned                          chunked:1;
  395.     unsigned                          header_only:1;
  396.     unsigned                          expect_trailers:1;
  397.     unsigned                          keepalive:1;
  398.     unsigned                          lingering_close:1;
  399.     unsigned                          discard_body:1;
  400.     unsigned                          reading_body:1;
  401.     unsigned                          internal:1;
  402.     unsigned                          error_page:1;
  403.     unsigned                          filter_finalize:1;
  404.     unsigned                          post_action:1;
  405.     unsigned                          request_complete:1;
  406.     unsigned                          request_output:1;
  407.     unsigned                          header_sent:1;
  408.     unsigned                          response_sent:1;
  409.     unsigned                          expect_tested:1;
  410.     unsigned                          root_tested:1;
  411.     unsigned                          done:1;
  412.     unsigned                          logged:1;
  413.     unsigned                          terminated:1;

  414.     unsigned                          buffered:4;

  415.     unsigned                          main_filter_need_in_memory:1;
  416.     unsigned                          filter_need_in_memory:1;
  417.     unsigned                          filter_need_temporary:1;
  418.     unsigned                          preserve_body:1;
  419.     unsigned                          allow_ranges:1;
  420.     unsigned                          subrequest_ranges:1;
  421.     unsigned                          single_range:1;
  422.     unsigned                          disable_not_modified:1;
  423.     unsigned                          stat_reading:1;
  424.     unsigned                          stat_writing:1;
  425.     unsigned                          stat_processing:1;

  426.     unsigned                          background:1;
  427.     unsigned                          health_check:1;

  428.     /* used to parse HTTP headers */

  429.     ngx_uint_t                        state;

  430.     ngx_uint_t                        header_hash;
  431.     ngx_uint_t                        lowcase_index;
  432.     u_char                            lowcase_header[NGX_HTTP_LC_HEADER_LEN];

  433.     u_char                           *header_name_start;
  434.     u_char                           *header_name_end;
  435.     u_char                           *header_start;
  436.     u_char                           *header_end;

  437.     /*
  438.      * a memory that can be reused after parsing a request line
  439.      * via ngx_http_ephemeral_t
  440.      */

  441.     u_char                           *uri_start;
  442.     u_char                           *uri_end;
  443.     u_char                           *uri_ext;
  444.     u_char                           *args_start;
  445.     u_char                           *request_start;
  446.     u_char                           *request_end;
  447.     u_char                           *method_end;
  448.     u_char                           *schema_start;
  449.     u_char                           *schema_end;
  450.     u_char                           *host_start;
  451.     u_char                           *host_end;

  452.     unsigned                          http_minor:16;
  453.     unsigned                          http_major:16;
  454. };


  455. typedef struct {
  456.     ngx_http_posted_request_t         terminal_posted_request;
  457. } ngx_http_ephemeral_t;


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


  459. extern ngx_http_header_t       ngx_http_headers_in[];
  460. extern ngx_http_header_out_t   ngx_http_headers_out[];


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


  463. #endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */