protocols/fcgi_protocol.h (130 lines of code) (raw):

/* ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * ==================================================================== */ #ifndef SERF_PROTOCOL_FCGI_PROTOCOL_H #define SERF_PROTOCOL_FCGI_PROTOCOL_H #include "serf_bucket_types.h" #ifdef _DEBUG #include <assert.h> #define SERF_FCGI_assert(x) assert(x) #else #define SERF_FCGI_assert(x) ((void)0) #endif #ifdef __cplusplus extern "C" { #endif typedef struct serf_fcgi_protocol_t serf_fcgi_protocol_t; typedef struct serf_fcgi_stream_data_t serf_fcgi_stream_data_t; #define FCGI_FRAMETYPE(version, type) \ ( ( (apr_uint16_t)(unsigned char)(version) << 8) \ | ( (apr_uint16_t)(unsigned char)(type))) #define FCGI_V1 0x1 /* From protocol specs */ /* * Listening socket file number */ #define FCGI_LISTENSOCK_FILENO 0 typedef struct FCGI_Header { unsigned char version; unsigned char type; unsigned char requestIdB1; unsigned char requestIdB0; unsigned char contentLengthB1; unsigned char contentLengthB0; unsigned char paddingLength; unsigned char reserved; } FCGI_Header; /* * Number of bytes in a FCGI_Header. Future versions of the protocol * will not reduce this number. */ #define FCGI_HEADER_LEN 8 /* * Value for version component of FCGI_Header */ #define FCGI_VERSION_1 1 /* * Values for type component of FCGI_Header */ #define FCGI_BEGIN_REQUEST 1 #define FCGI_ABORT_REQUEST 2 #define FCGI_END_REQUEST 3 #define FCGI_PARAMS 4 #define FCGI_STDIN 5 #define FCGI_STDOUT 6 #define FCGI_STDERR 7 #define FCGI_DATA 8 #define FCGI_GET_VALUES 9 #define FCGI_GET_VALUES_RESULT 10 #define FCGI_UNKNOWN_TYPE 11 #define FCGI_MAXTYPE (FCGI_UNKNOWN_TYPE) /* * Value for requestId component of FCGI_Header */ #define FCGI_NULL_REQUEST_ID 0 typedef struct FCGI_BeginRequestBody { unsigned char roleB1; unsigned char roleB0; unsigned char flags; unsigned char reserved[5]; } FCGI_BeginRequestBody; typedef struct FCGI_BeginRequestRecord { FCGI_Header header; FCGI_BeginRequestBody body; } FCGI_BeginRequestRecord; /* * Mask for flags component of FCGI_BeginRequestBody */ #define FCGI_KEEP_CONN 1 /* * Values for role component of FCGI_BeginRequestBody */ #define FCGI_RESPONDER 1 #define FCGI_AUTHORIZER 2 #define FCGI_FILTER 3 typedef struct FCGI_EndRequestBody { unsigned char appStatusB3; unsigned char appStatusB2; unsigned char appStatusB1; unsigned char appStatusB0; unsigned char protocolStatus; unsigned char reserved[3]; } FCGI_EndRequestBody; typedef struct FCGI_EndRequestRecord { FCGI_Header header; FCGI_EndRequestBody body; } FCGI_EndRequestRecord; /* * Values for protocolStatus component of FCGI_EndRequestBody */ #define FCGI_REQUEST_COMPLETE 0 #define FCGI_CANT_MPX_CONN 1 #define FCGI_OVERLOADED 2 #define FCGI_UNKNOWN_ROLE 3 /* * Variable names for FCGI_GET_VALUES / FCGI_GET_VALUES_RESULT records */ #define FCGI_MAX_CONNS "FCGI_MAX_CONNS" #define FCGI_MAX_REQS "FCGI_MAX_REQS" #define FCGI_MPXS_CONNS "FCGI_MPXS_CONNS" typedef struct FCGI_UnknownTypeBody { unsigned char type; unsigned char reserved[7]; } FCGI_UnknownTypeBody; typedef struct FCGI_UnknownTypeRecord { FCGI_Header header; FCGI_UnknownTypeBody body; } FCGI_UnknownTypeRecord; /**************************************************/ typedef struct serf_fcgi_stream_t { struct serf_fcgi_protocol_t *fcgi; serf_bucket_alloc_t *alloc; apr_uint16_t streamid; apr_uint16_t role; /* Opaque implementation details */ serf_fcgi_stream_data_t *data; /* Linked list of currently existing streams */ struct serf_fcgi_stream_t *next; struct serf_fcgi_stream_t *prev; } serf_fcgi_stream_t; typedef apr_status_t(*serf_fcgi_processor_t)(void *baton, serf_fcgi_protocol_t *fcgi, serf_bucket_t *body); /* From fcgi_protocol.c */ serf_fcgi_stream_t * serf_fcgi__stream_get(serf_fcgi_protocol_t *fcgi, apr_uint16_t streamid, bool create); 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); apr_status_t serf_fcgi__enqueue_frame(serf_fcgi_protocol_t *fcgi, serf_bucket_t *frame, bool flush); void serf_fcgi__close_stream(serf_fcgi_protocol_t *fcgi, serf_fcgi_stream_t *stream); /* From fcgi_stream.c */ serf_fcgi_stream_t * serf_fcgi__stream_create(serf_fcgi_protocol_t *fcgi, apr_uint16_t streamid, serf_bucket_alloc_t *alloc); apr_status_t serf_fcgi__stream_processor(void *baton, serf_fcgi_protocol_t *fcgi, serf_bucket_t *body); 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); void serf_fcgi__stream_destroy(serf_fcgi_stream_t *stream); #ifdef __cplusplus } #endif #endif /* !SERF_PROTOCOL_FCGI_PROTOCOL_H */