You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by pq...@apache.org on 2005/12/23 06:38:57 UTC
svn commit: r358719 -
/httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c
Author: pquerna
Date: Thu Dec 22 21:38:51 2005
New Revision: 358719
URL: http://svn.apache.org/viewcvs?rev=358719&view=rev
Log:
- Add defines for most common FastCGI values.
- Add basic structures, defined in the FastCGI Spec.
- Write a request to the server.
Modified:
httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c
Modified: httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c?rev=358719&r1=358718&r2=358719&view=diff
==============================================================================
--- httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c (original)
+++ httpd/httpd/branches/fcgi-proxy-dev/modules/proxy/mod_proxy_fcgi.c Thu Dec 22 21:38:51 2005
@@ -79,6 +79,51 @@
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 @@
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;
}