0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-14 12:20:24 +00:00
Commit graph

146 commits

Author SHA1 Message Date
Jean-Sébastien Pédron
98c2bc64e5
cowboy_static: Add support for files in EZ archives
If cowboy_static is initialized with `{priv_file, ...}` or `{priv_dir,
...}`, it is now able to read files from Erlang application .ez
archives.

When serving a file from an archive, the #file_info{} comes from the
archive, not the contained file, except for the size and type. The
erl_prim_loader module is used to read the latter's #file_info{} and the
actual file content (ie. sendfile(2) is not used in this case).

(cherry picked from commit 2166733628)
2017-01-31 16:19:45 +01:00
Alexey Lebedeff
8c60dd6c1b Use 'Connection' header only when necessary
Fixes #839 when 'Connection: Keep-Alive' wasn't sent in a HTTP/1.0
response. Now the usage of 'Connection' header is consistent with
current protocol version: when this header is not specified explicitly
in the response, HTTP/1.0 implies 'Connection: close' and HTTP/1.1
implies 'Connection: Keep-Alive'. So if current 'Connection' value
matches the default value of current protocol, we won't state obvious
fact in the response; and vice versa.

Amended to fix and improve tests, and revert the variable name
change from HTTP11Headers to StdHeaders. I think it's still good
to leave it as is because it's not really a standard header for
HTTP/1.0, and it's gone from HTTP/2 entirely.
2015-08-07 15:30:09 +02:00
Fred Hebert
b10b34a8f2 Support ad-hoc keep-alive for HTTP/1.0 Clients
Only go for keep-alive if they submit a 'connection: keep-alive' header
in the request, keep behaviour the same otherwise.

