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