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