blob: 6a32433f2b0c82743d72397440e430f6f49ebb10 [file] [log] [blame]
/* ====================================================================
* 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 */