xref: /PHP-5.6/sapi/cgi/fastcgi.h (revision 49493a2d)
1 /*
2    +----------------------------------------------------------------------+
3    | PHP Version 5                                                        |
4    +----------------------------------------------------------------------+
5    | Copyright (c) 1997-2016 The PHP Group                                |
6    +----------------------------------------------------------------------+
7    | This source file is subject to version 3.01 of the PHP license,      |
8    | that is bundled with this package in the file LICENSE, and is        |
9    | available through the world-wide-web at the following url:           |
10    | http://www.php.net/license/3_01.txt                                  |
11    | If you did not receive a copy of the PHP license and are unable to   |
12    | obtain it through the world-wide-web, please send a note to          |
13    | license@php.net so we can mail you a copy immediately.               |
14    +----------------------------------------------------------------------+
15    | Authors: Dmitry Stogov <dmitry@zend.com>                             |
16    +----------------------------------------------------------------------+
17 */
18 
19 /* $Id$ */
20 
21 /* FastCGI protocol */
22 
23 #define FCGI_VERSION_1 1
24 
25 #define FCGI_MAX_LENGTH 0xffff
26 
27 #define FCGI_KEEP_CONN  1
28 
29 /* this is near the perfect hash function for most useful FastCGI variables
30  * which combines efficiency and minimal hash collisions
31  */
32 
33 #define FCGI_HASH_FUNC(var, var_len) \
34 	(UNEXPECTED(var_len < 3) ? var_len : \
35 		(((unsigned int)var[3]) << 2) + \
36 		(((unsigned int)var[var_len-2]) << 4) + \
37 		(((unsigned int)var[var_len-1]) << 2) + \
38 		var_len)
39 
40 #define FCGI_GETENV(request, name) \
41 	fcgi_quick_getenv(request, name, sizeof(name)-1, FCGI_HASH_FUNC(name, sizeof(name)-1))
42 
43 #define FCGI_PUTENV(request, name, value) \
44 	fcgi_quick_putenv(request, name, sizeof(name)-1, FCGI_HASH_FUNC(name, sizeof(name)-1), value)
45 
46 typedef enum _fcgi_role {
47 	FCGI_RESPONDER	= 1,
48 	FCGI_AUTHORIZER	= 2,
49 	FCGI_FILTER		= 3
50 } fcgi_role;
51 
52 typedef enum _fcgi_request_type {
53 	FCGI_BEGIN_REQUEST		=  1, /* [in]                              */
54 	FCGI_ABORT_REQUEST		=  2, /* [in]  (not supported)             */
55 	FCGI_END_REQUEST		=  3, /* [out]                             */
56 	FCGI_PARAMS				=  4, /* [in]  environment variables       */
57 	FCGI_STDIN				=  5, /* [in]  post data                   */
58 	FCGI_STDOUT				=  6, /* [out] response                    */
59 	FCGI_STDERR				=  7, /* [out] errors                      */
60 	FCGI_DATA				=  8, /* [in]  filter data (not supported) */
61 	FCGI_GET_VALUES			=  9, /* [in]                              */
62 	FCGI_GET_VALUES_RESULT	= 10  /* [out]                             */
63 } fcgi_request_type;
64 
65 typedef enum _fcgi_protocol_status {
66 	FCGI_REQUEST_COMPLETE	= 0,
67 	FCGI_CANT_MPX_CONN		= 1,
68 	FCGI_OVERLOADED			= 2,
69 	FCGI_UNKNOWN_ROLE		= 3
70 } dcgi_protocol_status;
71 
72 typedef struct _fcgi_header {
73 	unsigned char version;
74 	unsigned char type;
75 	unsigned char requestIdB1;
76 	unsigned char requestIdB0;
77 	unsigned char contentLengthB1;
78 	unsigned char contentLengthB0;
79 	unsigned char paddingLength;
80 	unsigned char reserved;
81 } fcgi_header;
82 
83 typedef struct _fcgi_begin_request {
84 	unsigned char roleB1;
85 	unsigned char roleB0;
86 	unsigned char flags;
87 	unsigned char reserved[5];
88 } fcgi_begin_request;
89 
90 typedef struct _fcgi_begin_request_rec {
91 	fcgi_header hdr;
92 	fcgi_begin_request body;
93 } fcgi_begin_request_rec;
94 
95 typedef struct _fcgi_end_request {
96     unsigned char appStatusB3;
97     unsigned char appStatusB2;
98     unsigned char appStatusB1;
99     unsigned char appStatusB0;
100     unsigned char protocolStatus;
101     unsigned char reserved[3];
102 } fcgi_end_request;
103 
104 typedef struct _fcgi_end_request_rec {
105 	fcgi_header hdr;
106 	fcgi_end_request body;
107 } fcgi_end_request_rec;
108 
109 /* FastCGI client API */
110 
111 typedef void (*fcgi_apply_func)(char *var, unsigned int var_len, char *val, unsigned int val_len, void *arg TSRMLS_DC);
112 
113 typedef struct _fcgi_request fcgi_request;
114 
115 int fcgi_init(void);
116 void fcgi_shutdown(void);
117 int fcgi_is_fastcgi(void);
118 int fcgi_in_shutdown(void);
119 void fcgi_terminate(void);
120 int fcgi_listen(const char *path, int backlog);
121 fcgi_request* fcgi_init_request(int listen_socket);
122 void fcgi_destroy_request(fcgi_request *req);
123 int fcgi_accept_request(fcgi_request *req);
124 int fcgi_finish_request(fcgi_request *req, int force_close);
125 
126 char* fcgi_getenv(fcgi_request *req, const char* var, int var_len);
127 char* fcgi_putenv(fcgi_request *req, char* var, int var_len, char* val);
128 char* fcgi_quick_getenv(fcgi_request *req, const char* var, int var_len, unsigned int hash_value);
129 char* fcgi_quick_putenv(fcgi_request *req, char* var, int var_len, unsigned int hash_value, char* val);
130 void  fcgi_loadenv(fcgi_request *req, fcgi_apply_func load_func, zval *array TSRMLS_DC);
131 
132 int fcgi_read(fcgi_request *req, char *str, int len);
133 
134 int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int len);
135 int fcgi_flush(fcgi_request *req, int close);
136 
137 #ifdef PHP_WIN32
138 void fcgi_impersonate(void);
139 #endif
140 
141 void fcgi_set_mgmt_var(const char * name, size_t name_len, const char * value, size_t value_len);
142 void fcgi_free_mgmt_var_cb(void * ptr);
143 
144 /*
145  * Local variables:
146  * tab-width: 4
147  * c-basic-offset: 4
148  * End:
149  * vim600: sw=4 ts=4 fdm=marker
150  * vim<600: sw=4 ts=4
151  */
152