The new RFC 7230 (http://tools.ietf.org/html/rfc7230#section-6.3)
states:

    If the received protocol is HTTP/1.0, the "keep-alive" connection
    option is present, the recipient is not a proxy, and the recipient
    wishes to honor the HTTP/1.0 "keep-alive" mechanism, the
    connection will persist after the current response;

Even though clients are discouraged from doing so in Appendix A.1.2
(http://tools.ietf.org/html/rfc7230#appendix-A.1.2)
2014-07-14 10:11:03 -04:00
Loïc Hoguin
97a3108576 Reply with 400 on header parsing crash
This is a first step to improve the HTTP status codes returned
by Cowboy on crashes. We will tweak it over time.

Also fixes a small bug where two replies may have been sent
when using loop handlers under rare conditions.
2014-07-12 12:09:43 +02:00
Loïc Hoguin
4eee573700 Return 422 instead of 400 when AcceptResource returns false
422 is undefined for HTTP and interpreted as 400.
2014-06-30 17:49:36 +02:00
Drew Varner
6ed25fd60b Allow users to pass a raw binary() as the expires header. 2014-06-10 00:12:26 +02:00
Loïc Hoguin
0c37925642 Add request body reading options
The options were added to allow developers to fix timeout
issues when reading large bodies. It is also a cleaner and
easier to extend interface.

This commit deprecates the functions init_stream, stream_body
and skip_body which are no longer needed. They will be removed
in 1.0.

The body function can now take an additional argument that is a
list of options. The body_qs, part and part_body functions can
too and simply pass this argument down to the body call.

There are options for disabling the automatic continue reply,
setting a maximum length to be returned (soft limit), setting
the read length and read timeout, and setting the transfer and
content decode functions.

The return value of the body and body_qs have changed slightly.
The body function now works similarly to the part_body function,
in that it returns either an ok or a more tuple depending on
whether there is additional data to be read. The body_qs function
can return a badlength tuple if the body is too big. The default
size has been increased from 16KB to 64KB.

The default read length and timeout have been tweaked and vary
depending on the function called.

The body function will now adequately process chunked bodies,
which means that the body_qs function will too. But this means
that the behavior has changed slightly and your code should be
tested properly when updating your code.

The body and body_qs still accept a length as first argument
for compatibility purpose with older code. Note that this form
is deprecated and will be removed in 1.0. The part and part_body
function, being new and never having been in a release yet, have
this form completely removed in this commit.

Again, while most code should work as-is, you should make sure
that it actually does before pushing this to production.
2014-06-02 23:09:43 +02:00
Loïc Hoguin
c966076bbe Add a test for multipart over chunked transfer-encoding 2014-04-26 17:34:56 +02:00
Loïc Hoguin
980342f73c Make loop handlers work with SPDY
Adds a loop_handler test suite that runs all tests under HTTP, HTTPS,
SPDY each with and without the compress option enabled.

Fixes output filtering that used to filter more than it should have.
This forces us to parse the string sent by the emulator, which means
it's probably not perfect yet. But it should at least not hide errors
we want to see.

Fix a crash in the output filtering code that entirely disabled
output. Now when there is a crash the normal tty output is restored.

Handlers are now in test/handlers/ as they can be reused between
suites.

Only generate a single certificate for the whole ct run to speed
things up when we got many different test groups each needing
certificates.
2014-04-26 13:46:55 +02:00
Loïc Hoguin
a3f7f68e30 Fix two issues where listeners didn't get stopped properly 2014-04-24 14:55:58 +02:00
Loïc Hoguin
25a17a2590 Move listener initialization to cowboy_test 2014-04-22 22:50:45 +02:00
Loïc Hoguin
b377eb9805 Start applications directly from the ct hook 2014-04-22 20:52:08 +02:00
Loïc Hoguin
74512fc84c Enable Autobahn Test Suite by default
Includes a variety of small changes that are a first step to
improving the test system heavily.
2014-04-20 22:20:54 +02:00
Loïc Hoguin
806cde9ace Cleanup the configuration handling in http_SUITE 2014-04-17 19:15:39 +02:00
Loïc Hoguin
71b8316b0d Fix application start order in tests, gun depends on cowlib 2014-04-11 14:34:35 +02:00
Loïc Hoguin
704f61c9d1 Remove cowboy_client; use gun for the HTTP test suite 2014-03-24 14:25:09 +01:00
Loïc Hoguin
917cf99e10 Add and document the new multipart code
The old undocumented API is removed entirely.

While a documentation exists for the new API, it will not
be considered set in stone until further testing has been
performed, and a file upload example has been added.

The new API should be a little more efficient than the
old API, especially with smaller messages.
2014-02-06 19:36:25 +01:00
Loïc Hoguin
4efe014a2a Fix a small typo in a test 2013-12-28 17:34:59 +01:00
James Fish
1c474af8ee Fix loop handler keepalive race condition
Previously if a loop handler received the timeout message from a
previous request on the same connection the socket would be set to
{active, once} incorrectly - when a socket packet was already in the
message queue. This second packet would not be added to the buffer
before a Handler:info/3 call if a user message was in the message
queue before both socket packets.
2013-11-18 23:19:37 +00:00
Adrian Roe
c2e946708e Add a workaround to disable chunked transfer-encoding
This is an undocumented workaround to disable chunks when using HTTP/1.1.
It can be used when the client advertises itself as HTTP/1.1 despite not
understanding the chunked transfer-encoding.

Usage can be found looking at the test for it. When activated, Cowboy
will still advertise itself as HTTP/1.1, but will send the body the same
way it would if it was HTTP/1.0.
2013-11-08 21:56:37 +01:00
Loïc Hoguin
6672ea0415 Review, improve and document the static files handler
Changes include:

 *  Much simplified route configuration.

 *  Etag generation is now enabled by default.

 *  Web mimetypes are now detected by default. A bigger list of
    mimetypes can be detected without any additional library.

 *  Mimetypes can no longer be specified as a list. Copying this
    list for new connections is too costy. You can easily convert
    it into a function and pass that function to the handler instead.

 *  You can however specify a single hardcoded mimetype. Mostly
    useful when serving a single file, like an index.html file,
    to avoid extra operations.

 *  Specifying a path as a list of tokens is not possible anymore.
    Use either a binary or a string.

 *  Using a private directory will not work if the application
    was not started properly. Cowboy will not attempt to find
    the location of this directory if the VM doesn't know it,
    as this caused issues in some setups.

 *  Overall the code has been much simplified and clarified,
    and of course has now been documented.
2013-11-02 14:41:46 +01:00
Loïc Hoguin
4a30198f90 Make cowlib a proper dependency
Start moving a few functions from Cowboy into cowlib.
2013-09-04 19:24:54 +02:00
YAMAMOTO Takashi
d2adbf3de6 add some tests for Host header parser 2013-09-03 02:59:12 +09:00
Loïc Hoguin
f66a6fc57a Merge branch 'fix-chunked-req' of git://github.com/fishcakez/cowboy 2013-07-12 18:51:28 +02:00
James Fish
f0cc2d01e6 Fix decoding of chunked body.
Previously cowboy_http:te_chunked/2 would enter an incorrect state if
it tried to parse an incomplete chunk when the length was known from the
partial chunk.

Previosuly cowboy_http:te_chunked/2 expected the trailing "\r\n" to
always be present if chunk body was present in the buffer. This is not
guaranteed and so this commit accommodates that situation.
2013-07-05 22:45:18 +01:00
Loïc Hoguin
39caf34fe3 Merge branch 'fix/http-tests-get-mtu' of git://github.com/soundrop/cowboy 2013-06-29 21:54:18 +02:00
Loïc Hoguin
fdf2bc93f6 Add asn1 to the list of applications to be started for SSL
Required since R16B01. And apparently needed in some cases before.
2013-06-20 16:01:58 +02:00
Ali Sabil
240533939c Use ct_helper for retrieving the loopack interface MTU 2013-06-13 11:47:24 +02:00
Ali Sabil
809dc32339 Improve the detection of localhost interfaces for the HTTP test suite 2013-06-10 09:53:32 +02:00
Ali Sabil
fdd67b72a3 Fix the reading of the localhost MTU in the HTTP tests
Sometimes the localhost interface has a different name from "lo",
this fix adds a helper function to read the MTU value when the
interface name starts with "lo".
2013-06-07 12:01:01 +02:00
Loïc Hoguin
e50f7e4086 Move static files creation into ct_helper 2013-06-03 17:20:54 +02:00
Loïc Hoguin
4fde6cba94 In content-types, the charset parameter is converted to lowercase
We know this specific parameter is case insensitive so we
automatically lowercase it to make things simpler to the
developer.
2013-05-31 18:38:43 +02:00
Loïc Hoguin
6e33274c85 Update Ranch to 0.8.2 and use ct_helper for testing SSL 2013-05-01 18:30:00 +02:00
James Fish
c8242ab396 Add chunked response body fun
Adds a new type of streaming response fun. It can be set in a similar
way to a streaming body fun with known length:

Req2 = cowboy_req:set_resp_body_fun(chunked, StreamFun, Req)

The fun, StreamFun, should accept a fun as its single argument. This
fun, ChunkFun, is used to send chunks of iodata:

ok = ChunkFun(IoData)

ChunkFun should not be called with an empty binary or iolist as this
will cause HTTP 1.1 clients to believe the stream is over. The final (0
length) chunk will be sent automatically - even if it has already been
sent - assuming no exception is raised.

Also note that the connection will close after the last chunk for HTTP
1.0 clients.
2013-04-26 21:02:10 +01:00
Loïc Hoguin
12bd1afeed Merge branch 'fix-tests' of git://github.com/fishcakez/cowboy 2013-04-26 15:28:41 +02:00
Loïc Hoguin
e73780975c Merge branch 'pr-381-fix' of git://github.com/seletskiy/cowboy 2013-04-26 13:45:47 +02:00
Seletskiy Stanislav
f316b47d13 Add default CTP: "text/html" maps to to_html 2013-04-26 18:34:01 +07:00
James Fish
77d1082233 Fix memory issue with large return values in testcases
Previously http_SUITE:echo_body/1 and http_SUITE:check_raw_status/1
returned large values. Common test would then try to write these to the
logs causing tests to take a long time and use lots of memory.
2013-04-26 02:08:50 +01:00
Loïc Hoguin
ad91aaf81a Reorganize the http test suite 2013-04-24 20:28:44 +02:00
Loïc Hoguin
282e532ba9 Move SSL test certificates in a subdirectory 2013-04-22 19:27:47 +02:00
Loïc Hoguin
b58a0549e1 Add default operations for OPTIONS method in REST
It defaults to setting the Allow header to "HEAD, GET, OPTIONS".
2013-04-12 19:02:00 +02:00
Loïc Hoguin
2aabc73045 Ensure we can fetch the body in the info/3 function of loop handlers 2013-04-12 14:32:37 +02:00
Vladimir Dronnikov
180143f9b2 rest: reject incorrect content-type header 2013-04-12 14:58:08 +04:00
Loïc Hoguin
5a171d0f80 Remove process_post, post_is_create, create_path, created_path callbacks
Instead it will always go through content_types_accepted and it is
up to the resource code to do any creation and to return the created
path if the method is POST and the client should be redirected to the
created resource's location.

This removes the meta value 'put_path' as it is not needed anymore.

This fixes an issue with PATCH where content types were not normalized.
2013-04-11 22:25:36 +02:00
rambocoder
84d7671e91 Check the length before reading the body in body/1 and body_qs/1 2013-03-06 08:50:45 -05:00
Slava Yurin
bb1362c744 Add '*' matcher for parameters
For get_type_provided:
'*' will be match any parameters of media-range in "accept" header.
If '*' matched, then '*' is replaced by the matching parameters.
If Accept header is missing and '*' using, then in media_type in parameters
will be '*' and reply content-type will be without any parameters.

For content_types_accepted:
'*' will be match any parameters in "content-type" header.
2013-03-03 22:54:37 +07:00
Loïc Hoguin
3442acbe35 Run tests in parallel 2013-03-02 16:24:34 +01:00
Loïc Hoguin
0ba06578f2 Use random ports for tests 2013-03-02 14:39:05 +01:00
Loïc Hoguin
b2ffff9bec Add cowboy:set_env/3 2013-02-20 12:14:21 +01:00
Loïc Hoguin
40b8d0befc Better handle socket closing with loop handlers
We now read from the socket to be able to detect errors or TCP close
events, and buffer the data if any. Once the data receive goes over
a certain limit, which defaults to 5000 bytes, we simply close the
connection with an {error, overflow} reason.
2013-02-11 09:03:13 +01:00