From e4a4585a1debfc2974b76e19635cc9a57d2cecad Mon Sep 17 00:00:00 2001 From: Paul Querna Date: Fri, 23 Dec 2005 05:38:51 +0000 Subject: [PATCH] - Add defines for most common FastCGI values. - Add basic structures, defined in the FastCGI Spec. - Write a request to the server. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/fcgi-proxy-dev@358719 13f79535-47bb-0310-9956-ffa450edef68 --- modules/proxy/mod_proxy_fcgi.c | 84 +++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/modules/proxy/mod_proxy_fcgi.c b/modules/proxy/mod_proxy_fcgi.c index 6d006a6fd0..06233aa3d2 100644 --- a/modules/proxy/mod_proxy_fcgi.c +++ b/modules/proxy/mod_proxy_fcgi.c @@ -79,6 +79,51 @@ static int proxy_fcgi_canon(request_rec *r, char *url) return OK; } +#define FCGI_VERSION 1 + +#define FCGI_BEGIN_REQUEST 1 +#define FCGI_ABORT_REQUEST 2 +#define FCGI_END_REQUEST 3 +#define FCGI_PARAMS 4 +#define FCGI_STDIN 5 +#define FCGI_STDOUT 6 +#define FCGI_STDERR 7 +#define FCGI_DATA 8 +#define FCGI_GET_VALUES 9 +#define FCGI_GET_VALUES_RESULT 10 +#define FCGI_UNKNOWN_TYPE 11 +#define FCGI_MAXTYPE (FCGI_UNKNOWN_TYPE) + +typedef struct { + 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; + +/* + * Mask for flags component of FCGI_BeginRequestBody + */ +#define FCGI_KEEP_CONN 1 + +/* + * Values for role component of FCGI_BeginRequestBody + */ +#define FCGI_RESPONDER 1 +#define FCGI_AUTHORIZER 2 +#define FCGI_FILTER 3 + +typedef struct { + unsigned char roleB1; + unsigned char roleB0; + unsigned char flags; + unsigned char reserved[5]; +} fcgi_begin_request_body; + /* * process the request and write the response. */ @@ -89,7 +134,44 @@ static int fcgi_do_request(apr_pool_t *p, request_rec *r, apr_uri_t *uri, char *url, char *server_portstr) { - /* TODO: Talk to a FastCGI Backend */ + apr_status_t rv; + + { + struct iovec vec[2]; + fcgi_header header; + fcgi_begin_request_body brb; + + /* Step 1: Send FCGI_BEGIN_REQUEST */ + header.version = FCGI_VERSION; + header.type = FCGI_BEGIN_REQUEST; + header.requestIdB1 = ((1 >> 8) & 0xff); + header.requestIdB0 = ((1) & 0xff); + header.contentLengthB1 = ((sizeof(brb) >> 8) & 0xff); + header.contentLengthB0 = ((sizeof(brb)) & 0xff); + header.paddingLength = 0; + + brb.roleB1 = ((FCGI_RESPONDER >> 8) & 0xff); + brb.roleB0 = ((FCGI_RESPONDER) & 0xff); + brb.flags = FCGI_KEEP_CONN; + + vec[0].iov_base = &header; + vec[0].iov_len = sizeof(header); + vec[1].iov_base = &brb; + vec[1].iov_len = sizeof(brb); + + rv = apr_socket_sendv(conn->sock, vec, 2, NULL); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, r->server, + "proxy: FCGI: Failed Writing Request to %s:", server_portstr); + } + } + + /* Step 2: Send Enviroment via FCGI_PARAMS */ + /* Step 3: Send Request Body via FCGI_STDIN */ + /* Step 4: Read for CGI_STDOUT|CGI_STDERR */ + /* Step 5: Parse reply headers. */ + /* Step 6: Stream reply body. */ + /* Step 7: Read FCGI_END_REQUEST -> Done */ return HTTP_SERVICE_UNAVAILABLE; } -- 2.50.1