diff options
Diffstat (limited to 'fluent-bit/lib/monkey/plugins/fastcgi/fcgi_handler.h')
-rw-r--r-- | fluent-bit/lib/monkey/plugins/fastcgi/fcgi_handler.h | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/fluent-bit/lib/monkey/plugins/fastcgi/fcgi_handler.h b/fluent-bit/lib/monkey/plugins/fastcgi/fcgi_handler.h new file mode 100644 index 000000000..a0083ac7d --- /dev/null +++ b/fluent-bit/lib/monkey/plugins/fastcgi/fcgi_handler.h @@ -0,0 +1,128 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ + +/* Monkey HTTP Server + * ================== + * Copyright 2001-2017 Eduardo Silva <eduardo@monkey.io> + * + * Licensed 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 MK_FASTCGI_HANDLER_H +#define MK_FASTCGI_HANDLER_H + +#include <monkey/mk_api.h> + +/* + * Based on the information provided by the FastCGI spec, we use the + * following adapted structures: + * + * http://www.fastcgi.com/drupal/node/6?q=node/22 + */ +struct fcgi_record_header { + uint8_t version; + uint8_t type; + uint16_t request_id; + uint16_t content_length; + uint8_t padding_length; + uint8_t reserved; +}; + +struct fcgi_begin_request_body { + uint16_t role; + uint8_t flags; + uint8_t reserved[5]; +}; + +struct fcgi_begin_request_record { + struct fcgi_record_header header; + struct fcgi_begin_request_body body; +}; + +#define FCGI_VERSION_1 1 +#define FCGI_RECORD_MAX_SIZE 65535 +#define FCGI_RECORD_HEADER_SIZE sizeof(struct fcgi_record_header) +#define FCGI_BUF_SIZE FCGI_RECORD_MAX_SIZE + FCGI_RECORD_HEADER_SIZE +#define FCGI_BEGIN_REQUEST_BODY_SIZE sizeof(struct fcgi_begin_request_body) +#define FCGI_RESPONDER 1 +#define FCGI_AUTHORIZER 2 +#define FCGI_FILTER 3 + +/* + * 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 + +/* + * FastCGI Handler context, it keeps information of states and other + * request/response references. + */ +struct fcgi_handler { + struct mk_event event; /* built-in event-loop data */ + + int server_fd; /* backend FastCGI server */ + int chunked; /* chunked response ? */ + int active; /* is this handler active ? */ + int hangup; /* hangup connection once ready ? */ + int headers_set; /* headers set ? */ + int eof; /* exiting: MK_TRUE / MK_FALSE */ + + /* stdin data */ + uint64_t stdin_length; + uint64_t stdin_offset; + char *stdin_buffer; + + struct mk_http_session *cs; /* HTTP session context */ + struct mk_http_request *sr; /* HTTP request context */ + + /* FastCGI */ + struct fcgi_begin_request_record header_request; + + uint64_t write_rounds; + unsigned int buf_len; + char buf_data[FCGI_BUF_SIZE]; + + /* Channel to stream request to the FCGI server */ + struct mk_channel fcgi_channel; + struct mk_stream fcgi_stream; + + struct mk_iov *iov; + struct mk_list _head; + + /* TCP connection context */ + struct mk_net_connection *conn; +}; + +static inline void fcgi_encode16(void *a, unsigned b) +{ + unsigned char *c = a; + + c[0] = (unsigned char) (b >> 8); + c[1] = (unsigned char) b; +} + +struct fcgi_handler *fcgi_handler_new(struct mk_plugin *plugin, + struct mk_http_session *cs, + struct mk_http_request *sr); + +int fcgi_exit(struct fcgi_handler *handler); + +#endif |