1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 #ifndef _HTTP_INTERNAL_H_
  11 #define _HTTP_INTERNAL_H_
  12 
  13 #include "event2/event_struct.h"
  14 #include "util-internal.h"
  15 #include "defer-internal.h"
  16 
  17 #define HTTP_CONNECT_TIMEOUT    45
  18 #define HTTP_WRITE_TIMEOUT      50
  19 #define HTTP_READ_TIMEOUT       50
  20 
  21 #define HTTP_PREFIX             "http://"
  22 #define HTTP_DEFAULTPORT        80
  23 
  24 enum message_read_status {
  25         ALL_DATA_READ = 1,
  26         MORE_DATA_EXPECTED = 0,
  27         DATA_CORRUPTED = -1,
  28         REQUEST_CANCELED = -2,
  29         DATA_TOO_LONG = -3
  30 };
  31 
  32 enum evhttp_connection_error {
  33         EVCON_HTTP_TIMEOUT,
  34         EVCON_HTTP_EOF,
  35         EVCON_HTTP_INVALID_HEADER,
  36         EVCON_HTTP_BUFFER_ERROR,
  37         EVCON_HTTP_REQUEST_CANCEL
  38 };
  39 
  40 struct evbuffer;
  41 struct addrinfo;
  42 struct evhttp_request;
  43 
  44 
  45 #define _EVHTTP_REQ_UNKNOWN (1<<15)
  46 
  47 enum evhttp_connection_state {
  48         EVCON_DISCONNECTED,     
  49         EVCON_CONNECTING,       
  50         EVCON_IDLE,             
  51         EVCON_READING_FIRSTLINE,
  52 
  53         EVCON_READING_HEADERS,  
  54         EVCON_READING_BODY,     
  55         EVCON_READING_TRAILER,  
  56         EVCON_WRITING           
  57 };
  58 
  59 struct event_base;
  60 
  61 
  62 struct evhttp_connection {
  63         
  64 
  65         TAILQ_ENTRY(evhttp_connection) next;
  66 
  67         evutil_socket_t fd;
  68         struct bufferevent *bufev;
  69 
  70         struct event retry_ev;          
  71 
  72         char *bind_address;             
  73         u_short bind_port;              
  74 
  75         char *address;                  
  76         u_short port;
  77 
  78         size_t max_headers_size;
  79         ev_uint64_t max_body_size;
  80 
  81         int flags;
  82 #define EVHTTP_CON_INCOMING     0x0001  
  83 #define EVHTTP_CON_OUTGOING     0x0002  
  84 #define EVHTTP_CON_CLOSEDETECT  0x0004  
  85 
  86         int timeout;                    
  87         int retry_cnt;                  
  88         int retry_max;                  
  89 
  90         enum evhttp_connection_state state;
  91 
  92         
  93         struct evhttp *http_server;
  94 
  95         TAILQ_HEAD(evcon_requestq, evhttp_request) requests;
  96 
  97         void (*cb)(struct evhttp_connection *, void *);
  98         void *cb_arg;
  99 
 100         void (*closecb)(struct evhttp_connection *, void *);
 101         void *closecb_arg;
 102 
 103         struct deferred_cb read_more_deferred_cb;
 104 
 105         struct event_base *base;
 106         struct evdns_base *dns_base;
 107 };
 108 
 109 
 110 struct evhttp_cb {
 111         TAILQ_ENTRY(evhttp_cb) next;
 112 
 113         char *what;
 114 
 115         void (*cb)(struct evhttp_request *req, void *);
 116         void *cbarg;
 117 };
 118 
 119 
 120 TAILQ_HEAD(evconq, evhttp_connection);
 121 
 122 
 123 struct evhttp_bound_socket {
 124         TAILQ_ENTRY(evhttp_bound_socket) next;
 125 
 126         struct evconnlistener *listener;
 127 };
 128 
 129 
 130 struct evhttp_server_alias {
 131         TAILQ_ENTRY(evhttp_server_alias) next;
 132 
 133         char *alias; 
 134 };
 135 
 136 struct evhttp {
 137         
 138         TAILQ_ENTRY(evhttp) next_vhost;
 139 
 140         
 141         TAILQ_HEAD(boundq, evhttp_bound_socket) sockets;
 142 
 143         TAILQ_HEAD(httpcbq, evhttp_cb) callbacks;
 144 
 145         
 146         struct evconq connections;
 147 
 148         TAILQ_HEAD(vhostsq, evhttp) virtualhosts;
 149 
 150         TAILQ_HEAD(aliasq, evhttp_server_alias) aliases;
 151 
 152         
 153         char *vhost_pattern;
 154 
 155         int timeout;
 156 
 157         size_t default_max_headers_size;
 158         ev_uint64_t default_max_body_size;
 159 
 160         
 161 
 162         ev_uint16_t allowed_methods;
 163 
 164         
 165 
 166         void (*gencb)(struct evhttp_request *req, void *);
 167         void *gencbarg;
 168 
 169         struct event_base *base;
 170 };
 171 
 172 
 173 
 174 
 175 void evhttp_connection_reset(struct evhttp_connection *);
 176 
 177 
 178 int evhttp_connection_connect(struct evhttp_connection *);
 179 
 180 
 181 void evhttp_connection_fail(struct evhttp_connection *,
 182     enum evhttp_connection_error error);
 183 
 184 enum message_read_status;
 185 
 186 enum message_read_status evhttp_parse_firstline(struct evhttp_request *, struct evbuffer*);
 187 enum message_read_status evhttp_parse_headers(struct evhttp_request *, struct evbuffer*);
 188 
 189 void evhttp_start_read(struct evhttp_connection *);
 190 
 191 
 192 void evhttp_response_code(struct evhttp_request *, int, const char *);
 193 void evhttp_send_page(struct evhttp_request *, struct evbuffer *);
 194 
 195 #endif