--- Begin Message ---
Hi,
Pada hari Sabtu, tanggal 15/10/2005 pukul 19:16 +0100, Alvaro Lopez
Ortega menulis:
> I have been reading this code, but it does not make much sense for
> me. It seems like you want to have an extra pointer in
> set_env_pair(), but what is its purpose?
I need to pass fcgi handler to set_env_pair, or at least fcgi->id to
build the environment buffer. Each env must be prefixed with FCGI_PARAMS
header. (However in fcgi spec we can see only one FCGI_PARAMS for -all-
environment variables, but it doesnt work)
> With FastCGI many connections can share a single connection to the
> FastCGI. It multiplexes all that information in a single stream,
> that is why there is IDs in the packages. The purpose of the
I see, now I have moved them again back to the manager side, now it
multiplex the buffer to be sent and demultiplex the data from fcgi
server. I use CHEROKEE_MUTEX_LOCK there to mark it as critical sections
(there are two of them, one is for sending, and one is for processing
the data).
fcgi_manager_step returns immediately if there is a response from fcgi
server which has not being picked up by handler. then handler would
reset the buffer after pick the data and return it to the main thread.
I have played it with ab (from apache stock) and had this result with
500 requests:
Server Software: Cherokee/0.4.27b2
Server Hostname: 127.0.0.1
Server Port: 8000
Document Path: /test.fcgi
Document Length: 4211 bytes
Concurrency Level: 1
Time taken for tests: 0.515189 seconds
Complete requests: 500
Failed requests: 0
Write errors: 0
Total transferred: 2172500 bytes
HTML transferred: 2105500 bytes
Requests per second: 970.52 [#/sec] (mean)
Time per request: 1.030 [ms] (mean)
Time per request: 1.030 [ms] (mean, across all concurrent
requests)
Transfer rate: 4116.94 [Kbytes/sec] received
However when I increased the concurrency level to more than 4, after
processing some requests, it stucked in
ret = cherokee_socket_read (fcgim->socket, &fcgim->read_buffer,
DEFAULT_READ_SIZE, &size);
(fcgi_manager.c:327)
any hints?
> > Questions:
> > 0. what should be returned by handler_step if:
> > a. data is ready (ret_ok? or ret_eof?)
>
> ret_eagain
> > b. there is an error (ret_error?)
>
> If it is a terminal error for the connection:
>
> cnt->error_code = ...;
> return ret_error;
>
> > c. data is incomplete, to be retried (ret_eagain?)
>
> If you got some data to be send, just put it on the buffer and
> return ret_ok
how to escape the step? what value should be returned?
> > 1. how to print to log?
>
> Do you want to log the connections? If so, do not do it; It should
> not do it from a handler.
>
> If what you want to write information about that FastCGI server
> state or something like that, you can use:
>
> cherokee_logger_write_string (CONN_VSRV(HANDLER_CONN(handler))->logger,
> "%s", whatever);
>
is this similar to apache writing to error_log?
thanks!
Index: fcgi_manager.c
===================================================================
--- fcgi_manager.c (revision 51)
+++ fcgi_manager.c (working copy)
@@ -48,6 +48,7 @@
n->port = DEFAULT_PORT;
cherokee_buffer_init (&n->hostname);
cherokee_buffer_init (&n->read_buffer);
+ n->request_id = 0;
cherokee_buffer_ensure_size (&n->read_buffer, DEFAULT_READ_SIZE);
@@ -208,7 +209,7 @@
fcgim->conn_poll[slot] = conn;
printf ("registered id=%d\n", slot);
- *id = slot;
+ *id = slot + 1;
return ret_ok;
}
@@ -247,52 +248,84 @@
static ret_t
process_read_buffer (cherokee_fcgi_manager_t *fcgim)
{
- cuint_t offset;
+ ret_t ret = ret_eagain;
+ cuint_t len;
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;
+ /* There are still some data in read_buffer */
+ if (fcgim->remaining_size > 0) {
+ if (fcgim->remaining_size > fcgim->read_buffer.len) {
+ len = fcgim->remaining_size - fcgim->read_buffer.len;
+ fcgim->remaining_size -= len;
+ }
+ cherokee_buffer_add (&fcgim->request_buffer, fcgim->read_buffer.buf, len);
+ fcgim->last_offset += len;
+ ret = ret_ok;
+ } else {
+ cuint_t id;
+ void *start = fcgim->read_buffer.buf + fcgim->last_offset;
+ fcgim->remaining_size = 0;
+
+ header = (FCGI_Header *) start;
+ fcgim->request_id = (header->requestIdB0 | (header->requestIdB1 << 8));
+ fcgim->request_type = header->type;
+ len = (header->contentLengthB0 | (header->contentLengthB1 << 8));
+
+ if (len > (fcgim->read_buffer.size - FCGI_HEADER_LEN)) {
+ fcgim->remaining_size = len - fcgim->read_buffer.len - FCGI_HEADER_LEN;
+ len = fcgim->read_buffer.size - FCGI_HEADER_LEN;
+ }
+ fcgim->last_offset += len + FCGI_HEADER_LEN + header->paddingLength;
+
+ ret = ret_ok;
switch (header->type) {
case FCGI_STDERR:
- printf ("strerr\n");
+ cherokee_buffer_add (&fcgim->request_buffer, (start + FCGI_HEADER_LEN), len);
break;
case FCGI_STDOUT:
- printf ("stdout\n");
+ if (len > 0)
+ cherokee_buffer_add (&fcgim->request_buffer, (start + FCGI_HEADER_LEN), len);
+ else
+ ret = ret_eof;
break;
case FCGI_END_REQUEST:
- printf ("end request\n");
- break;
+ ret = ret_ok;
+ break;
default:
PRINT_ERROR ("ERROR: Unknown FCGI header type: %d\n", header->type);
+ ret = ret_error;
}
-
- offset += sizeof(FCGI_EndRequestRecord);
}
- return ret_ok;
+ if (fcgim->last_offset >= fcgim->read_buffer.len) {
+ cherokee_buffer_mrproper (&fcgim->read_buffer);
+ fcgim->last_offset = 0;
+ }
+
+ return ret;
}
-
ret_t
cherokee_fcgi_manager_step (cherokee_fcgi_manager_t *fcgim)
{
ret_t ret;
size_t size;
+ /* Data is ready please pick it up */
+ if (fcgim->request_id != 0) {
+ printf ("data is ready for %d\n", fcgim->request_id);
+ return ret_ok;
+ }
+
/* Read from the FastCGI application
*/
if (fcgim->read_buffer.len < sizeof(FCGI_Header))
{
+ printf ("start %d\n", fcgim->read_buffer.len);
+ fcgim->last_offset = 0;
ret = cherokee_socket_read (fcgim->socket, &fcgim->read_buffer, DEFAULT_READ_SIZE, &size);
- printf ("cherokee_fcgi_manager_step: _read %d\n", ret);
+ printf ("read %d\n", size);
if (ret != ret_ok) return ret;
}
@@ -301,8 +334,7 @@
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;
+ return ret;
}
/* Read
@@ -310,7 +342,6 @@
return ret_eagain;
}
-
ret_t
cherokee_fcgi_manager_add_conn (cherokee_fcgi_manager_t *fcgim, cherokee_connection_t *conn)
{
Index: fcgi_manager.h
===================================================================
--- fcgi_manager.h (revision 51)
+++ fcgi_manager.h (working copy)
@@ -39,6 +39,13 @@
cherokee_buffer_t read_buffer;
+ int request_type;
+ cuint_t request_id;
+ cherokee_buffer_t request_buffer;
+
+ cuint_t last_offset;
+ cuint_t remaining_size;
+
/* Connections
*/
cherokee_connection_t **conn_poll;
Index: buffer.c
===================================================================
--- buffer.c (revision 51)
+++ buffer.c (working copy)
@@ -547,6 +547,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;
@@ -554,20 +555,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 51)
+++ 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 51)
+++ 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
@@ -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,12 @@
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);
+ fcgi->ended = 0;
+
/* Look for the FCGI managers table
*/
CHEROKEE_MUTEX_LOCK (&__global_fastcgi_managers_lock);
@@ -244,11 +244,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,34 +271,32 @@
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;
+ cherokee_fcgi_manager_t *fcgim;
- return_if_fail (fcgi->manager_ref != NULL, ret_error);
-
-
- printf ("cherokee_handler_fastcgi_step: begin\n");
-
+ fcgim = fcgi->manager_ref;
+
/* 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);
+ CHEROKEE_MUTEX_LOCK (&__global_fastcgi_managers_lock);
+ ret = cherokee_fcgi_manager_send (fcgi->manager_ref, &fcgi->write_buffer, &size);
+ CHEROKEE_MUTEX_UNLOCK (&__global_fastcgi_managers_lock);
printf ("cherokee_handler_fastcgi_step: !empty, send: %d\n", ret);
switch (ret) {
case ret_ok:
- if (cherokee_buffer_is_empty (&fcgi->write_buffer))
- return ret_eagain;
+ break;
- return ret_ok;
-
case ret_eagain:
return ret_eagain;
case ret_eof:
+ break;
case ret_error:
return ret_error;
default:
@@ -302,21 +304,122 @@
}
}
+
+ CHEROKEE_MUTEX_LOCK (&__global_fastcgi_managers_lock);
+ printf ("%d\n", fcgi->id);
+ ret = cherokee_fcgi_manager_step (fcgim);
+ CHEROKEE_MUTEX_UNLOCK (&__global_fastcgi_managers_lock);
+
+ if (ret == ret_ok) {
+ if (fcgim->request_id == fcgi->id) {
+ /* pick the data */
+ printf ("X %d %d %d %d\n", fcgim->request_type, fcgim->request_id, ret, fcgim->read_buffer.len);
+ switch (fcgim->request_type) {
+ case FCGI_STDOUT:
+ cherokee_buffer_add_buffer (buffer, &fcgim->request_buffer);
+
+ ret = ret_eagain;
+ case FCGI_STDERR:
+ ret = ret_eagain;
+ break;
+ case FCGI_END_REQUEST:
+ fcgi->ended = 1;
+ cherokee_buffer_mrproper (&fcgim->request_buffer);
+ ret = ret_ok;
+ break;
+ }
+ fcgim->request_id = 0;
+ return ret;
+ }
+ }
+
+ /* Read
+ */
+ return ret_eagain;
+}
+
+ret_t
+cherokee_handler_fastcgi_step (cherokee_handler_fastcgi_t *fcgi, cherokee_buffer_t *buffer)
+{
+ ret_t ret = ret_ok;
+
+ 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
- * As side effect it could update more connections in this call
*/
- ret = cherokee_fcgi_manager_step (fcgi->manager_ref);
- printf ("cherokee_handler_fastcgi_step: manager_step: %d\n", ret);
+ printf ("S\n");
+ if (fcgi->ended == 0)
+ ret = read_fcgi (fcgi, buffer);
+ else
+ ret = ret_ok;
- // To continue..
-
- return ret_ok;
+ 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
+ */
+ printf ("H %d\n", fcgi->id);
+ 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;
+ }
+
+ /* 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 +428,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 51)
+++ handler_fastcgi.h (working copy)
@@ -72,6 +72,8 @@
cherokee_buffer_t environment;
cherokee_buffer_t write_buffer;
cherokee_buffer_t incoming_buffer;
+ cherokee_buffer_t data;
+ cuint_t ended;
} cherokee_handler_fastcgi_t;
Index: handler_cgi.c
===================================================================
--- handler_cgi.c (revision 51)
+++ 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 51)
+++ 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 51)
+++ 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
--- End Message ---