mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-15 04:30:25 +00:00
Switch the HTTP protocol to use binary packets instead of lists.
The server now does a single recv (or more, but only if needed) which is then sent to erlang:decode_packet/3 multiple times. Since most requests are smaller than the default MTU on many platforms, we benefit from this greatly. In the case of requests with a body, the server usually read at least part of the body on the first recv. This is bufferized properly and used when later retrieving the body. In the case of pipelined requests, we can end up reading many requests in a single recv, which are then handled properly using only the buffer containing the received data.
This commit is contained in:
parent
6c1f73c53c
commit
29e71cf4da
6 changed files with 288 additions and 243 deletions
|
@ -15,11 +15,11 @@
|
|||
-include_lib("kernel/include/inet.hrl").
|
||||
|
||||
-type http_method() :: 'OPTIONS' | 'GET' | 'HEAD'
|
||||
| 'POST' | 'PUT' | 'DELETE' | 'TRACE' | string().
|
||||
-type http_uri() :: '*' | {absoluteURI, http | https, Host::string(),
|
||||
Port::integer() | undefined, Path::string()}
|
||||
| {scheme, Scheme::string(), string()}
|
||||
| {abs_path, string()} | string().
|
||||
| 'POST' | 'PUT' | 'DELETE' | 'TRACE' | binary().
|
||||
-type http_uri() :: '*' | {absoluteURI, http | https, Host::binary(),
|
||||
Port::integer() | undefined, Path::binary()}
|
||||
| {scheme, Scheme::binary(), binary()}
|
||||
| {abs_path, binary()} | binary().
|
||||
-type http_version() :: {Major::integer(), Minor::integer()}.
|
||||
-type http_header() :: 'Cache-Control' | 'Connection' | 'Date' | 'Pragma'
|
||||
| 'Transfer-Encoding' | 'Upgrade' | 'Via' | 'Accept' | 'Accept-Charset'
|
||||
|
@ -33,10 +33,10 @@
|
|||
| 'Content-Md5' | 'Content-Range' | 'Content-Type' | 'Etag'
|
||||
| 'Expires' | 'Last-Modified' | 'Accept-Ranges' | 'Set-Cookie'
|
||||
| 'Set-Cookie2' | 'X-Forwarded-For' | 'Cookie' | 'Keep-Alive'
|
||||
| 'Proxy-Connection' | string().
|
||||
-type http_headers() :: list({http_header(), string()}).
|
||||
| 'Proxy-Connection' | binary().
|
||||
-type http_headers() :: list({http_header(), binary()}).
|
||||
%% -type http_cookies() :: term(). %% @todo
|
||||
-type http_status() :: non_neg_integer() | string().
|
||||
-type http_status() :: non_neg_integer() | binary().
|
||||
|
||||
-record(http_req, {
|
||||
%% Transport.
|
||||
|
@ -49,18 +49,20 @@
|
|||
version = {1, 1} :: http_version(),
|
||||
peer = undefined :: undefined | {Address::ip_address(), Port::ip_port()},
|
||||
host = undefined :: undefined | cowboy_dispatcher:path_tokens(),
|
||||
raw_host = undefined :: undefined | string(),
|
||||
raw_host = undefined :: undefined | binary(),
|
||||
port = undefined :: undefined | ip_port(),
|
||||
path = undefined :: undefined | '*' | cowboy_dispatcher:path_tokens(),
|
||||
raw_path = undefined :: undefined | string(),
|
||||
qs_vals = undefined :: undefined | list({Name::string(), Value::string() | true}),
|
||||
raw_qs = undefined :: undefined | string(),
|
||||
raw_path = undefined :: undefined | binary(),
|
||||
qs_vals = undefined :: undefined
|
||||
| list({Name::binary(), Value::binary() | true}),
|
||||
raw_qs = undefined :: undefined | binary(),
|
||||
bindings = undefined :: undefined | cowboy_dispatcher:bindings(),
|
||||
headers = [] :: http_headers(),
|
||||
%% cookies = undefined :: undefined | http_cookies() %% @todo
|
||||
|
||||
%% Request body.
|
||||
body_state = waiting :: waiting | done,
|
||||
buffer = <<>> :: binary(),
|
||||
|
||||
%% Response.
|
||||
resp_state = locked :: locked | waiting | done
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue