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);