Annotation of embedaddon/nginx/src/http/ngx_http_request.h, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * Copyright (C) Igor Sysoev
! 4: * Copyright (C) Nginx, Inc.
! 5: */
! 6:
! 7:
! 8: #ifndef _NGX_HTTP_REQUEST_H_INCLUDED_
! 9: #define _NGX_HTTP_REQUEST_H_INCLUDED_
! 10:
! 11:
! 12: #define NGX_HTTP_MAX_URI_CHANGES 10
! 13: #define NGX_HTTP_MAX_SUBREQUESTS 200
! 14:
! 15: /* must be 2^n */
! 16: #define NGX_HTTP_LC_HEADER_LEN 32
! 17:
! 18:
! 19: #define NGX_HTTP_DISCARD_BUFFER_SIZE 4096
! 20: #define NGX_HTTP_LINGERING_BUFFER_SIZE 4096
! 21:
! 22:
! 23: #define NGX_HTTP_VERSION_9 9
! 24: #define NGX_HTTP_VERSION_10 1000
! 25: #define NGX_HTTP_VERSION_11 1001
! 26:
! 27: #define NGX_HTTP_UNKNOWN 0x0001
! 28: #define NGX_HTTP_GET 0x0002
! 29: #define NGX_HTTP_HEAD 0x0004
! 30: #define NGX_HTTP_POST 0x0008
! 31: #define NGX_HTTP_PUT 0x0010
! 32: #define NGX_HTTP_DELETE 0x0020
! 33: #define NGX_HTTP_MKCOL 0x0040
! 34: #define NGX_HTTP_COPY 0x0080
! 35: #define NGX_HTTP_MOVE 0x0100
! 36: #define NGX_HTTP_OPTIONS 0x0200
! 37: #define NGX_HTTP_PROPFIND 0x0400
! 38: #define NGX_HTTP_PROPPATCH 0x0800
! 39: #define NGX_HTTP_LOCK 0x1000
! 40: #define NGX_HTTP_UNLOCK 0x2000
! 41: #define NGX_HTTP_PATCH 0x4000
! 42: #define NGX_HTTP_TRACE 0x8000
! 43:
! 44: #define NGX_HTTP_CONNECTION_CLOSE 1
! 45: #define NGX_HTTP_CONNECTION_KEEP_ALIVE 2
! 46:
! 47:
! 48: #define NGX_NONE 1
! 49:
! 50:
! 51: #define NGX_HTTP_PARSE_HEADER_DONE 1
! 52:
! 53: #define NGX_HTTP_CLIENT_ERROR 10
! 54: #define NGX_HTTP_PARSE_INVALID_METHOD 10
! 55: #define NGX_HTTP_PARSE_INVALID_REQUEST 11
! 56: #define NGX_HTTP_PARSE_INVALID_09_METHOD 12
! 57:
! 58: #define NGX_HTTP_PARSE_INVALID_HEADER 13
! 59:
! 60:
! 61: /* unused 1 */
! 62: #define NGX_HTTP_SUBREQUEST_IN_MEMORY 2
! 63: #define NGX_HTTP_SUBREQUEST_WAITED 4
! 64: #define NGX_HTTP_LOG_UNSAFE 8
! 65:
! 66:
! 67: #define NGX_HTTP_CONTINUE 100
! 68: #define NGX_HTTP_SWITCHING_PROTOCOLS 101
! 69: #define NGX_HTTP_PROCESSING 102
! 70:
! 71: #define NGX_HTTP_OK 200
! 72: #define NGX_HTTP_CREATED 201
! 73: #define NGX_HTTP_ACCEPTED 202
! 74: #define NGX_HTTP_NO_CONTENT 204
! 75: #define NGX_HTTP_PARTIAL_CONTENT 206
! 76:
! 77: #define NGX_HTTP_SPECIAL_RESPONSE 300
! 78: #define NGX_HTTP_MOVED_PERMANENTLY 301
! 79: #define NGX_HTTP_MOVED_TEMPORARILY 302
! 80: #define NGX_HTTP_SEE_OTHER 303
! 81: #define NGX_HTTP_NOT_MODIFIED 304
! 82: #define NGX_HTTP_TEMPORARY_REDIRECT 307
! 83:
! 84: #define NGX_HTTP_BAD_REQUEST 400
! 85: #define NGX_HTTP_UNAUTHORIZED 401
! 86: #define NGX_HTTP_FORBIDDEN 403
! 87: #define NGX_HTTP_NOT_FOUND 404
! 88: #define NGX_HTTP_NOT_ALLOWED 405
! 89: #define NGX_HTTP_REQUEST_TIME_OUT 408
! 90: #define NGX_HTTP_CONFLICT 409
! 91: #define NGX_HTTP_LENGTH_REQUIRED 411
! 92: #define NGX_HTTP_PRECONDITION_FAILED 412
! 93: #define NGX_HTTP_REQUEST_ENTITY_TOO_LARGE 413
! 94: #define NGX_HTTP_REQUEST_URI_TOO_LARGE 414
! 95: #define NGX_HTTP_UNSUPPORTED_MEDIA_TYPE 415
! 96: #define NGX_HTTP_RANGE_NOT_SATISFIABLE 416
! 97:
! 98:
! 99: /* Our own HTTP codes */
! 100:
! 101: /* The special code to close connection without any response */
! 102: #define NGX_HTTP_CLOSE 444
! 103:
! 104: #define NGX_HTTP_NGINX_CODES 494
! 105:
! 106: #define NGX_HTTP_REQUEST_HEADER_TOO_LARGE 494
! 107:
! 108: #define NGX_HTTPS_CERT_ERROR 495
! 109: #define NGX_HTTPS_NO_CERT 496
! 110:
! 111: /*
! 112: * We use the special code for the plain HTTP requests that are sent to
! 113: * HTTPS port to distinguish it from 4XX in an error page redirection
! 114: */
! 115: #define NGX_HTTP_TO_HTTPS 497
! 116:
! 117: /* 498 is the canceled code for the requests with invalid host name */
! 118:
! 119: /*
! 120: * HTTP does not define the code for the case when a client closed
! 121: * the connection while we are processing its request so we introduce
! 122: * own code to log such situation when a client has closed the connection
! 123: * before we even try to send the HTTP header to it
! 124: */
! 125: #define NGX_HTTP_CLIENT_CLOSED_REQUEST 499
! 126:
! 127:
! 128: #define NGX_HTTP_INTERNAL_SERVER_ERROR 500
! 129: #define NGX_HTTP_NOT_IMPLEMENTED 501
! 130: #define NGX_HTTP_BAD_GATEWAY 502
! 131: #define NGX_HTTP_SERVICE_UNAVAILABLE 503
! 132: #define NGX_HTTP_GATEWAY_TIME_OUT 504
! 133: #define NGX_HTTP_INSUFFICIENT_STORAGE 507
! 134:
! 135:
! 136: #define NGX_HTTP_LOWLEVEL_BUFFERED 0xf0
! 137: #define NGX_HTTP_WRITE_BUFFERED 0x10
! 138: #define NGX_HTTP_GZIP_BUFFERED 0x20
! 139: #define NGX_HTTP_SSI_BUFFERED 0x01
! 140: #define NGX_HTTP_SUB_BUFFERED 0x02
! 141: #define NGX_HTTP_COPY_BUFFERED 0x04
! 142:
! 143:
! 144: typedef enum {
! 145: NGX_HTTP_INITING_REQUEST_STATE = 0,
! 146: NGX_HTTP_READING_REQUEST_STATE,
! 147: NGX_HTTP_PROCESS_REQUEST_STATE,
! 148:
! 149: NGX_HTTP_CONNECT_UPSTREAM_STATE,
! 150: NGX_HTTP_WRITING_UPSTREAM_STATE,
! 151: NGX_HTTP_READING_UPSTREAM_STATE,
! 152:
! 153: NGX_HTTP_WRITING_REQUEST_STATE,
! 154: NGX_HTTP_LINGERING_CLOSE_STATE,
! 155: NGX_HTTP_KEEPALIVE_STATE
! 156: } ngx_http_state_e;
! 157:
! 158:
! 159: typedef struct {
! 160: ngx_str_t name;
! 161: ngx_uint_t offset;
! 162: ngx_http_header_handler_pt handler;
! 163: } ngx_http_header_t;
! 164:
! 165:
! 166: typedef struct {
! 167: ngx_str_t name;
! 168: ngx_uint_t offset;
! 169: } ngx_http_header_out_t;
! 170:
! 171:
! 172: typedef struct {
! 173: ngx_list_t headers;
! 174:
! 175: ngx_table_elt_t *host;
! 176: ngx_table_elt_t *connection;
! 177: ngx_table_elt_t *if_modified_since;
! 178: ngx_table_elt_t *if_unmodified_since;
! 179: ngx_table_elt_t *if_match;
! 180: ngx_table_elt_t *if_none_match;
! 181: ngx_table_elt_t *user_agent;
! 182: ngx_table_elt_t *referer;
! 183: ngx_table_elt_t *content_length;
! 184: ngx_table_elt_t *content_type;
! 185:
! 186: ngx_table_elt_t *range;
! 187: ngx_table_elt_t *if_range;
! 188:
! 189: ngx_table_elt_t *transfer_encoding;
! 190: ngx_table_elt_t *expect;
! 191: ngx_table_elt_t *upgrade;
! 192:
! 193: #if (NGX_HTTP_GZIP)
! 194: ngx_table_elt_t *accept_encoding;
! 195: ngx_table_elt_t *via;
! 196: #endif
! 197:
! 198: ngx_table_elt_t *authorization;
! 199:
! 200: ngx_table_elt_t *keep_alive;
! 201:
! 202: #if (NGX_HTTP_X_FORWARDED_FOR)
! 203: ngx_array_t x_forwarded_for;
! 204: #endif
! 205:
! 206: #if (NGX_HTTP_REALIP)
! 207: ngx_table_elt_t *x_real_ip;
! 208: #endif
! 209:
! 210: #if (NGX_HTTP_HEADERS)
! 211: ngx_table_elt_t *accept;
! 212: ngx_table_elt_t *accept_language;
! 213: #endif
! 214:
! 215: #if (NGX_HTTP_DAV)
! 216: ngx_table_elt_t *depth;
! 217: ngx_table_elt_t *destination;
! 218: ngx_table_elt_t *overwrite;
! 219: ngx_table_elt_t *date;
! 220: #endif
! 221:
! 222: ngx_str_t user;
! 223: ngx_str_t passwd;
! 224:
! 225: ngx_array_t cookies;
! 226:
! 227: ngx_str_t server;
! 228: off_t content_length_n;
! 229: time_t keep_alive_n;
! 230:
! 231: unsigned connection_type:2;
! 232: unsigned chunked:1;
! 233: unsigned msie:1;
! 234: unsigned msie6:1;
! 235: unsigned opera:1;
! 236: unsigned gecko:1;
! 237: unsigned chrome:1;
! 238: unsigned safari:1;
! 239: unsigned konqueror:1;
! 240: } ngx_http_headers_in_t;
! 241:
! 242:
! 243: typedef struct {
! 244: ngx_list_t headers;
! 245:
! 246: ngx_uint_t status;
! 247: ngx_str_t status_line;
! 248:
! 249: ngx_table_elt_t *server;
! 250: ngx_table_elt_t *date;
! 251: ngx_table_elt_t *content_length;
! 252: ngx_table_elt_t *content_encoding;
! 253: ngx_table_elt_t *location;
! 254: ngx_table_elt_t *refresh;
! 255: ngx_table_elt_t *last_modified;
! 256: ngx_table_elt_t *content_range;
! 257: ngx_table_elt_t *accept_ranges;
! 258: ngx_table_elt_t *www_authenticate;
! 259: ngx_table_elt_t *expires;
! 260: ngx_table_elt_t *etag;
! 261:
! 262: ngx_str_t *override_charset;
! 263:
! 264: size_t content_type_len;
! 265: ngx_str_t content_type;
! 266: ngx_str_t charset;
! 267: u_char *content_type_lowcase;
! 268: ngx_uint_t content_type_hash;
! 269:
! 270: ngx_array_t cache_control;
! 271:
! 272: off_t content_length_n;
! 273: time_t date_time;
! 274: time_t last_modified_time;
! 275: } ngx_http_headers_out_t;
! 276:
! 277:
! 278: typedef void (*ngx_http_client_body_handler_pt)(ngx_http_request_t *r);
! 279:
! 280: typedef struct {
! 281: ngx_temp_file_t *temp_file;
! 282: ngx_chain_t *bufs;
! 283: ngx_buf_t *buf;
! 284: off_t rest;
! 285: ngx_chain_t *free;
! 286: ngx_chain_t *busy;
! 287: ngx_http_chunked_t *chunked;
! 288: ngx_http_client_body_handler_pt post_handler;
! 289: } ngx_http_request_body_t;
! 290:
! 291:
! 292: typedef struct ngx_http_addr_conf_s ngx_http_addr_conf_t;
! 293:
! 294: typedef struct {
! 295: ngx_http_addr_conf_t *addr_conf;
! 296: ngx_http_conf_ctx_t *conf_ctx;
! 297:
! 298: #if (NGX_HTTP_SSL && defined SSL_CTRL_SET_TLSEXT_HOSTNAME)
! 299: ngx_str_t *ssl_servername;
! 300: #if (NGX_PCRE)
! 301: ngx_http_regex_t *ssl_servername_regex;
! 302: #endif
! 303: #endif
! 304:
! 305: ngx_buf_t **busy;
! 306: ngx_int_t nbusy;
! 307:
! 308: ngx_buf_t **free;
! 309: ngx_int_t nfree;
! 310:
! 311: #if (NGX_HTTP_SSL)
! 312: ngx_uint_t ssl; /* unsigned ssl:1; */
! 313: #endif
! 314: } ngx_http_connection_t;
! 315:
! 316:
! 317: typedef void (*ngx_http_cleanup_pt)(void *data);
! 318:
! 319: typedef struct ngx_http_cleanup_s ngx_http_cleanup_t;
! 320:
! 321: struct ngx_http_cleanup_s {
! 322: ngx_http_cleanup_pt handler;
! 323: void *data;
! 324: ngx_http_cleanup_t *next;
! 325: };
! 326:
! 327:
! 328: typedef ngx_int_t (*ngx_http_post_subrequest_pt)(ngx_http_request_t *r,
! 329: void *data, ngx_int_t rc);
! 330:
! 331: typedef struct {
! 332: ngx_http_post_subrequest_pt handler;
! 333: void *data;
! 334: } ngx_http_post_subrequest_t;
! 335:
! 336:
! 337: typedef struct ngx_http_postponed_request_s ngx_http_postponed_request_t;
! 338:
! 339: struct ngx_http_postponed_request_s {
! 340: ngx_http_request_t *request;
! 341: ngx_chain_t *out;
! 342: ngx_http_postponed_request_t *next;
! 343: };
! 344:
! 345:
! 346: typedef struct ngx_http_posted_request_s ngx_http_posted_request_t;
! 347:
! 348: struct ngx_http_posted_request_s {
! 349: ngx_http_request_t *request;
! 350: ngx_http_posted_request_t *next;
! 351: };
! 352:
! 353:
! 354: typedef ngx_int_t (*ngx_http_handler_pt)(ngx_http_request_t *r);
! 355: typedef void (*ngx_http_event_handler_pt)(ngx_http_request_t *r);
! 356:
! 357:
! 358: struct ngx_http_request_s {
! 359: uint32_t signature; /* "HTTP" */
! 360:
! 361: ngx_connection_t *connection;
! 362:
! 363: void **ctx;
! 364: void **main_conf;
! 365: void **srv_conf;
! 366: void **loc_conf;
! 367:
! 368: ngx_http_event_handler_pt read_event_handler;
! 369: ngx_http_event_handler_pt write_event_handler;
! 370:
! 371: #if (NGX_HTTP_CACHE)
! 372: ngx_http_cache_t *cache;
! 373: #endif
! 374:
! 375: ngx_http_upstream_t *upstream;
! 376: ngx_array_t *upstream_states;
! 377: /* of ngx_http_upstream_state_t */
! 378:
! 379: ngx_pool_t *pool;
! 380: ngx_buf_t *header_in;
! 381:
! 382: ngx_http_headers_in_t headers_in;
! 383: ngx_http_headers_out_t headers_out;
! 384:
! 385: ngx_http_request_body_t *request_body;
! 386:
! 387: time_t lingering_time;
! 388: time_t start_sec;
! 389: ngx_msec_t start_msec;
! 390:
! 391: ngx_uint_t method;
! 392: ngx_uint_t http_version;
! 393:
! 394: ngx_str_t request_line;
! 395: ngx_str_t uri;
! 396: ngx_str_t args;
! 397: ngx_str_t exten;
! 398: ngx_str_t unparsed_uri;
! 399:
! 400: ngx_str_t method_name;
! 401: ngx_str_t http_protocol;
! 402:
! 403: ngx_chain_t *out;
! 404: ngx_http_request_t *main;
! 405: ngx_http_request_t *parent;
! 406: ngx_http_postponed_request_t *postponed;
! 407: ngx_http_post_subrequest_t *post_subrequest;
! 408: ngx_http_posted_request_t *posted_requests;
! 409:
! 410: ngx_int_t phase_handler;
! 411: ngx_http_handler_pt content_handler;
! 412: ngx_uint_t access_code;
! 413:
! 414: ngx_http_variable_value_t *variables;
! 415:
! 416: #if (NGX_PCRE)
! 417: ngx_uint_t ncaptures;
! 418: int *captures;
! 419: u_char *captures_data;
! 420: #endif
! 421:
! 422: size_t limit_rate;
! 423:
! 424: /* used to learn the Apache compatible response length without a header */
! 425: size_t header_size;
! 426:
! 427: off_t request_length;
! 428:
! 429: ngx_uint_t err_status;
! 430:
! 431: ngx_http_connection_t *http_connection;
! 432: #if (NGX_HTTP_SPDY)
! 433: ngx_http_spdy_stream_t *spdy_stream;
! 434: #endif
! 435:
! 436: ngx_http_log_handler_pt log_handler;
! 437:
! 438: ngx_http_cleanup_t *cleanup;
! 439:
! 440: unsigned subrequests:8;
! 441: unsigned count:8;
! 442: unsigned blocked:8;
! 443:
! 444: unsigned aio:1;
! 445:
! 446: unsigned http_state:4;
! 447:
! 448: /* URI with "/." and on Win32 with "//" */
! 449: unsigned complex_uri:1;
! 450:
! 451: /* URI with "%" */
! 452: unsigned quoted_uri:1;
! 453:
! 454: /* URI with "+" */
! 455: unsigned plus_in_uri:1;
! 456:
! 457: /* URI with " " */
! 458: unsigned space_in_uri:1;
! 459:
! 460: unsigned invalid_header:1;
! 461:
! 462: unsigned add_uri_to_alias:1;
! 463: unsigned valid_location:1;
! 464: unsigned valid_unparsed_uri:1;
! 465: unsigned uri_changed:1;
! 466: unsigned uri_changes:4;
! 467:
! 468: unsigned request_body_in_single_buf:1;
! 469: unsigned request_body_in_file_only:1;
! 470: unsigned request_body_in_persistent_file:1;
! 471: unsigned request_body_in_clean_file:1;
! 472: unsigned request_body_file_group_access:1;
! 473: unsigned request_body_file_log_level:3;
! 474:
! 475: unsigned subrequest_in_memory:1;
! 476: unsigned waited:1;
! 477:
! 478: #if (NGX_HTTP_CACHE)
! 479: unsigned cached:1;
! 480: #endif
! 481:
! 482: #if (NGX_HTTP_GZIP)
! 483: unsigned gzip_tested:1;
! 484: unsigned gzip_ok:1;
! 485: unsigned gzip_vary:1;
! 486: #endif
! 487:
! 488: unsigned proxy:1;
! 489: unsigned bypass_cache:1;
! 490: unsigned no_cache:1;
! 491:
! 492: /*
! 493: * instead of using the request context data in
! 494: * ngx_http_limit_conn_module and ngx_http_limit_req_module
! 495: * we use the single bits in the request structure
! 496: */
! 497: unsigned limit_conn_set:1;
! 498: unsigned limit_req_set:1;
! 499:
! 500: #if 0
! 501: unsigned cacheable:1;
! 502: #endif
! 503:
! 504: unsigned pipeline:1;
! 505: unsigned chunked:1;
! 506: unsigned header_only:1;
! 507: unsigned keepalive:1;
! 508: unsigned lingering_close:1;
! 509: unsigned discard_body:1;
! 510: unsigned internal:1;
! 511: unsigned error_page:1;
! 512: unsigned ignore_content_encoding:1;
! 513: unsigned filter_finalize:1;
! 514: unsigned post_action:1;
! 515: unsigned request_complete:1;
! 516: unsigned request_output:1;
! 517: unsigned header_sent:1;
! 518: unsigned expect_tested:1;
! 519: unsigned root_tested:1;
! 520: unsigned done:1;
! 521: unsigned logged:1;
! 522:
! 523: unsigned buffered:4;
! 524:
! 525: unsigned main_filter_need_in_memory:1;
! 526: unsigned filter_need_in_memory:1;
! 527: unsigned filter_need_temporary:1;
! 528: unsigned allow_ranges:1;
! 529:
! 530: #if (NGX_STAT_STUB)
! 531: unsigned stat_reading:1;
! 532: unsigned stat_writing:1;
! 533: #endif
! 534:
! 535: /* used to parse HTTP headers */
! 536:
! 537: ngx_uint_t state;
! 538:
! 539: ngx_uint_t header_hash;
! 540: ngx_uint_t lowcase_index;
! 541: u_char lowcase_header[NGX_HTTP_LC_HEADER_LEN];
! 542:
! 543: u_char *header_name_start;
! 544: u_char *header_name_end;
! 545: u_char *header_start;
! 546: u_char *header_end;
! 547:
! 548: /*
! 549: * a memory that can be reused after parsing a request line
! 550: * via ngx_http_ephemeral_t
! 551: */
! 552:
! 553: u_char *uri_start;
! 554: u_char *uri_end;
! 555: u_char *uri_ext;
! 556: u_char *args_start;
! 557: u_char *request_start;
! 558: u_char *request_end;
! 559: u_char *method_end;
! 560: u_char *schema_start;
! 561: u_char *schema_end;
! 562: u_char *host_start;
! 563: u_char *host_end;
! 564: u_char *port_start;
! 565: u_char *port_end;
! 566:
! 567: unsigned http_minor:16;
! 568: unsigned http_major:16;
! 569: };
! 570:
! 571:
! 572: typedef struct {
! 573: ngx_http_posted_request_t terminal_posted_request;
! 574: #if (NGX_HAVE_AIO_SENDFILE)
! 575: u_char aio_preload;
! 576: #endif
! 577: } ngx_http_ephemeral_t;
! 578:
! 579:
! 580: extern ngx_http_header_t ngx_http_headers_in[];
! 581: extern ngx_http_header_out_t ngx_http_headers_out[];
! 582:
! 583:
! 584: #define ngx_http_set_connection_log(c, l) \
! 585: \
! 586: c->log->file = l->file; \
! 587: if (!(c->log->log_level & NGX_LOG_DEBUG_CONNECTION)) { \
! 588: c->log->log_level = l->log_level; \
! 589: }
! 590:
! 591:
! 592: #endif /* _NGX_HTTP_REQUEST_H_INCLUDED_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>