Annotation of embedaddon/php/sapi/cli/php_http_parser.h, revision 1.1.1.2
1.1 misho 1: /* Copyright 2009,2010 Ryan Dahl <ry@tinyclouds.org>
2: *
3: * Permission is hereby granted, free of charge, to any person obtaining a copy
4: * of this software and associated documentation files (the "Software"), to
5: * deal in the Software without restriction, including without limitation the
6: * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7: * sell copies of the Software, and to permit persons to whom the Software is
8: * furnished to do so, subject to the following conditions:
9: *
10: * The above copyright notice and this permission notice shall be included in
11: * all copies or substantial portions of the Software.
12: *
13: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18: * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19: * IN THE SOFTWARE.
20: */
21: /* modified by Moriyoshi Koizumi <moriyoshi@php.net> to make it fit to PHP source tree. */
22: #ifndef php_http_parser_h
23: #define php_http_parser_h
24: #ifdef __cplusplus
25: extern "C" {
26: #endif
27:
28:
29: #include <sys/types.h>
30: #if defined(_WIN32) && !defined(__MINGW32__)
31: # include <windows.h>
32: # include "win32/php_stdint.h"
33: # include "config.w32.h"
34: #else
1.1.1.2 ! misho 35: # include "php_config.h"
! 36: # ifdef HAVE_STDINT_H
! 37: # include <stdint.h>
! 38: # endif
1.1 misho 39: #endif
40:
41: /* Compile with -DPHP_HTTP_PARSER_STRICT=0 to make less checks, but run
42: * faster
43: */
44: #ifndef PHP_HTTP_PARSER_STRICT
45: # define PHP_HTTP_PARSER_STRICT 1
46: #else
47: # define PHP_HTTP_PARSER_STRICT 0
48: #endif
49:
50:
51: /* Maximium header size allowed */
52: #define PHP_HTTP_MAX_HEADER_SIZE (80*1024)
53:
54:
55: typedef struct php_http_parser php_http_parser;
56: typedef struct php_http_parser_settings php_http_parser_settings;
57:
58:
59: /* Callbacks should return non-zero to indicate an error. The parser will
60: * then halt execution.
61: *
62: * The one exception is on_headers_complete. In a PHP_HTTP_RESPONSE parser
63: * returning '1' from on_headers_complete will tell the parser that it
64: * should not expect a body. This is used when receiving a response to a
65: * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:
66: * chunked' headers that indicate the presence of a body.
67: *
68: * http_data_cb does not return data chunks. It will be call arbitrarally
69: * many times for each string. E.G. you might get 10 callbacks for "on_path"
70: * each providing just a few characters more data.
71: */
72: typedef int (*php_http_data_cb) (php_http_parser*, const char *at, size_t length);
73: typedef int (*php_http_cb) (php_http_parser*);
74:
75:
76: /* Request Methods */
77: enum php_http_method
78: { PHP_HTTP_DELETE = 0
79: , PHP_HTTP_GET
80: , PHP_HTTP_HEAD
81: , PHP_HTTP_POST
82: , PHP_HTTP_PUT
1.1.1.2 ! misho 83: , PHP_HTTP_PATCH
1.1 misho 84: /* pathological */
85: , PHP_HTTP_CONNECT
86: , PHP_HTTP_OPTIONS
87: , PHP_HTTP_TRACE
88: /* webdav */
89: , PHP_HTTP_COPY
90: , PHP_HTTP_LOCK
91: , PHP_HTTP_MKCOL
92: , PHP_HTTP_MOVE
93: , PHP_HTTP_PROPFIND
94: , PHP_HTTP_PROPPATCH
95: , PHP_HTTP_UNLOCK
96: /* subversion */
97: , PHP_HTTP_REPORT
98: , PHP_HTTP_MKACTIVITY
99: , PHP_HTTP_CHECKOUT
100: , PHP_HTTP_MERGE
101: /* upnp */
102: , PHP_HTTP_MSEARCH
103: , PHP_HTTP_NOTIFY
104: , PHP_HTTP_SUBSCRIBE
105: , PHP_HTTP_UNSUBSCRIBE
1.1.1.2 ! misho 106: /* unknown, not implemented */
! 107: , PHP_HTTP_NOT_IMPLEMENTED
1.1 misho 108: };
109:
110:
111: enum php_http_parser_type { PHP_HTTP_REQUEST, PHP_HTTP_RESPONSE, PHP_HTTP_BOTH };
112:
113:
114: struct php_http_parser {
115: /** PRIVATE **/
116: unsigned char type : 2;
117: unsigned char flags : 6;
118: unsigned char state;
119: unsigned char header_state;
120: unsigned char index;
121:
122: uint32_t nread;
123: ssize_t content_length;
124:
125: /** READ-ONLY **/
126: unsigned short http_major;
127: unsigned short http_minor;
128: unsigned short status_code; /* responses only */
129: unsigned char method; /* requests only */
130:
131: /* 1 = Upgrade header was present and the parser has exited because of that.
132: * 0 = No upgrade header present.
133: * Should be checked when http_parser_execute() returns in addition to
134: * error checking.
135: */
136: char upgrade;
137:
138: /** PUBLIC **/
139: void *data; /* A pointer to get hook to the "connection" or "socket" object */
140: };
141:
142:
143: struct php_http_parser_settings {
144: php_http_cb on_message_begin;
145: php_http_data_cb on_path;
146: php_http_data_cb on_query_string;
147: php_http_data_cb on_url;
148: php_http_data_cb on_fragment;
149: php_http_data_cb on_header_field;
150: php_http_data_cb on_header_value;
151: php_http_cb on_headers_complete;
152: php_http_data_cb on_body;
153: php_http_cb on_message_complete;
154: };
155:
156:
157: void php_http_parser_init(php_http_parser *parser, enum php_http_parser_type type);
158:
159:
160: size_t php_http_parser_execute(php_http_parser *parser,
161: const php_http_parser_settings *settings,
162: const char *data,
163: size_t len);
164:
165:
166: /* If php_http_should_keep_alive() in the on_headers_complete or
167: * on_message_complete callback returns true, then this will be should be
168: * the last message on the connection.
169: * If you are the server, respond with the "Connection: close" header.
170: * If you are the client, close the connection.
171: */
172: int php_http_should_keep_alive(php_http_parser *parser);
173:
174: /* Returns a string version of the HTTP method. */
175: const char *php_http_method_str(enum php_http_method);
176:
177: #ifdef __cplusplus
178: }
179: #endif
180: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>