diff options
author | Dmitry Stogov <dmitry@php.net> | 2006-02-02 08:17:23 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2006-02-02 08:17:23 +0000 |
commit | 7e7fcc3a078029b06a23e7cc70cde935575df889 (patch) | |
tree | a91c4a827dd0441217e6993538f49304f7fb973c /sapi/cgi/fastcgi.h | |
parent | 9774b6d3e63526f61ba98d0f53b3dd2304473980 (diff) | |
download | php-git-7e7fcc3a078029b06a23e7cc70cde935575df889.tar.gz |
Reimplement FastCGI interface
Due to licensing restrictions that actually don't allow anybody to use
the libfcgi code without prior approval from Open Market, which is
impossible to obtain - we decided to reimplement this interface from
scratch. The result is actually slightly faster, and more importantly,
clear of any copyright issues.
Diffstat (limited to 'sapi/cgi/fastcgi.h')
-rw-r--r-- | sapi/cgi/fastcgi.h | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/sapi/cgi/fastcgi.h b/sapi/cgi/fastcgi.h new file mode 100644 index 0000000000..7c910e1abb --- /dev/null +++ b/sapi/cgi/fastcgi.h @@ -0,0 +1,183 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2006 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.01 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Dmitry Stogov <dmitry@zend.com> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +/* FastCGI protocol */ + +#define FCGI_VERSION_1 1 + +#define FCGI_MAX_LENGTH 0xffff + +#define FCGI_KEEP_CONN 1 + +typedef enum _fcgi_role { + FCGI_RESPONDER = 1, + FCGI_AUTHORIZER = 2, + FCGI_FILTER = 3 +} fcgi_role; + +typedef enum _fcgi_request_type { + FCGI_BEGIN_REQUEST = 1, /* [in] */ + FCGI_ABORT_REQUEST = 2, /* [in] (not supported) */ + FCGI_END_REQUEST = 3, /* [out] */ + FCGI_PARAMS = 4, /* [in] environment variables */ + FCGI_STDIN = 5, /* [in] post data */ + FCGI_STDOUT = 6, /* [out] response */ + FCGI_STDERR = 7, /* [out] errors */ + FCGI_DATA = 8, /* [in] filter data (not supported) */ + FCGI_GET_VALUES = 9, /* [in] */ + FCGI_GET_VALUES_RESULT = 10 /* [out] */ +} fcgi_request_type; + +typedef enum _fcgi_protocol_status { + FCGI_REQUEST_COMPLETE = 0, + FCGI_CANT_MPX_CONN = 1, + FCGI_OVERLOADED = 2, + FCGI_UNKNOWN_ROLE = 3 +} dcgi_protocol_status; + +typedef struct _fcgi_header { + unsigned char version; + unsigned char type; + unsigned char requestIdB1; + unsigned char requestIdB0; + unsigned char contentLengthB1; + unsigned char contentLengthB0; + unsigned char paddingLength; + unsigned char reserved; +} fcgi_header; + +typedef struct _fcgi_begin_request { + unsigned char roleB1; + unsigned char roleB0; + unsigned char flags; + unsigned char reserved[5]; +} fcgi_begin_request; + +typedef struct _fcgi_begin_request_rec { + fcgi_header hdr; + fcgi_begin_request body; +} fcgi_begin_request_rec; + +typedef struct _fcgi_end_request { + unsigned char appStatusB3; + unsigned char appStatusB2; + unsigned char appStatusB1; + unsigned char appStatusB0; + unsigned char protocolStatus; + unsigned char reserved[3]; +} fcgi_end_request; + +typedef struct _fcgi_end_request_rec { + fcgi_header hdr; + fcgi_end_request body; +} fcgi_end_request_rec; + +/* FastCGI client API */ + +typedef struct _fcgi_request { + int listen_socket; + int fd; + int id; + int keep; + + int in_len; + int in_pad; + + fcgi_header *out_hdr; + unsigned char *out_pos; + unsigned char out_buf[1024*8]; + unsigned char reserved[sizeof(fcgi_end_request_rec)]; + + char *env[128]; +} fcgi_request; + +int fcgi_init(void); +int fcgi_is_fastcgi(void); +int fcgi_listen(const char *path, int backlog); +void fcgi_init_request(fcgi_request *req, int listen_socket); +int fcgi_accept_request(fcgi_request *req); +int fcgi_finish_request(fcgi_request *req); + +char* fcgi_getenv(fcgi_request *req, const char* var, int var_len); +void fcgi_putenv(fcgi_request *req, char* var, int var_len); + +int fcgi_read(fcgi_request *req, char *str, int len); + +int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int len); +int fcgi_flush(fcgi_request *req, int close); + +/* Some defines for limited libfcgi comatibility */ + +typedef struct _FCGX_Stream { + fcgi_request *req; + fcgi_request_type type; +} FCGX_Stream; + +typedef struct _FCGX_Request { + fcgi_request req; + FCGX_Stream in; + FCGX_Stream out; + FCGX_Stream err; + char **envp; +} FCGX_Request; + +#define FCGX_Init() +#define FCGX_IsCGI() (!fcgi_is_fastcgi()) +#define FCGX_OpenSocket(path, backlog) fcgi_listen(path, backlog) + +#define FCGX_InitRequest(r, sock, flags) \ + do { \ + fcgi_init_request(&(r)->req, sock); \ + (r)->in.req = &(r)->req; \ + (r)->out.req = &(r)->req; \ + (r)->err.req = &(r)->req; \ + (r)->in.type = FCGI_STDIN; \ + (r)->out.type = FCGI_STDOUT; \ + (r)->err.type = FCGI_STDERR; \ + (r)->envp = (r)->req.env; \ + } while (0); + + +#define FCGX_Accept_r(r) fcgi_accept_request(&(r)->req) +#define FCGX_Finish_r(r) fcgi_finish_request(&(r)->req) + +#define FCGX_PutStr(str, len, stream) fcgi_write((stream).req, (stream).type, str, len) +#define FCGX_PutS(str, len, stream) fcgi_write((stream).req, (stream).type, str, len) +#define FCGX_FFlush(stream) fcgi_flush((stream).req, 0) +#define FCGX_GetStr(str, len, stream) fcgi_read((stream).req, str, len) + +#define FCGX_GetParam(var, envp) fcgi_getenv_helper(envp, var, strlen(var)); + +#define FCGX_PutEnv(r, var) fcgi_putenv(&(r)->req, var, strlen(var)); + +int FCGX_FPrintF(FCGX_Stream stream, const char *format, ...); + +/* Internal helper functions. They shouldn't be used directly. */ + +char* fcgi_getenv_helper(char** env, const char *name, int len); + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: sw=4 ts=4 fdm=marker + * vim<600: sw=4 ts=4 + */ |