Hi,

This is the first patch for fcgi work. Of course this is not ready yet
as it only accepts one request (the connection between handler and fcgi
app is killed after first use).

HANDLER:
0. basic communication now works. every fcgi env variable must be sent
using one FCGI_PARAMS, hence I needed to change cgi.[c|h] API a bit.

before:
ret_t cherokee_cgi_build_basic_env (cherokee_connection_t       *conn,
                                    cherokee_cgi_set_env_pair_t
set_env_pair,
                                    cherokee_buffer_t           *tmp,
                                    void                        *param);


after:
ret_t cherokee_cgi_build_basic_env (cherokee_connection_t       *conn,
                                    cherokee_cgi_set_env_pair_t
set_env_pair,
                                    cherokee_buffer_t           *tmp,
                                    void                        *param,
            void                        *user_data);

is that ok?
one argument was added to pass user_data (fcgi handler in this case) to
set_snv_pair callback.

1. handler now reads and process all incoming data by itself, see
MANAGER.0

2. http header and content are now separated and handled

MANAGER:
0. removed unused read buffer and moved the reading function to handler.
the reason for this is that there is only one manager instance, hence
one read buffer, so this can't be done since the read buffer is used by
all handlers.


Questions:
0. what should be returned by handler_step if:
a. data is ready (ret_ok? or ret_eof?)
b. there is an error (ret_error?)
c. data is incomplete, to be retried (ret_eagain?)

1. how to print to log?

thanks!
Index: fcgi_manager.c
===================================================================
--- fcgi_manager.c	(revision 46)
+++ fcgi_manager.c	(working copy)
@@ -47,10 +47,7 @@
 
 	n->port = DEFAULT_PORT;
 	cherokee_buffer_init (&n->hostname);
-	cherokee_buffer_init (&n->read_buffer);
 
-	cherokee_buffer_ensure_size (&n->read_buffer, DEFAULT_READ_SIZE);
-
 	n->conn_poll_size = 0;
 	n->conn_poll      = (cherokee_connection_t **) malloc (
 		CONN_POLL_INCREMENT * sizeof(cherokee_connection_t *));
@@ -70,7 +67,6 @@
 cherokee_fcgi_manager_free (cherokee_fcgi_manager_t *fcgim)
 {
 	cherokee_buffer_mrproper (&fcgim->hostname);
-	cherokee_buffer_mrproper (&fcgim->read_buffer);
 
 	if (fcgim->socket != NULL) {
 		cherokee_socket_free (fcgim->socket);
@@ -208,7 +204,7 @@
 	fcgim->conn_poll[slot] = conn;
 
 	printf ("registered id=%d\n", slot);
-	*id = slot;
+	*id = slot + 1;
 	return ret_ok;
 }
 
@@ -243,75 +239,7 @@
 	return ret_ok;
 }
 
-
-static ret_t
-process_read_buffer (cherokee_fcgi_manager_t *fcgim)
-{
-	cuint_t      offset;
-	FCGI_Header *header;
-	
-	offset = 0;
-	while (fcgim->read_buffer.len - offset >= sizeof(FCGI_EndRequestRecord))
-	{
-		cuint_t id;
-		cuint_t len;
-
-		header = (FCGI_Header *)((&fcgim->read_buffer.buf) + offset);
-		id     = (header->requestIdB0 | (header->requestIdB1 << 8));
-		len    = (header->contentLengthB0 | (header->contentLengthB1 << 8)) + header->paddingLength;
-
-		switch (header->type) {
-		case FCGI_STDERR:
-			printf ("strerr\n");
-			break;
-		case FCGI_STDOUT:
-			printf ("stdout\n");
-			break;
-		case FCGI_END_REQUEST:
-			printf ("end request\n");
-			break;
-		default:
-			PRINT_ERROR ("ERROR: Unknown FCGI header type: %d\n", header->type);
-		}
-
-		offset += sizeof(FCGI_EndRequestRecord);
-	}
-
-	return ret_ok;
-}
-
-
 ret_t 
