1e18a033bSKonstantin Ananyev
2e18a033bSKonstantin Ananyev/*
3e18a033bSKonstantin Ananyev * Copyright (C) Igor Sysoev
4e18a033bSKonstantin Ananyev * Copyright (C) Nginx, Inc.
5e18a033bSKonstantin Ananyev */
6e18a033bSKonstantin Ananyev
7e18a033bSKonstantin Ananyev
8e18a033bSKonstantin Ananyev#ifndef _NGX_EVENT_PIPE_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_EVENT_PIPE_H_INCLUDED_
10e18a033bSKonstantin Ananyev
11e18a033bSKonstantin Ananyev
12e18a033bSKonstantin Ananyev#include <ngx_config.h>
13e18a033bSKonstantin Ananyev#include <ngx_core.h>
14e18a033bSKonstantin Ananyev#include <ngx_event.h>
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyev
17e18a033bSKonstantin Ananyevtypedef struct ngx_event_pipe_s  ngx_event_pipe_t;
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_event_pipe_input_filter_pt)(ngx_event_pipe_t *p,
20e18a033bSKonstantin Ananyev                                                    ngx_buf_t *buf);
21e18a033bSKonstantin Ananyevtypedef ngx_int_t (*ngx_event_pipe_output_filter_pt)(void *data,
22e18a033bSKonstantin Ananyev                                                     ngx_chain_t *chain);
23e18a033bSKonstantin Ananyev
24e18a033bSKonstantin Ananyev
25e18a033bSKonstantin Ananyevstruct ngx_event_pipe_s {
26e18a033bSKonstantin Ananyev    ngx_connection_t  *upstream;
27e18a033bSKonstantin Ananyev    ngx_connection_t  *downstream;
28e18a033bSKonstantin Ananyev
29e18a033bSKonstantin Ananyev    ngx_chain_t       *free_raw_bufs;
30e18a033bSKonstantin Ananyev    ngx_chain_t       *in;
31e18a033bSKonstantin Ananyev    ngx_chain_t      **last_in;
32e18a033bSKonstantin Ananyev
33e18a033bSKonstantin Ananyev    ngx_chain_t       *writing;
34e18a033bSKonstantin Ananyev
35e18a033bSKonstantin Ananyev    ngx_chain_t       *out;
36e18a033bSKonstantin Ananyev    ngx_chain_t       *free;
37e18a033bSKonstantin Ananyev    ngx_chain_t       *busy;
38e18a033bSKonstantin Ananyev
39e18a033bSKonstantin Ananyev    /*
40e18a033bSKonstantin Ananyev     * the input filter i.e. that moves HTTP/1.1 chunks
41e18a033bSKonstantin Ananyev     * from the raw bufs to an incoming chain
42e18a033bSKonstantin Ananyev     */
43e18a033bSKonstantin Ananyev
44e18a033bSKonstantin Ananyev    ngx_event_pipe_input_filter_pt    input_filter;
45e18a033bSKonstantin Ananyev    void                             *input_ctx;
46e18a033bSKonstantin Ananyev
47e18a033bSKonstantin Ananyev    ngx_event_pipe_output_filter_pt   output_filter;
48e18a033bSKonstantin Ananyev    void                             *output_ctx;
49e18a033bSKonstantin Ananyev
50e18a033bSKonstantin Ananyev#if (NGX_THREADS || NGX_COMPAT)
51e18a033bSKonstantin Ananyev    ngx_int_t                       (*thread_handler)(ngx_thread_task_t *task,
52e18a033bSKonstantin Ananyev                                                      ngx_file_t *file);
53e18a033bSKonstantin Ananyev    void                             *thread_ctx;
54e18a033bSKonstantin Ananyev    ngx_thread_task_t                *thread_task;
55e18a033bSKonstantin Ananyev#endif
56e18a033bSKonstantin Ananyev
57e18a033bSKonstantin Ananyev    unsigned           read:1;
58e18a033bSKonstantin Ananyev    unsigned           cacheable:1;
59e18a033bSKonstantin Ananyev    unsigned           single_buf:1;
60e18a033bSKonstantin Ananyev    unsigned           free_bufs:1;
61e18a033bSKonstantin Ananyev    unsigned           upstream_done:1;
62e18a033bSKonstantin Ananyev    unsigned           upstream_error:1;
63e18a033bSKonstantin Ananyev    unsigned           upstream_eof:1;
64e18a033bSKonstantin Ananyev    unsigned           upstream_blocked:1;
65e18a033bSKonstantin Ananyev    unsigned           downstream_done:1;
66e18a033bSKonstantin Ananyev    unsigned           downstream_error:1;
67e18a033bSKonstantin Ananyev    unsigned           cyclic_temp_file:1;
68e18a033bSKonstantin Ananyev    unsigned           aio:1;
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyev    ngx_int_t          allocated;
71e18a033bSKonstantin Ananyev    ngx_bufs_t         bufs;
72e18a033bSKonstantin Ananyev    ngx_buf_tag_t      tag;
73e18a033bSKonstantin Ananyev
74e18a033bSKonstantin Ananyev    ssize_t            busy_size;
75e18a033bSKonstantin Ananyev
76e18a033bSKonstantin Ananyev    off_t              read_length;
77e18a033bSKonstantin Ananyev    off_t              length;
78e18a033bSKonstantin Ananyev
79e18a033bSKonstantin Ananyev    off_t              max_temp_file_size;
80e18a033bSKonstantin Ananyev    ssize_t            temp_file_write_size;
81e18a033bSKonstantin Ananyev
82e18a033bSKonstantin Ananyev    ngx_msec_t         read_timeout;
83e18a033bSKonstantin Ananyev    ngx_msec_t         send_timeout;
84e18a033bSKonstantin Ananyev    ssize_t            send_lowat;
85e18a033bSKonstantin Ananyev
86e18a033bSKonstantin Ananyev    ngx_pool_t        *pool;
87e18a033bSKonstantin Ananyev    ngx_log_t         *log;
88e18a033bSKonstantin Ananyev
89e18a033bSKonstantin Ananyev    ngx_chain_t       *preread_bufs;
90e18a033bSKonstantin Ananyev    size_t             preread_size;
91e18a033bSKonstantin Ananyev    ngx_buf_t         *buf_to_file;
92e18a033bSKonstantin Ananyev
93e18a033bSKonstantin Ananyev    size_t             limit_rate;
94e18a033bSKonstantin Ananyev    time_t             start_sec;
95e18a033bSKonstantin Ananyev
96e18a033bSKonstantin Ananyev    ngx_temp_file_t   *temp_file;
97e18a033bSKonstantin Ananyev
98e18a033bSKonstantin Ananyev    /* STUB */ int     num;
99e18a033bSKonstantin Ananyev};
100e18a033bSKonstantin Ananyev
101e18a033bSKonstantin Ananyev
102e18a033bSKonstantin Ananyevngx_int_t ngx_event_pipe(ngx_event_pipe_t *p, ngx_int_t do_write);
103e18a033bSKonstantin Ananyevngx_int_t ngx_event_pipe_copy_input_filter(ngx_event_pipe_t *p, ngx_buf_t *buf);
104e18a033bSKonstantin Ananyevngx_int_t ngx_event_pipe_add_free_buf(ngx_event_pipe_t *p, ngx_buf_t *b);
105e18a033bSKonstantin Ananyev
106e18a033bSKonstantin Ananyev
107e18a033bSKonstantin Ananyev#endif /* _NGX_EVENT_PIPE_H_INCLUDED_ */
108