mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-16 05:00:24 +00:00

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.
69 lines
3.3 KiB
Erlang
69 lines
3.3 KiB
Erlang
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
|
|
%%
|
|
%% Permission to use, copy, modify, and/or distribute this software for any
|
|
%% purpose with or without fee is hereby granted, provided that the above
|
|
%% copyright notice and this permission notice appear in all copies.
|
|
%%
|
|
%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
-include_lib("kernel/include/inet.hrl").
|
|
|
|
-type http_method() :: 'OPTIONS' | 'GET' | 'HEAD'
|
|
| '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'
|
|
| 'Accept-Encoding' | 'Accept-Language' | 'Authorization' | 'From' | 'Host'
|
|
| 'If-Modified-Since' | 'If-Match' | 'If-None-Match' | 'If-Range'
|
|
| 'If-Unmodified-Since' | 'Max-Forwards' | 'Proxy-Authorization' | 'Range'
|
|
| 'Referer' | 'User-Agent' | 'Age' | 'Location' | 'Proxy-Authenticate'
|
|
| 'Public' | 'Retry-After' | 'Server' | 'Vary' | 'Warning'
|
|
| 'Www-Authenticate' | 'Allow' | 'Content-Base' | 'Content-Encoding'
|
|
| 'Content-Language' | 'Content-Length' | 'Content-Location'
|
|
| 'Content-Md5' | 'Content-Range' | 'Content-Type' | 'Etag'
|
|
| 'Expires' | 'Last-Modified' | 'Accept-Ranges' | 'Set-Cookie'
|
|
| 'Set-Cookie2' | 'X-Forwarded-For' | 'Cookie' | 'Keep-Alive'
|
|
| 'Proxy-Connection' | binary().
|
|
-type http_headers() :: list({http_header(), binary()}).
|
|
%% -type http_cookies() :: term(). %% @todo
|
|
-type http_status() :: non_neg_integer() | binary().
|
|
|
|
-record(http_req, {
|
|
%% Transport.
|
|
socket = undefined :: undefined | inet:socket(),
|
|
transport = undefined :: undefined | module(),
|
|
connection = keepalive :: keepalive | close,
|
|
|
|
%% Request.
|
|
method = 'GET' :: http_method(),
|
|
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 | binary(),
|
|
port = undefined :: undefined | ip_port(),
|
|
path = undefined :: undefined | '*' | cowboy_dispatcher:path_tokens(),
|
|
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
|
|
}).
|