summaryrefslogtreecommitdiff
path: root/modules/http2/h2_task_input.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/http2/h2_task_input.c')
-rw-r--r--modules/http2/h2_task_input.c228
1 files changed, 0 insertions, 228 deletions
diff --git a/modules/http2/h2_task_input.c b/modules/http2/h2_task_input.c
deleted file mode 100644
index 3993b6b4..00000000
--- a/modules/http2/h2_task_input.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/* Copyright 2015 greenbytes GmbH (https://www.greenbytes.de)
- *
- * 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.
- */
-
-#include <assert.h>
-
-#include <httpd.h>
-#include <http_core.h>
-#include <http_log.h>
-#include <http_connection.h>
-
-#include "h2_private.h"
-#include "h2_conn.h"
-#include "h2_mplx.h"
-#include "h2_request.h"
-#include "h2_session.h"
-#include "h2_stream.h"
-#include "h2_task_input.h"
-#include "h2_task.h"
-#include "h2_util.h"
-
-
-static int is_aborted(ap_filter_t *f)
-{
- return (f->c->aborted);
-}
-
-static int ser_header(void *ctx, const char *name, const char *value)
-{
- h2_task_input *input = (h2_task_input*)ctx;
- apr_brigade_printf(input->bb, NULL, NULL, "%s: %s\r\n", name, value);
- return 1;
-}
-
-h2_task_input *h2_task_input_create(h2_task *task, conn_rec *c)
-{
- h2_task_input *input = apr_pcalloc(task->pool, sizeof(h2_task_input));
- if (input) {
- input->task = task;
- input->bb = NULL;
- input->block = APR_BLOCK_READ;
-
- if (task->ser_headers) {
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, c,
- "h2_task_input(%s): serialize request %s %s",
- task->id, task->request->method, task->request->path);
- input->bb = apr_brigade_create(task->pool, c->bucket_alloc);
- apr_brigade_printf(input->bb, NULL, NULL, "%s %s HTTP/1.1\r\n",
- task->request->method, task->request->path);
- apr_table_do(ser_header, input, task->request->headers, NULL);
- apr_brigade_puts(input->bb, NULL, NULL, "\r\n");
- if (input->task->input_eos) {
- APR_BRIGADE_INSERT_TAIL(input->bb, apr_bucket_eos_create(c->bucket_alloc));
- }
- }
- else if (!input->task->input_eos) {
- input->bb = apr_brigade_create(task->pool, c->bucket_alloc);
- }
- else {
- /* We do not serialize and have eos already, no need to
- * create a bucket brigade. */
- }
- }
- return input;
-}
-
-void h2_task_input_block_set(h2_task_input *input, apr_read_type_e block)
-{
- input->block = block;
-}
-
-apr_status_t h2_task_input_read(h2_task_input *input,
- ap_filter_t* f,
- apr_bucket_brigade* bb,
- ap_input_mode_t mode,
- apr_read_type_e block,
- apr_off_t readbytes)
-{
- apr_status_t status = APR_SUCCESS;
- apr_off_t bblen = 0;
-
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, f->c,
- "h2_task_input(%s): read, block=%d, mode=%d, readbytes=%ld",
- input->task->id, block, mode, (long)readbytes);
-
- if (mode == AP_MODE_INIT) {
- return ap_get_brigade(f->c->input_filters, bb, mode, block, readbytes);
- }
-
- if (is_aborted(f)) {
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, f->c,
- "h2_task_input(%s): is aborted", input->task->id);
- return APR_ECONNABORTED;
- }
-
- if (input->bb) {
- status = apr_brigade_length(input->bb, 1, &bblen);
- if (status != APR_SUCCESS) {
- ap_log_cerror(APLOG_MARK, APLOG_WARNING, status, f->c,
- APLOGNO(02958) "h2_task_input(%s): brigade length fail",
- input->task->id);
- return status;
- }
- }
-
- if ((bblen == 0) && input->task->input_eos) {
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, f->c,
- "h2_task_input(%s): eos", input->task->id);
- return APR_EOF;
- }
-
- while (bblen == 0) {
- /* Get more data for our stream from mplx.
- */
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, f->c,
- "h2_task_input(%s): get more data from mplx, block=%d, "
- "readbytes=%ld, queued=%ld",
- input->task->id, block,
- (long)readbytes, (long)bblen);
-
- /* Override the block mode we get called with depending on the input's
- * setting.
- */
- status = h2_mplx_in_read(input->task->mplx, block,
- input->task->stream_id, input->bb,
- f->r? f->r->trailers_in : NULL,
- input->task->io);
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, f->c,
- "h2_task_input(%s): mplx in read returned",
- input->task->id);
- if (APR_STATUS_IS_EAGAIN(status)
- && (mode == AP_MODE_GETLINE || block == APR_BLOCK_READ)) {
- /* chunked input handling does not seem to like it if we
- * return with APR_EAGAIN from a GETLINE read...
- * upload 100k test on test-ser.example.org hangs */
- status = APR_SUCCESS;
- }
- else if (status != APR_SUCCESS) {
- return status;
- }
-
- status = apr_brigade_length(input->bb, 1, &bblen);
- if (status != APR_SUCCESS) {
- return status;
- }
-
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, f->c,
- "h2_task_input(%s): mplx in read, %ld bytes in brigade",
- input->task->id, (long)bblen);
- if (h2_task_logio_add_bytes_in) {
- h2_task_logio_add_bytes_in(f->c, bblen);
- }
- }
-
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, f->c,
- "h2_task_input(%s): read, mode=%d, block=%d, "
- "readbytes=%ld, queued=%ld",
- input->task->id, mode, block,
- (long)readbytes, (long)bblen);
-
- if (!APR_BRIGADE_EMPTY(input->bb)) {
- if (mode == AP_MODE_EXHAUSTIVE) {
- /* return all we have */
- status = h2_util_move(bb, input->bb, readbytes, NULL,
- "task_input_read(exhaustive)");
- }
- else if (mode == AP_MODE_READBYTES) {
- status = h2_util_move(bb, input->bb, readbytes, NULL,
- "task_input_read(readbytes)");
- }
- else if (mode == AP_MODE_SPECULATIVE) {
- /* return not more than was asked for */
- status = h2_util_copy(bb, input->bb, readbytes,
- "task_input_read(speculative)");
- }
- else if (mode == AP_MODE_GETLINE) {
- /* we are reading a single LF line, e.g. the HTTP headers */
- status = apr_brigade_split_line(bb, input->bb, block,
- HUGE_STRING_LEN);
- if (APLOGctrace1(f->c)) {
- char buffer[1024];
- apr_size_t len = sizeof(buffer)-1;
- apr_brigade_flatten(bb, buffer, &len);
- buffer[len] = 0;
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, f->c,
- "h2_task_input(%s): getline: %s",
- input->task->id, buffer);
- }
- }
- else {
- /* Hmm, well. There is mode AP_MODE_EATCRLF, but we chose not
- * to support it. Seems to work. */
- ap_log_cerror(APLOG_MARK, APLOG_ERR, APR_ENOTIMPL, f->c,
- APLOGNO(02942)
- "h2_task_input, unsupported READ mode %d", mode);
- status = APR_ENOTIMPL;
- }
-
- if (APLOGctrace1(f->c)) {
- apr_brigade_length(bb, 0, &bblen);
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, f->c,
- "h2_task_input(%s): return %ld data bytes",
- input->task->id, (long)bblen);
- }
- return status;
- }
-
- if (is_aborted(f)) {
- return APR_ECONNABORTED;
- }
-
- status = (block == APR_NONBLOCK_READ)? APR_EAGAIN : APR_EOF;
- ap_log_cerror(APLOG_MARK, APLOG_TRACE1, status, f->c,
- "h2_task_input(%s): no data", input->task->id);
- return status;
-}
-