• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * nghttp2 - HTTP/2 C Library
3  *
4  * Copyright (c) 2012 Tatsuhiro Tsujikawa
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sublicense, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be
15  * included in all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25 #ifndef SHRPX_CLIENT_HANDLER_H
26 #define SHRPX_CLIENT_HANDLER_H
27 
28 #include "shrpx.h"
29 
30 #include <memory>
31 
32 #include <ev.h>
33 
34 #include <openssl/ssl.h>
35 
36 #include "shrpx_rate_limit.h"
37 #include "shrpx_connection.h"
38 #include "buffer.h"
39 #include "memchunk.h"
40 #include "allocator.h"
41 
42 using namespace nghttp2;
43 
44 namespace shrpx {
45 
46 class Upstream;
47 class DownstreamConnection;
48 class HttpsUpstream;
49 class ConnectBlocker;
50 class DownstreamConnectionPool;
51 class Worker;
52 class Downstream;
53 struct WorkerStat;
54 struct DownstreamAddrGroup;
55 struct DownstreamAddr;
56 
57 class ClientHandler {
58 public:
59   ClientHandler(Worker *worker, int fd, SSL *ssl, const StringRef &ipaddr,
60                 const StringRef &port, int family, const UpstreamAddr *faddr);
61   ~ClientHandler();
62 
63   int noop();
64   // Performs clear text I/O
65   int read_clear();
66   int write_clear();
67   // Performs TLS handshake
68   int tls_handshake();
69   // Performs TLS I/O
70   int read_tls();
71   int write_tls();
72 
73   int upstream_noop();
74   int upstream_read();
75   int upstream_http2_connhd_read();
76   int upstream_http1_connhd_read();
77   int upstream_write();
78 
79   int proxy_protocol_read();
80   int proxy_protocol_v2_read();
81   int on_proxy_protocol_finish();
82 
83   // Performs I/O operation.  Internally calls on_read()/on_write().
84   int do_read();
85   int do_write();
86 
87   // Processes buffers.  No underlying I/O operation will be done.
88   int on_read();
89   int on_write();
90 
91   struct ev_loop *get_loop() const;
92   void reset_upstream_read_timeout(ev_tstamp t);
93   void reset_upstream_write_timeout(ev_tstamp t);
94 
95   int validate_next_proto();
96   const StringRef &get_ipaddr() const;
97   bool get_should_close_after_write() const;
98   void set_should_close_after_write(bool f);
99   Upstream *get_upstream();
100 
101   void pool_downstream_connection(std::unique_ptr<DownstreamConnection> dconn);
102   void remove_downstream_connection(DownstreamConnection *dconn);
103   DownstreamAddr *get_downstream_addr(int &err, DownstreamAddrGroup *group,
104                                       Downstream *downstream);
105   // Returns DownstreamConnection object based on request path.  This
106   // function returns non-null DownstreamConnection, and assigns 0 to
107   // |err| if it succeeds, or returns nullptr, and assigns negative
108   // error code to |err|.
109   std::unique_ptr<DownstreamConnection>
110   get_downstream_connection(int &err, Downstream *downstream);
111   MemchunkPool *get_mcpool();
112   SSL *get_ssl() const;
113   // Call this function when HTTP/2 connection header is received at
114   // the start of the connection.
115   void direct_http2_upgrade();
116   // Performs HTTP/2 Upgrade from the connection managed by
117   // |http|. If this function fails, the connection must be
118   // terminated. This function returns 0 if it succeeds, or -1.
119   int perform_http2_upgrade(HttpsUpstream *http);
120   bool get_http2_upgrade_allowed() const;
121   // Returns upstream scheme, either "http" or "https"
122   StringRef get_upstream_scheme() const;
123   void start_immediate_shutdown();
124 
125   // Writes upstream accesslog using |downstream|.  The |downstream|
126   // must not be nullptr.
127   void write_accesslog(Downstream *downstream);
128 
129   Worker *get_worker() const;
130 
131   // Initializes forwarded_for_.
132   void init_forwarded_for(int family, const StringRef &ipaddr);
133 
134   using ReadBuf = DefaultMemchunkBuffer;
135 
136   ReadBuf *get_rb();
137 
138   RateLimit *get_rlimit();
139   RateLimit *get_wlimit();
140 
141   void signal_write();
142   ev_io *get_wev();
143 
144   void setup_upstream_io_callback();
145 
146   // Returns string suitable for use in "by" parameter of Forwarded
147   // header field.
148   StringRef get_forwarded_by() const;
149   // Returns string suitable for use in "for" parameter of Forwarded
150   // header field.
151   StringRef get_forwarded_for() const;
152 
153   Http2Session *
154   get_http2_session(const std::shared_ptr<DownstreamAddrGroup> &group,
155                     DownstreamAddr *addr);
156 
157   // Returns an affinity cookie value for |downstream|.  |cookie_name|
158   // is used to inspect cookie header field in request header fields.
159   uint32_t get_affinity_cookie(Downstream *downstream,
160                                const StringRef &cookie_name);
161 
162   const UpstreamAddr *get_upstream_addr() const;
163 
164   void repeat_read_timer();
165   void stop_read_timer();
166 
167   Connection *get_connection();
168 
169   // Stores |sni| which is TLS SNI extension value client sent in this
170   // connection.
171   void set_tls_sni(const StringRef &sni);
172   // Returns TLS SNI extension value client sent in this connection.
173   StringRef get_tls_sni() const;
174 
175   // Returns ALPN negotiated in this connection.
176   StringRef get_alpn() const;
177 
178   BlockAllocator &get_block_allocator();
179 
180 private:
181   // Allocator to allocate memory for connection-wide objects.  Make
182   // sure that the allocations must be bounded, and not proportional
183   // to the number of requests.
184   BlockAllocator balloc_;
185   DefaultMemchunkBuffer rb_;
186   Connection conn_;
187   ev_timer reneg_shutdown_timer_;
188   std::unique_ptr<Upstream> upstream_;
189   // IP address of client.  If UNIX domain socket is used, this is
190   // "localhost".
191   StringRef ipaddr_;
192   StringRef port_;
193   // The ALPN identifier negotiated for this connection.
194   StringRef alpn_;
195   // The client address used in "for" parameter of Forwarded header
196   // field.
197   StringRef forwarded_for_;
198   // lowercased TLS SNI which client sent.
199   StringRef sni_;
200   std::function<int(ClientHandler &)> read_, write_;
201   std::function<int(ClientHandler &)> on_read_, on_write_;
202   // Address of frontend listening socket
203   const UpstreamAddr *faddr_;
204   Worker *worker_;
205   // The number of bytes of HTTP/2 client connection header to read
206   size_t left_connhd_len_;
207   // hash for session affinity using client IP
208   uint32_t affinity_hash_;
209   bool should_close_after_write_;
210   // true if affinity_hash_ is computed
211   bool affinity_hash_computed_;
212 };
213 
214 } // namespace shrpx
215 
216 #endif // SHRPX_CLIENT_HANDLER_H
217