Author: rhuijben
Date: Tue Nov 17 13:44:24 2015
New Revision: 1714783

URL: http://svn.apache.org/viewvc?rev=1714783&view=rev
Log:
Hook up incoming requests over fcgi to the incoming client infrastructure.
This bring the incoming request to the callbacks registered by the serf api
user (such as serf_httpd.c)

* protocols/fcgi_protocol.c
  (fcgi_process): Pass config.
  (serf_fcgi__setup_incoming_request): New function.

* protocols/fcgi_protocol.h
  (serf_fcgi__setup_incoming_request): New function.
  (serf_fcgi__stream_handle_params,
   serf_fcgi__stream_handle_stdin): Add config arguments.

* protocols/fcgi_stream.c
  (fcgi_stream_enqueue_response): New function.
  (stream_setup_request): New function. Extracted from caller.
  (serf_fcgi__stream_handle_params,
   serf_fcgi__stream_handle_stdin): Use stream_setup_request.

Modified:
    serf/trunk/protocols/fcgi_protocol.c
    serf/trunk/protocols/fcgi_protocol.h
    serf/trunk/protocols/fcgi_stream.c

Modified: serf/trunk/protocols/fcgi_protocol.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/protocols/fcgi_protocol.c?rev=1714783&r1=1714782&r2=1714783&view=diff
==============================================================================
--- serf/trunk/protocols/fcgi_protocol.c (original)
+++ serf/trunk/protocols/fcgi_protocol.c Tue Nov 17 13:44:24 2015
@@ -260,6 +260,7 @@ static apr_status_t fcgi_process(serf_fc
                     }
 
                     body = serf_fcgi__stream_handle_params(stream, body,
+                                                           fcgi->config,
                                                            fcgi->allocator);
 
                     if (body) {
@@ -280,6 +281,7 @@ static apr_status_t fcgi_process(serf_fc
                     }
 
                     body = serf_fcgi__stream_handle_stdin(stream, body,
+                                                          fcgi->config,
                                                           fcgi->allocator);
 
                     if (body) {
@@ -406,6 +408,22 @@ serf_fcgi__stream_get(serf_fcgi_protocol
     return NULL;
 }
 
+apr_status_t serf_fcgi__setup_incoming_request(
+    serf_incoming_request_t **in_request,
+    serf_incoming_request_setup_t *req_setup,
+    void **req_setup_baton,
+    serf_fcgi_protocol_t *fcgi)
+{
+    if (!fcgi->client)
+        return SERF_ERROR_FCGI_PROTOCOL_ERROR;
+
+    *in_request = serf__incoming_request_create(fcgi->client);
+    *req_setup = fcgi->client->req_setup;
+    *req_setup_baton = fcgi->client->req_setup_baton;
+
+    return APR_SUCCESS;
+}
+
 
 /* --------------- connection support --------------- */
 static apr_status_t fcgi_outgoing_read(serf_connection_t *conn)

Modified: serf/trunk/protocols/fcgi_protocol.h
URL: 
http://svn.apache.org/viewvc/serf/trunk/protocols/fcgi_protocol.h?rev=1714783&r1=1714782&r2=1714783&view=diff
==============================================================================
--- serf/trunk/protocols/fcgi_protocol.h (original)
+++ serf/trunk/protocols/fcgi_protocol.h Tue Nov 17 13:44:24 2015
@@ -189,6 +189,13 @@ serf_fcgi_stream_t * serf_fcgi__stream_g
                                            bool move_first);
 
 
+apr_status_t serf_fcgi__setup_incoming_request(
+    serf_incoming_request_t **in_request,
+    serf_incoming_request_setup_t *req_setup,
+    void **req_setup_baton,
+    serf_fcgi_protocol_t *fcgi);
+
+
 /* From fcgi_stream.c */
 serf_fcgi_stream_t * serf_fcgi__stream_create(serf_fcgi_protocol_t *fcgi,
                                               apr_uint16_t streamid,
@@ -200,10 +207,12 @@ apr_status_t serf_fcgi__stream_processor
 
 serf_bucket_t * serf_fcgi__stream_handle_params(serf_fcgi_stream_t *stream,
                                                 serf_bucket_t *body,
+                                                serf_config_t *config,
                                                 serf_bucket_alloc_t *alloc);
 
 serf_bucket_t * serf_fcgi__stream_handle_stdin(serf_fcgi_stream_t *stream,
                                                serf_bucket_t *body,
+                                               serf_config_t *config,
                                                serf_bucket_alloc_t *alloc);
 
 

Modified: serf/trunk/protocols/fcgi_stream.c
URL: 
http://svn.apache.org/viewvc/serf/trunk/protocols/fcgi_stream.c?rev=1714783&r1=1714782&r2=1714783&view=diff
==============================================================================
--- serf/trunk/protocols/fcgi_stream.c (original)
+++ serf/trunk/protocols/fcgi_stream.c Tue Nov 17 13:44:24 2015
@@ -72,16 +72,81 @@ static apr_status_t stream_agg_eof(void
     return APR_EOF;
 }
 
+static apr_status_t
+fcgi_stream_enqueue_response(serf_incoming_request_t *request,
+                             void *enqueue_baton,
+                             serf_bucket_t *response_bkt)
+{
+    return APR_SUCCESS;
+}
+
+static apr_status_t
+stream_setup_request(serf_fcgi_stream_t *stream,
+                      serf_config_t *config)
+{
+    serf_bucket_t *agg;
+    apr_status_t status;
+
+    agg = serf_bucket_aggregate_create(stream->alloc);
+    serf_bucket_aggregate_hold_open(agg, stream_agg_eof, stream);
+
+    serf_bucket_set_config(agg, config);
+    stream->data->req_agg = agg;
+
+    if (stream->data->request) {
+        serf_request_t *request = stream->data->request;
+
+        if (!request->resp_bkt) {
+            apr_pool_t *scratch_pool = request->respool; /* ### Pass scratch 
pool */
+
+            request->resp_bkt = request->acceptor(request, agg,
+                                                  request->acceptor_baton,
+                                                  scratch_pool);
+        }
+    }
+    else {
+        serf_incoming_request_t *in_request = stream->data->in_request;
+
+        if (!in_request) {
+            serf_incoming_request_setup_t req_setup;
+            void *req_setup_baton;
+
+            status = serf_fcgi__setup_incoming_request(&in_request, &req_setup,
+                                                       &req_setup_baton,
+                                                       stream->fcgi);
+
+            if (status)
+                return status;
+
+            stream->data->in_request = in_request;
+
+            status = req_setup(&in_request->req_bkt, agg,
+                               in_request, req_setup_baton,
+                               &in_request->handler,
+                               &in_request->handler_baton,
+                               &in_request->response_setup,
+                               &in_request->response_setup_baton,
+                               in_request->pool);
+
+            if (status)
+                return status;
+
+            in_request->enqueue_response = fcgi_stream_enqueue_response;
+            in_request->enqueue_baton = stream;
+        }
+    }
+
+    return APR_SUCCESS;
+}
+
 serf_bucket_t * serf_fcgi__stream_handle_params(serf_fcgi_stream_t *stream,
                                                 serf_bucket_t *body,
+                                                serf_config_t *config,
                                                 serf_bucket_alloc_t *alloc)
 {
     apr_size_t remaining;
     if (!stream->data->req_agg) {
-        stream->data->req_agg = serf_bucket_aggregate_create(stream->alloc);
-
-        serf_bucket_aggregate_hold_open(stream->data->req_agg,
-                                        stream_agg_eof, stream);
+        stream_setup_request(stream, config);
     }
 
     remaining = (apr_size_t)serf_bucket_get_remaining(body);
@@ -101,15 +166,13 @@ serf_bucket_t * serf_fcgi__stream_handle
 
 serf_bucket_t * serf_fcgi__stream_handle_stdin(serf_fcgi_stream_t *stream,
                                                serf_bucket_t *body,
+                                               serf_config_t *config,
                                                serf_bucket_alloc_t *alloc)
 {
     apr_size_t remaining;
     SERF_FCGI_assert(stream->data->headers_eof);
     if (!stream->data->req_agg) {
-        stream->data->req_agg = serf_bucket_aggregate_create(stream->alloc);
-
-        serf_bucket_aggregate_hold_open(stream->data->req_agg,
-                                        stream_agg_eof, stream);
+        stream_setup_request(stream, config);
     }
 
     remaining = (apr_size_t)serf_bucket_get_remaining(body);


Reply via email to