Hi,
Please find some FastCGI fixes to the trunk as attached. What it does:
* Put the managers into a one static table for all threads so it will
not be re-created all the time.
* Put the connection to blocking mode, this was done to make debugging
easier. It could be turned off later.
* Added fcgi_phase_finished to mark the session has ended after received
end-request from the server.
Index: fcgi_manager.c
===================================================================
--- fcgi_manager.c (revision 112)
+++ fcgi_manager.c (working copy)
@@ -150,7 +150,7 @@
ret = cherokee_socket_connect (fcgim->socket);
fcgim->connected = (ret == ret_ok);
- cherokee_fd_set_nonblocking (fcgim->socket->socket);
+ /*cherokee_fd_set_nonblocking (fcgim->socket->socket);*/
return ret;
}
@@ -278,6 +278,7 @@
ret_t
cherokee_fcgi_manager_unregister_conn (cherokee_fcgi_manager_t *fcgim, cherokee_connection_t *conn)
{
+ ret_t ret = ret_error;
int i;
/* Look for the connection reference
@@ -285,13 +286,14 @@
for (i=0; i<fcgim->conn_poll_size; i++) {
if (fcgim->conn_poll[i] == conn) {
fcgim->conn_poll[i] = NULL;
- return ret_ok;
+ ret = ret_ok;
+ break;
}
}
- TRACE (ENTRIES, "Manager unregistered %s\n", "");
+ TRACE (ENTRIES, "Manager unregistered\n", "");
- return ret_error;
+ return ret;
}
@@ -317,20 +319,19 @@
return ret_ok;
}
-/* static void */
-/* set_status (cherokee_fcgi_manager_t *fcgim, cherokee_fcgi_status_t status) */
-/* { */
-/* cherokee_handler_fastcgi_t *fcgi; */
-/* cherokee_connection_t *conn; */
-
-/* conn = fcgim->conn_poll [fcgim->request_id - 1]; */
-/* if (conn != NULL) { */
-/* fcgi = (cherokee_handler_fastcgi_t *) conn->handler; */
-/* if (fcgi != NULL) { */
-/* fcgi->status = status; */
-/* } */
-/* } */
-/* } */
+static void
+set_status (cherokee_fcgi_manager_t *fcgim, cherokee_fcgi_phase_t status)
+{
+ cherokee_handler_fastcgi_t *fcgi;
+ cherokee_connection_t *conn;
+ conn = fcgim->conn_poll [fcgim->request_id - 1];
+ if (conn != NULL) {
+ fcgi = (cherokee_handler_fastcgi_t *) conn->handler;
+ if (fcgi != NULL) {
+ fcgi->phase = status;
+ }
+ }
+}
static void
process_buffer (cherokee_fcgi_manager_t *fcgim, void *data, cuint_t data_len)
@@ -357,8 +358,9 @@
case FCGI_STDOUT:
cherokee_buffer_add (&fcgi->incoming_buffer, data, data_len);
-/* if (fcgim->remaining_size == 0) */
-/* set_status (fcgim, fcgi_data_available); */
+ /*cherokee_buffer_print_debug (&fcgi->incoming_buffer, -1);*/
+ /*if (fcgim->remaining_size == 0)
+ set_status (fcgim,);*/
break;
}
}
@@ -437,17 +439,20 @@
switch (fcgim->request_type) {
case FCGI_STDERR:
case FCGI_STDOUT:
+ ret = ret_ok;
if (len > 0)
process_buffer (fcgim, (start + offset), len);
break;
case FCGI_END_REQUEST:
+ ret = ret_ok;
end_request = (FCGI_EndRequestBody *) (start + offset);
fcgim->status = end_request->protocolStatus;
fcgim->return_value = end_request->appStatusB0 |
(end_request->appStatusB0 << 8) |
(end_request->appStatusB0 << 16) |
(end_request->appStatusB0 << 24);
+ set_status (fcgim, fcgi_phase_finished);
/* set_status (fcgim, fcgi_data_completed); */ // TODO !!!!
break;
@@ -472,7 +477,7 @@
ret_t
fcgi_manager_step (cherokee_fcgi_manager_t *fcgim, cuint_t id)
{
- ret_t ret;
+ ret_t ret = ret_eagain;
size_t size;
cherokee_connection_t *conn;
cherokee_handler_fastcgi_t *fcgi;
@@ -492,6 +497,8 @@
*/
if (fcgim->read_buffer.len < sizeof(FCGI_Header)) {
ret = cherokee_socket_read (fcgim->socket, &fcgim->read_buffer, DEFAULT_READ_SIZE, &size);
+ TRACE (ENTRIES, "Manager readed ID=%d ret=%d size=%d\n", id, ret, size);
+ /*cherokee_buffer_print_debug (&fcgim->read_buffer, -1);*/
switch (ret) {
case ret_ok:
break;
@@ -504,8 +511,6 @@
RET_UNKNOWN(ret);
return ret_error;
}
-
- TRACE (ENTRIES, "Manager readed ID=%d ret=%d size=%d\n", id, ret, size);
}
/* Process the information
Index: thread.c
===================================================================
--- thread.c (revision 112)
+++ thread.c (working copy)
@@ -46,6 +46,7 @@
#define DEBUG_BUFFER(b) fprintf(stderr, "%s:%d len=%d crc=%d\n", __FILE__, __LINE__, b->len, cherokee_buffer_crc32(b))
#define ENTRIES "core,thread"
+static cherokee_table_t *__fastcgi_managers = NULL;
static char *
phase_to_str (cherokee_connection_phase_t phase)
@@ -245,7 +246,8 @@
/* FastCGI managers
*/
- cherokee_table_init (&n->fastcgi_managers);
+ if (__fastcgi_managers == NULL)
+ cherokee_table_new (&__fastcgi_managers);
/* Return the object
*/
@@ -1097,9 +1099,9 @@
CHEROKEE_MUTEX_DESTROY (&thd->ownership);
/* FastCGI managers
- */
+ * /
cherokee_table_mrproper2 (&thd->fastcgi_managers,
- (cherokee_table_free_item_t) cherokee_fcgi_manager_free);
+ (cherokee_table_free_item_t) cherokee_fcgi_manager_free);*/
free (thd);
return ret_ok;
@@ -1705,3 +1707,13 @@
return ret_ok;
}
+
+ret_t
+cherokee_thread_get_fcgi_managers (cherokee_thread_t *thd, cherokee_table_t **table)
+{
+ *table = __fastcgi_managers;
+ if (__fastcgi_managers == NULL)
+ return ret_not_found;
+ else
+ return ret_ok;
+}
Index: thread.h
===================================================================
--- thread.h (revision 112)
+++ thread.h (working copy)
@@ -85,8 +85,6 @@
uint32_t recalculate;
} accept;
- cherokee_table_t fastcgi_managers;
-
} cherokee_thread_t;
#define THREAD(x) ((cherokee_thread_t *)(x))
@@ -121,5 +119,6 @@
int cherokee_thread_connection_num (cherokee_thread_t *thd);
ret_t cherokee_thread_close_all_connections (cherokee_thread_t *thd);
+ret_t cherokee_thread_get_fcgi_managers (cherokee_thread_t *thd, cherokee_table_t **table);
#endif /* CHEROKEE_THREAD_H */
Index: handler_fastcgi.c
===================================================================
--- handler_fastcgi.c (revision 112)
+++ handler_fastcgi.c (working copy)
@@ -131,6 +131,7 @@
ret_t
cherokee_handler_fastcgi_free (cherokee_handler_fastcgi_t *hdl)
{
+ TRACE (ENTRIES, "Cleaning up\n", "");
cherokee_fcgi_manager_unregister_conn (hdl->manager_ref, HANDLER_CONN(hdl));
cherokee_buffer_mrproper (&hdl->data);
@@ -370,7 +371,9 @@
ret_t ret;
cherokee_connection_t *conn = HANDLER_CONN(fcgi);
cherokee_thread_t *thread = HANDLER_THREAD(fcgi);
- cherokee_table_t *managers = &thread->fastcgi_managers;
+ cherokee_table_t *managers;
+
+ cherokee_thread_get_fcgi_managers (thread, &managers);
/* Read the current server and set the next one
*/
@@ -382,6 +385,7 @@
/* FastCGI manager
*/
ret = cherokee_table_get (managers, fcgi->configuration->host.buf, (void **)&fcgi->manager_ref);
+ TRACE (ENTRIES, "Checking manager: %p %d\n", managers, ret);
if (ret == ret_not_found) {
cherokee_fcgi_manager_t *n;
@@ -390,7 +394,7 @@
ret = cherokee_fcgi_manager_new (&n, fcgi->configuration);
if (unlikely (ret != ret_ok)) return ret;
- TRACE (ENTRIES, "Creating new manager \"%s\"\n", fcgi->configuration->host.buf);
+ TRACE (ENTRIES, "Creating new manager \"%s\" %p\n", fcgi->configuration->host.buf, n);
/* Assign the object to that path
*/
@@ -462,6 +466,9 @@
/* Read info from the FastCGI
*/
+ if (fcgi->phase == fcgi_phase_finished)
+ return ret_ok;
+
ret = cherokee_fcgi_manager_step (fcgim, fcgi->id);
switch (ret) {
case ret_error:
@@ -648,6 +655,7 @@
TRACE (ENTRIES, "Sending: there are %d bytes to be sent\n", fcgi->write_buffer.len);
+ cherokee_buffer_print_debug (&fcgi->write_buffer, -1);
ret = cherokee_fcgi_manager_send (fcgi->manager_ref, &fcgi->write_buffer, &size);
TRACE (ENTRIES, "Sending: now, there are %d bytes, had ret=%d\n", fcgi->write_buffer.len, ret);
@@ -801,6 +809,7 @@
tmp = end + (*end == 0 ? 0 : 2);
}
+ TRACE (ENTRIES, "Header processed\n", "");
return ret_ok;
}
@@ -870,6 +879,7 @@
if (cherokee_buffer_is_empty (&fcgi->incoming_buffer))
return ret_error;
+ TRACE (ENTRIES, "Adding headers, phase %s\n", "chopping headers");
/* Look the end of headers
*/
content = strstr (fcgi->incoming_buffer.buf, CRLF CRLF);
@@ -919,11 +929,14 @@
/* Lets read from the FastCGI server
*/
+ TRACE (ENTRIES, "Step, phase %s\n", "read fcgi");
ret = read_fcgi (fcgi);
switch (ret) {
case ret_ok:
- cherokee_buffer_add_buffer (buffer, &fcgi->incoming_buffer);
- cherokee_buffer_mrproper (&fcgi->incoming_buffer);
+ if (fcgi->incoming_buffer.len > 0) {
+ cherokee_buffer_add_buffer (buffer, &fcgi->incoming_buffer);
+ cherokee_buffer_mrproper (&fcgi->incoming_buffer);
+ }
return ret_ok;
case ret_error:
case ret_eagain:
Index: handler_fastcgi.h
===================================================================
--- handler_fastcgi.h (revision 112)
+++ handler_fastcgi.h (working copy)
@@ -67,7 +67,8 @@
fcgi_phase_init,
fcgi_phase_send_post,
fcgi_phase_send_header,
- fcgi_phase_read_fcgi
+ fcgi_phase_read_fcgi,
+ fcgi_phase_finished,
} cherokee_fcgi_phase_t;
_______________________________________________
Cherokee mailing list
[email protected]
http://www.alobbs.com/cgi-bin/mailman/listinfo/cherokee