aboutsummaryrefslogtreecommitdiff
path: root/src/event/ngx_event_pipe.h
blob: aef80de037d7a39ccd5f7f70d9e7dffc0a67aec8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#ifndef _NGX_EVENT_PIPE_H_INCLUDED_
#define _NGX_EVENT_PIPE_H_INCLUDED_


#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>


typedef struct ngx_event_pipe_s  ngx_event_pipe_t;

typedef int (*ngx_event_pipe_input_filter_pt)(ngx_event_pipe_t *p,
                                              ngx_hunk_t *hunk);
typedef int (*ngx_event_pipe_output_filter_pt)(void *data, ngx_chain_t *chain);


struct ngx_event_pipe_s {
    ngx_chain_t       *free_raw_hunks;
    ngx_chain_t       *in;
    ngx_chain_t      **last_in;

    ngx_chain_t       *out;
    ngx_chain_t      **last_out;

    ngx_chain_t       *free;
    ngx_chain_t       *busy;

    /*
     * the input filter i.e. that moves HTTP/1.1 chunks
     * from the raw hunks to an incoming chain
     */

    ngx_event_pipe_input_filter_pt    input_filter;
    void                              *input_ctx;

    ngx_event_pipe_output_filter_pt   output_filter;
    void                              *output_ctx;

    unsigned           read:1;
    unsigned           cachable:1;
    unsigned           upstream_done:1;
    unsigned           upstream_eof:1;
    unsigned           upstream_error:1;
    unsigned           downstream_done:1;
    unsigned           downstream_error:1;

    int                hunks;
    ngx_bufs_t         bufs;

    size_t             max_busy_len;

    off_t              temp_offset;
    off_t              max_temp_file_size;
    int                temp_file_write_size;

    ngx_connection_t  *upstream;
    ngx_connection_t  *downstream;

    ngx_pool_t        *pool;
    ngx_log_t         *log;

    ngx_chain_t       *preread_hunks;
    int                preread_size;

    ngx_file_t        *temp_file;
    ngx_path_t        *temp_path;
    char              *temp_file_warn;
};


int ngx_event_pipe(ngx_event_pipe_t *p, int do_write);
int ngx_event_pipe_copy_input_filter(ngx_event_pipe_t *p, ngx_hunk_t *hunk);


#endif /* _NGX_EVENT_PIPE_H_INCLUDED_ */