-cherokee_fcgi_manager_step (cherokee_fcgi_manager_t *fcgim)
-{
-	ret_t  ret;
-	size_t size;
-
-	/* Read from the FastCGI application	
-	 */
-	if (fcgim->read_buffer.len < sizeof(FCGI_Header)) 
-	{
-		ret = cherokee_socket_read (fcgim->socket, &fcgim->read_buffer, DEFAULT_READ_SIZE, &size);
-		printf ("cherokee_fcgi_manager_step: _read %d\n", ret);
-		if (ret != ret_ok) return ret;
-	}
-
-	/* Process the information
-	 */
-	if (fcgim->read_buffer.len >= sizeof(FCGI_Header))
-	{
-		ret = process_read_buffer (fcgim);
-		printf ("cherokee_fcgi_manager_step: process %d\n", ret);
-		return ret_ok;
-	}
-
-	/* Read
-	 */
-	return ret_eagain;
-}
-
-
-ret_t 
 cherokee_fcgi_manager_add_conn (cherokee_fcgi_manager_t *fcgim, cherokee_connection_t *conn)
 {
 	return ret_ok;
Index: fcgi_manager.h
===================================================================
--- fcgi_manager.h	(revision 46)
+++ fcgi_manager.h	(working copy)
@@ -37,8 +37,6 @@
 	int                      port;
 	cherokee_buffer_t        hostname;	   
 
-	cherokee_buffer_t        read_buffer;
-
 	/* Connections
 	 */
 	cherokee_connection_t  **conn_poll;
@@ -56,7 +54,6 @@
 ret_t cherokee_fcgi_manager_register_conn   (cherokee_fcgi_manager_t *fcgim, cherokee_connection_t *conn, cuint_t *id);
 ret_t cherokee_fcgi_manager_unregister_conn (cherokee_fcgi_manager_t *fcgim, cherokee_connection_t *conn);
 
-ret_t cherokee_fcgi_manager_step            (cherokee_fcgi_manager_t *fcgim);
 ret_t cherokee_fcgi_manager_send            (cherokee_fcgi_manager_t *fcgim, cherokee_buffer_t *info, size_t *sent);
 
 ret_t cherokee_fcgi_manager_add_conn        (cherokee_fcgi_manager_t *fcgim, cherokee_connection_t *conn);
Index: buffer.c
===================================================================
--- buffer.c	(revision 46)
+++ buffer.c	(working copy)
@@ -546,6 +546,7 @@
 cherokee_buffer_print_debug (cherokee_buffer_t *buf, int len)
 {
 	int i, length;
+  char text[17];
 
 	if ((len == -1) || (buf->len <= len)) {
 		length = buf->len;
@@ -553,20 +554,24 @@
 		length = len;
 	}
 
-
+  text [16] = 0;
 	for (i=0; i < length; i++) {
 		if (i%16 == 0) {
 			printf ("%08x ", i);
 		}
 
 		printf ("%02x", buf->buf[i] & 0xFF);
+    if (buf->buf[i] > ' ' &&  buf->buf[i] < 128)
+      text [i%16] = (char) buf->buf[i];
+    else
+      text [i%16] = '.';
 
 		if ((i+1)%2 == 0) {
 			printf (" ");
 		}
 
 		if ((i+1)%16 == 0) {
-			printf ("\n");
+			printf ("%s\n", text);
 		}
 
 		fflush(stdout);
Index: Makefile.am
===================================================================
--- Makefile.am	(revision 46)
+++ Makefile.am	(working copy)
@@ -179,7 +179,7 @@
 
 handler_fastcgi = \
 $(common_cgi) \
-fastcgi.h \
+cgi.c cgi.h fastcgi.h \
 handler_fastcgi.c \
 handler_fastcgi.h \
 fcgi_manager.h \
Index: handler_fastcgi.c
===================================================================
--- handler_fastcgi.c	(revision 46)
+++ handler_fastcgi.c	(working copy)
@@ -43,19 +43,17 @@
 static pthread_mutex_t   __global_fastcgi_managers_lock; 
 #endif
 
-
-
 static void
 fcgi_build_header (FCGI_Header *hdr, cuchar_t type, cushort_t request_id, cuint_t content_length, cuchar_t padding)
 {
 	hdr->version         = FCGI_VERSION_1;
 	hdr->type            = type;
-        hdr->requestIdB0     = (cuchar_t) request_id;
-        hdr->requestIdB1     = (cuchar_t) (request_id >> 8) & 0xff;
-        hdr->contentLengthB0 = (cuchar_t) (content_length % 256);
-        hdr->contentLengthB1 = (cuchar_t) (content_length / 256);
+  hdr->requestIdB0     = (cuchar_t) request_id;
+  hdr->requestIdB1     = (cuchar_t) (request_id >> 8) & 0xff;
+  hdr->contentLengthB0 = (cuchar_t) (content_length % 256);
+  hdr->contentLengthB1 = (cuchar_t) (content_length / 256);
 	hdr->paddingLength   = padding;
-        hdr->reserved        = 0;
+  hdr->reserved        = 0;
 }
 
 static void
@@ -63,7 +61,7 @@
 {
 	request->body.roleB0      = FCGI_RESPONDER;
 	request->body.roleB1      = 0;
-	request->body.flags       = FCGI_KEEP_CONN;
+	request->body.flags       = 0; /*FCGI_KEEP_CONN;*/
 	request->body.reserved[0] = 0;
 	request->body.reserved[1] = 0;
 	request->body.reserved[2] = 0;
@@ -97,10 +95,6 @@
 	n->host_ref        = NULL;
 	n->interpreter_ref = NULL;
 	
-	cherokee_buffer_init (&n->write_buffer);
-	cherokee_buffer_init (&n->incoming_buffer);
-	cherokee_buffer_init (&n->environment);
-
 	if (properties) {
 		cherokee_typed_table_get_str (properties, "server", &n->host_ref);
 		cherokee_typed_table_get_str (properties, "interpreter", &n->interpreter_ref);
@@ -125,34 +119,36 @@
 	return ret_ok;
 }
 
-
-
-
 static void
-add_env_pair (cherokee_buffer_t *buf, 
+add_env_pair (cherokee_buffer_t *buf, void *user_data,
 	      char *key, int key_len,
 	      char *val, int val_len)
 {
+  cherokee_handler_fastcgi_t *fcgi = (cherokee_handler_fastcgi_t *) user_data;
+  FCGI_BeginRequestRecord  request;
 	int len;
-
+ 
 	len  = key_len + val_len;
-        len += key_len > 127 ? 4 : 1;
-        len += val_len > 127 ? 4 : 1;
+  len += key_len > 127 ? 4 : 1;
+  len += val_len > 127 ? 4 : 1;
 
 	cherokee_buffer_ensure_size (buf, buf->len + key_len + val_len);
 
+  fcgi_build_header (&request.header, FCGI_PARAMS, fcgi->id, len, 0);
+	cherokee_buffer_add (buf, (void *)&request.header, sizeof(FCGI_Header));
+
 	if (key_len <= 127) {
 		buf->buf[buf->len++] = key_len;
-	} else {
+ 	} else {
 		buf->buf[buf->len++] = ((key_len >> 24) & 0xff) | 0x80;
 		buf->buf[buf->len++] =  (key_len >> 16) & 0xff;
 		buf->buf[buf->len++] =  (key_len >> 8)  & 0xff;
 		buf->buf[buf->len++] =  (key_len >> 0)  & 0xff;
-	}
+ 	}
 
 	if (val_len <= 127) {
 		buf->buf[buf->len++] = val_len;
-	} else {
+ 	} else {
 		buf->buf[buf->len++] = ((val_len >> 24) & 0xff) | 0x80;
 		buf->buf[buf->len++] =  (val_len >> 16) & 0xff;
 		buf->buf[buf->len++] =  (val_len >> 8)  & 0xff;
@@ -163,35 +159,33 @@
 	cherokee_buffer_add (buf, val, val_len);
 }
 
-
 static ret_t
 build_initial_packages (cherokee_handler_fastcgi_t *fcgi)
 {
 	ret_t                    ret;
-	cherokee_buffer_t        tmp = CHEROKEE_BUF_INIT;
+	cherokee_buffer_t        tmp = CHEROKEE_BUF_INIT, write_tmp;
 	cherokee_connection_t   *conn;
 	FCGI_BeginRequestRecord  request;
 
 	conn = HANDLER_CONN(fcgi);
 
-
 	/* FCGI_BEGIN_REQUEST
 	 */
 	fcgi_build_header (&request.header, FCGI_BEGIN_REQUEST, fcgi->id, sizeof(request.body), 0);
-	fcgi_build_request_body (&request.body);
+	fcgi_build_request_body (&request);
 	cherokee_buffer_add (&fcgi->write_buffer, (void *)&request, sizeof(FCGI_BeginRequestRecord));
-
+  
 	/* Add enviroment variables
-	 */
-	ret = cherokee_cgi_build_basic_env (conn, (cherokee_cgi_set_env_pair_t) add_env_pair, &tmp, &fcgi->write_buffer);
+	 */ 
+  cherokee_buffer_init (&tmp);
+  cherokee_buffer_init (&write_tmp);
+	ret = cherokee_cgi_build_basic_env (conn, (cherokee_cgi_set_env_pair_t) add_env_pair, &tmp, &write_tmp, fcgi);
 	if (unlikely (ret != ret_ok)) return ret;
-
+ 
+	cherokee_buffer_add_buffer (&fcgi->write_buffer, &write_tmp);
 	cherokee_buffer_mrproper (&tmp);
+  cherokee_buffer_mrproper (&write_tmp);
 
-	fcgi_build_header (&request.header, FCGI_PARAMS, fcgi->id, tmp.size, 0);
-	cherokee_buffer_add (&fcgi->write_buffer, (void *)&request.header, sizeof(FCGI_Header));
-	cherokee_buffer_add_buffer (&fcgi->write_buffer, &tmp);
-
 	/* There aren't more parameters
 	 */
 	fcgi_build_header (&request.header, FCGI_PARAMS, fcgi->id, 0, 0);
@@ -218,6 +212,11 @@
 		return ret_error;
 	}
 
+  cherokee_buffer_init (&fcgi->write_buffer);
+	cherokee_buffer_init (&fcgi->incoming_buffer);
+  cherokee_buffer_init (&fcgi->data);
+	cherokee_buffer_init (&fcgi->environment);
+
 	/* Look for the FCGI managers table
 	 */
 	CHEROKEE_MUTEX_LOCK (&__global_fastcgi_managers_lock);
@@ -244,11 +243,15 @@
 
 		/* Launch a new FastCGI server and connect to it
 		 */
-		ret = cherokee_fcgi_manager_spawn_srv (n, fcgi->interpreter_ref);
-		if (unlikely (ret != ret_ok)) return ret;
+		
+		ret = cherokee_fcgi_manager_connect_to_srv (n, fcgi->host_ref);
+		if (unlikely (ret != ret_ok)) {
+      ret = cherokee_fcgi_manager_spawn_srv (n, fcgi->interpreter_ref);
+      if (unlikely (ret != ret_ok)) return ret;
 
-		ret = cherokee_fcgi_manager_connect_to_srv (n, fcgi->host_ref);
-		if (unlikely (ret != ret_ok)) return ret_error;
+      ret = cherokee_fcgi_manager_connect_to_srv (n, fcgi->host_ref);
+		  if (unlikely (ret != ret_ok)) return ret_error;
+    }
 	}
 
 	CHEROKEE_MUTEX_UNLOCK (&__global_fastcgi_managers_lock);
@@ -267,22 +270,60 @@
 	return ret_ok;
 }
 
+static ret_t
+process_read_buffer (cherokee_handler_fastcgi_t *fcgi, cherokee_buffer_t *buffer)
+{
+	cuint_t      offset;
+	FCGI_Header *header;
 
+	offset = 0;
+  
+	while (fcgi->incoming_buffer.len - offset >= sizeof(FCGI_EndRequestRecord))
+	{
+		cuint_t id;
+		cuint_t len;
+    void    *start = fcgi->incoming_buffer.buf + offset;
+
+		header = (FCGI_Header *) start;
+		id     = (header->requestIdB0 | (header->requestIdB1 << 8));
+		len    = (header->contentLengthB0 | (header->contentLengthB1 << 8)) + header->paddingLength;
+
+    offset += len + FCGI_HEADER_LEN;  
+
+		switch (header->type) {
+		case FCGI_STDERR:
+			printf ("strerr\n");
+			break;
+		case FCGI_STDOUT:
+			printf ("stdout\n");
+      cherokee_buffer_add (buffer, (start + FCGI_HEADER_LEN), len);
+			break;
+		case FCGI_END_REQUEST:
+			printf ("end request\n");
+      cherokee_buffer_mrproper (&fcgi->incoming_buffer);
+			return ret_ok;
+		default:
+			PRINT_ERROR ("ERROR: Unknown FCGI header type: %d\n", header->type);
+      return ret_error;
+		}
+	}
+
+  cherokee_buffer_move_to_begin (&fcgi->incoming_buffer, offset);
+	return ret_ok;
+}
+
+
+static
 ret_t 
-cherokee_handler_fastcgi_step (cherokee_handler_fastcgi_t *fcgi, cherokee_buffer_t *buffer)
+read_fcgi (cherokee_handler_fastcgi_t *fcgi, cherokee_buffer_t *buffer)
 {
-	ret_t ret;
-	size_t done;
+  ret_t  ret;
+	size_t size;
 
-	return_if_fail (fcgi->manager_ref != NULL, ret_error);
-
-
-	printf ("cherokee_handler_fastcgi_step: begin\n");
-	
 	/* It has something to send
 	 */
 	if (! cherokee_buffer_is_empty (&fcgi->write_buffer)) {
-		ret = cherokee_fcgi_manager_send (fcgi->manager_ref, &fcgi->write_buffer, &done);
+		ret = cherokee_fcgi_manager_send (fcgi->manager_ref, &fcgi->write_buffer, &size);
 		printf ("cherokee_handler_fastcgi_step: !empty, send: %d\n", ret);
 		switch (ret) {
 		case ret_ok:
@@ -295,6 +336,7 @@
 			return ret_eagain;
 
 		case ret_eof:
+      break;
 		case ret_error:
 			return ret_error;
 		default:
@@ -302,21 +344,107 @@
 		}
 	}
 
-	/* Lets read from the FastCGI server
-	 * As side effect it could update more connections in this call
+	/* Read from the FastCGI application	
 	 */
-	ret = cherokee_fcgi_manager_step (fcgi->manager_ref);
-	printf ("cherokee_handler_fastcgi_step: manager_step: %d\n", ret);
+	if (fcgi->incoming_buffer.len < sizeof(FCGI_Header)) 
+	{
+		ret = cherokee_socket_read (fcgi->manager_ref->socket, &fcgi->incoming_buffer, DEFAULT_READ_SIZE, &size);
+    /*cherokee_buffer_print_debug (&fcgi->incoming_buffer, -1);*/
+		if (ret != ret_ok) return ret;
+	}
 
-	// To continue..
+	/* Process the information
+	 */
+	if (fcgi->incoming_buffer.len >= sizeof(FCGI_Header))
+	{
+		ret = process_read_buffer (fcgi, buffer);
+		printf ("cherokee_fcgi_manager_step: process %d\n", ret);
+		return ret;
+	}
 
-	return ret_ok;
+	/* Read
+	 */
+	return ret_eagain;
 }
 
+ret_t 
+cherokee_handler_fastcgi_step (cherokee_handler_fastcgi_t *fcgi, cherokee_buffer_t *buffer)
+{
+	ret_t ret;
 
+  if (!cherokee_buffer_is_empty (&fcgi->data))
+  {
+    cherokee_buffer_add_buffer (buffer, &fcgi->data);
+    cherokee_buffer_mrproper (&fcgi->data);
+    return ret_ok;
+  }
+
+	/* Lets read from the FastCGI server
+	 */
+	ret = read_fcgi (fcgi, buffer);
+
+  return ret;
+}
+
+
 ret_t 
-cherokee_handler_fastcgi_add_headers (cherokee_handler_fastcgi_t *hdl, cherokee_buffer_t *buffer)
+cherokee_handler_fastcgi_add_headers (cherokee_handler_fastcgi_t *fcgi, cherokee_buffer_t *buffer)
 {
+  ret_t ret;
+
+	int    len;
+	char  *content;
+	int    end_len;
+
+	/* Sanity check
+	 */
+	return_if_fail (buffer != NULL, ret_error);
+
+	/* Read information from the FCGI
+	 */
+	ret = read_fcgi (fcgi, &fcgi->data);
+
+	switch (ret) {
+	case ret_ok:
+	case ret_eof:
+		break;
+
+	case ret_error:
+	case ret_eagain:
+		return ret;
+
+	default:
+		RET_UNKNOWN(ret);
+		return ret_error;
+	}
+
+  cherokee_buffer_print_debug (&fcgi->data, -1);
+	/* Look the end of headers
+	 */ 
+	content = strstr (fcgi->data.buf, CRLF CRLF);
+	if (content != NULL) {
+		end_len = 4;
+	} else {
+		content = strstr (fcgi->data.buf, "\n\n");
+		end_len = 2;
+	}
+
+	if (content == NULL) {
+		return (ret == ret_eof) ? ret_eof : ret_eagain;
+	}
+
+	/* Copy the header
+	 */
+	len = content - fcgi->data.buf;	
+
+	cherokee_buffer_ensure_size (buffer, len+6);
+	cherokee_buffer_add (buffer, fcgi->data.buf, len);
+	cherokee_buffer_add (buffer, CRLF CRLF, 4);
+	
+	/* Drop out the headers, we already have a copy
+	 */
+	cherokee_buffer_move_to_begin (&fcgi->data, len + end_len);
+
 	return ret_ok;
 }
 
@@ -325,7 +453,7 @@
  */
 
 void  
-fastcgi_init (cherokee_module_loader_t *loader)
+cherokee_module_fastcgi_init (cherokee_module_loader_t *loader)
 {
 	PRINT_ERROR_S ("WARNING: The FastCGI is under development, it isn't ready to be used!\n");
 
Index: handler_fastcgi.h
===================================================================
--- handler_fastcgi.h	(revision 46)
+++ handler_fastcgi.h	(working copy)
@@ -72,6 +72,7 @@
 	cherokee_buffer_t        environment;
 	cherokee_buffer_t        write_buffer;
 	cherokee_buffer_t        incoming_buffer;
+  cherokee_buffer_t        data;
 
 } cherokee_handler_fastcgi_t;
 
Index: handler_cgi.c
===================================================================
--- handler_cgi.c	(revision 46)
+++ handler_cgi.c	(working copy)
@@ -271,7 +271,7 @@
 	 */
 	ret = cherokee_cgi_build_basic_env (conn, 
 					    (cherokee_cgi_set_env_pair_t) cherokee_handler_cgi_add_env_pair, 
-					    &tmp, cgi);
+					    &tmp, cgi, NULL);
 	if (unlikely (ret != ret_ok)) return ret;
 
 	/* Set SCRIPT_NAME
Index: cgi.c
===================================================================
--- cgi.c	(revision 46)
+++ cgi.c	(working copy)
@@ -37,7 +37,8 @@
 cherokee_cgi_build_basic_env (cherokee_connection_t       *conn,
 			      cherokee_cgi_set_env_pair_t  set_env_pair, 
 			      cherokee_buffer_t           *tmp,
-			      void                        *param)
+			      void                        *param,
+            void                        *user_data)
 {
 	int                r;
 	ret_t              ret;
@@ -53,17 +54,17 @@
 
 	/* Set the basic variables
 	 */
-	set_env_pair (param, "SERVER_SIGNATURE",  16, "<address>Cherokee web server</address>", 38);
-	set_env_pair (param, "SERVER_SOFTWARE",   15, "Cherokee " PACKAGE_VERSION, 9 + sizeof(PACKAGE_VERSION));
-	set_env_pair (param, "GATEWAY_INTERFACE", 17, "CGI/1.1", 7);
-	set_env_pair (param, "PATH",               4, "/bin:/usr/bin:/sbin:/usr/sbin", 29);
+	set_env_pair (param, user_data, "SERVER_SIGNATURE",  16, "<address>Cherokee web server</address>", 38);
+	set_env_pair (param, user_data, "SERVER_SOFTWARE",   15, "Cherokee " PACKAGE_VERSION, 9 + sizeof(PACKAGE_VERSION));
+	set_env_pair (param, user_data, "GATEWAY_INTERFACE", 17, "CGI/1.1", 7);
+	set_env_pair (param, user_data, "PATH",               4, "/bin:/usr/bin:/sbin:/usr/sbin", 29);
 
 	/* Servers MUST supply this value to scripts. The QUERY_STRING
 	 * value is case-sensitive. If the Script-URI does not include a
 	 * query component, the QUERY_STRING metavariable MUST be defined
 	 * as an empty string ("").
 	 */
-	set_env_pair (param, "DOCUMENT_ROOT", 13, conn->local_directory->buf, conn->local_directory->len);
+	set_env_pair (param, user_data, "DOCUMENT_ROOT", 13, conn->local_directory->buf, conn->local_directory->len);
 
 	/* The IP address of the client sending the request to the
 	 * server. This is not necessarily that of the user agent (such
@@ -71,7 +72,7 @@
 	 */
 	memset (remote_ip, 0, sizeof(remote_ip));
 	cherokee_socket_ntop (conn->socket, remote_ip, sizeof(remote_ip)-1);
-	set_env_pair (param, "REMOTE_ADDR", 11, remote_ip, strlen(remote_ip));
+	set_env_pair (param, user_data, "REMOTE_ADDR", 11, remote_ip, strlen(remote_ip));
 
 	/* HTTP_HOST and SERVER_NAME. The difference between them is that
 	 * HTTP_HOST can include the �:PORT� text, and SERVER_NAME only
@@ -79,12 +80,12 @@
 	 */
 	cherokee_header_copy_known (conn->header, header_host, tmp);
 	if (! cherokee_buffer_is_empty(tmp)) {
-		set_env_pair (param, "HTTP_HOST", 9, tmp->buf, tmp->len);
+		set_env_pair (param, user_data, "HTTP_HOST", 9, tmp->buf, tmp->len);
 
 		p = strchr (tmp->buf, ':');
 		if (p != NULL) *p = '\0';
 
-		set_env_pair (param, "SERVER_NAME", 11, tmp->buf, tmp->len);
+		set_env_pair (param, user_data, "SERVER_NAME", 11, tmp->buf, tmp->len);
 	}
 
 	/* Cookies :-)
@@ -92,7 +93,7 @@
 	cherokee_buffer_clean (tmp);
 	ret = cherokee_header_copy_unknown (conn->header, "Cookie", 6, tmp);
 	if (ret == ret_ok) {
-		set_env_pair (param, "HTTP_COOKIE", 11, tmp->buf, tmp->len);
+		set_env_pair (param, user_data, "HTTP_COOKIE", 11, tmp->buf, tmp->len);
 	}
 
 	/* User Agent
@@ -100,7 +101,7 @@
 	cherokee_buffer_clean (tmp);
 	ret = cherokee_header_copy_known (conn->header, header_user_agent, tmp);
 	if (ret == ret_ok) {
-		set_env_pair (param, "HTTP_USER_AGENT", 15, tmp->buf, tmp->len);
+		set_env_pair (param, user_data, "HTTP_USER_AGENT", 15, tmp->buf, tmp->len);
 	}
 
 	/* Content-type and Content-lenght (if available) 
@@ -108,41 +109,41 @@
 	cherokee_buffer_clean (tmp);
 	ret = cherokee_header_copy_unknown (conn->header, "Content-Type", 12, tmp);
 	if (ret == ret_ok)
-		set_env_pair (param, "CONTENT_TYPE", 12, tmp->buf, tmp->len);
+		set_env_pair (param, user_data, "CONTENT_TYPE", 12, tmp->buf, tmp->len);
 
 	cherokee_buffer_clean (tmp); 
 	ret = cherokee_header_copy_known (conn->header, header_content_length, tmp);
 	if (ret == ret_ok)
-		set_env_pair (param, "CONTENT_LENGTH", 14, tmp->buf, tmp->len);
+		set_env_pair (param, user_data, "CONTENT_LENGTH", 14, tmp->buf, tmp->len);
 
 	/* If there is a query_string, set the environment variable
 	 */
 	if (conn->query_string->len > 0) 
-		set_env_pair (param, "QUERY_STRING", 12, conn->query_string->buf, conn->query_string->len);
+		set_env_pair (param, user_data, "QUERY_STRING", 12, conn->query_string->buf, conn->query_string->len);
 	else
-		set_env_pair (param, "QUERY_STRING", 12, "", 0);
+		set_env_pair (param, user_data, "QUERY_STRING", 12, "", 0);
 
 	/* Set the server port
 	 */
 	r = snprintf (temp, temp_size, "%d", CONN_SRV(conn)->port);
-	set_env_pair (param, "SERVER_PORT", 11, temp, r);
+	set_env_pair (param, user_data, "SERVER_PORT", 11, temp, r);
 
 	/* Set the HTTP version
 	 */
 	ret = cherokee_http_version_to_string (conn->header->version, &p_const, &p_len);
 	if (ret >= ret_ok)
-		set_env_pair (param, "SERVER_PROTOCOL", 15, (char *)p_const, p_len);
+		set_env_pair (param, user_data, "SERVER_PROTOCOL", 15, (char *)p_const, p_len);
 
 	/* Set the method
 	 */
 	ret = cherokee_http_method_to_string (conn->header->method, &p_const, &p_len);
 	if (ret >= ret_ok)
-		set_env_pair (param, "REQUEST_METHOD", 14, (char *)p_const, p_len);
+		set_env_pair (param, user_data, "REQUEST_METHOD", 14, (char *)p_const, p_len);
 
 	/* Remote user
 	 */
 	if (conn->validator && !cherokee_buffer_is_empty (&conn->validator->user)) {
-		set_env_pair (param, "REMOTE_USER", 11, conn->validator->user.buf, conn->validator->user.len);
+		set_env_pair (param, user_data, "REMOTE_USER", 11, conn->validator->user.buf, conn->validator->user.len);
 	}
 
 	/* Set the host name
@@ -151,7 +152,7 @@
 		p = strchr (conn->host->buf, ':');
 		if (p != NULL) *p = '\0';
 		
-		set_env_pair (param, "SERVER_NAME", 11, conn->host->buf, conn->host->len);
+		set_env_pair (param, user_data, "SERVER_NAME", 11, conn->host->buf, conn->host->len);
 
 		if (p != NULL) *p = ':';
 	}
@@ -159,14 +160,14 @@
 	/* Set PATH_INFO 
 	 */
 	if (! cherokee_buffer_is_empty(conn->pathinfo)) {
-		set_env_pair (param, "PATH_INFO", 9, conn->pathinfo->buf, conn->pathinfo->len);
+		set_env_pair (param, user_data, "PATH_INFO", 9, conn->pathinfo->buf, conn->pathinfo->len);
 	}
 
 	/* Set REQUEST_URI 
 	 */
 	cherokee_buffer_clean (tmp);
 	cherokee_header_copy_request_w_args (conn->header, tmp);
-	set_env_pair (param, "REQUEST_URI", 11, tmp->buf, tmp->len);
+	set_env_pair (param, user_data, "REQUEST_URI", 11, tmp->buf, tmp->len);
 
 	return ret_ok;
 }
Index: cgi.h
===================================================================
--- cgi.h	(revision 46)
+++ cgi.h	(working copy)
@@ -29,11 +29,12 @@
 #include "connection.h"
 
 
-typedef void (* cherokee_cgi_set_env_pair_t) (void *param, char *key, int key_len, char *val, int val_len);
+typedef void (* cherokee_cgi_set_env_pair_t) (void *param, void *user_data, char *key, int key_len, char *val, int val_len);
 
 ret_t cherokee_cgi_build_basic_env (cherokee_connection_t       *conn,
 				    cherokee_cgi_set_env_pair_t  set_env_pair, 
 				    cherokee_buffer_t           *tmp,
-				    void                        *param);
+				    void                        *param,
+            void                        *user_data);
 
 #endif /* CHEROKEE_CGI_H */
_______________________________________________
Cherokee mailing list
[email protected]
http://www.alobbs.com/cgi-bin/mailman/listinfo/cherokee

Reply via email to