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