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

Update version to 0.6.0

Also update the CHANGELOG and copyright years.
This commit is contained in:
Loïc Hoguin 2012-05-23 14:53:48 +02:00
parent 1a1b01c7c4
commit 0c2e2224e3
32 changed files with 163 additions and 79 deletions

View file

@ -1,6 +1,92 @@
CHANGELOG
=========
0.6.0
-----
* Add multipart support
* Add chunked transfer decoding support
Done by reworking the body reading API. Now all the body
reading goes through the cowboy_http_req:stream_body/1
function. This function takes care of handling both the
Transfer-Encoding and the Content-Encoding, returning
properly decoded data ready for consumption.
* Add fragmented websocket messages support
Properly tested by the addition of the Autobahn websocket
test suite to our toolbox. All tests pass except a few
related to UTF-8 handling, as Cowboy does no checks on that
end at this point.
* Add 'onrequest' and 'onresponse' hooks
The first can be used for all the special cases you may have
that can't be dealt with otherwise. It's also pretty good for
writing access logs or rewriting URLs.
The second can be used for logging errors or replacing error
pages, amongst others.
* Add cowboy:get_protocol_options/1 and cowboy:set_protocol_options/2
These functions allow for retrieving a listener's protocol options,
and for modifying them while the listener is running. This is
most useful to upgrade the dispatch list. The upgrade applies
to all the future connections.
* Add the sockname/1 function to TCP and SSL transports
* Improve SSL transport support
Add support for specifying the ciphers. Add CA support. Make
specifying the password optional.
* Add new HTTP status codes from RFC 6585
* Add a 'file' option to cowboy_http_static
This allows for mapping /folder/ paths to a /folder/index.html file.
* Add the '*' catch all Content-Type for REST
* Add {halt, Req, State} as a possible return value for REST
* Add absolute URI support for requests
* Add cowboy_http:x_www_form_urlencoded/2
* Various REST bug fixes
* Do not send chunked replies for HTTP/1.0 connections
* Fix a DST bug in the cookies code
* Fix a bug with setting cookie values containing slashes
* Fix a small timer leak when using loop/websocket timeouts
* Make charset and media type parsing more relaxed
This is to accomodate some widely used broken clients.
* Make error messages more readable
* Fix and improve type specifications
* Fix a bug preventing documentation from being generated
* Small improvements to the documentation
* Rework the HTTP test suite
The suite now uses an integrated Cowboy HTTP client. The client
is currently experimental and shouldn't be used.
* Add many many tests.
0.4.0
-----

View file

@ -1,4 +1,4 @@
Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -157,28 +157,28 @@ based on the hostname and path information from the request. It also lets
you define static options for the handler directly in the rules.
To match the hostname and path, Cowboy requires a list of tokens. For
example, to match the "dev-extend.eu" domain name, you must specify
`[<<"dev-extend">>, <<"eu">>]`. Or, to match the "/path/to/my/resource"
example, to match the "ninenines.eu" domain name, you must specify
`[<<"ninenines">>, <<"eu">>]`. Or, to match the "/path/to/my/resource"
you must use `[<<"path">>, <<"to">>, <<"my">>, <<"resource">>]`. All the
tokens must be given as binary.
You can use the special token `'_'` (the atom underscore) to indicate that
you accept anything in that position. For example if you have both
"dev-extend.eu" and "dev-extend.fr" domains, you can use the match spec
`[<<"dev-extend">>, '_']` to match any top level extension.
"ninenines.eu" and "ninenines.fr" domains, you can use the match spec
`[<<"ninenines">>, '_']` to match any top level extension.
Finally, you can also match multiple leading segments of the domain name and
multiple trailing segments of the request path using the atom `'...'` (the atom
ellipsis) respectively as the first host token or the last path token. For
example, host rule `['...', <<"dev-extend">>, <<"eu">>]` can match both
"cowboy.bugs.dev-extend.eu" and "dev-extend.eu" and path rule
example, host rule `['...', <<"ninenines">>, <<"eu">>]` can match both
"cowboy.bugs.ninenines.eu" and "ninenines.eu" and path rule
`[<<"projects">>, '...']` can match both "/projects" and
"/projects/cowboy/issues/42". The host leading segments and the path trailing
segments can later be retrieved through `cowboy_http_req:host_info/1` and
`cowboy_http_req:path_info/1`.
Any other atom used as a token will bind the value to this atom when
matching. To follow on our hostnames example, `[<<"dev-extend">>, ext]`
matching. To follow on our hostnames example, `[<<"ninenines">>, ext]`
would bind the values `<<"eu">>` and `<<"fr">>` to the ext atom, that you
can later retrieve in your handler by calling `cowboy_http_req:binding/{2,3}`.

View file

@ -61,14 +61,12 @@ are not ordered.
Tools like curl expect a 100 Continue before sending a
request body by default.
* Convert the multipart code to stream_body.
* Complete the work on Websockets.
Now that the Autobahn test suite is available (make inttests),
we have a definite way to know whether Cowboy's implementation
of Websockets is right. The work can thus be completed. The
remaining tasks are proper UTF8 handling.
remaining task is proper UTF8 handling.
* SPDY support.

View file

@ -1,4 +1,4 @@
@author Loïc Hoguin <essen@dev-extend.eu>
@copyright 2011 Loïc Hoguin
@author Loïc Hoguin <essen@ninenines.eu>
@copyright 2011-2012 Loïc Hoguin
@version HEAD
@title Small, fast, modular HTTP server.

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.eu>
%% Copyright (c) 2011, Anthony Ramine <nox@dev-extend.eu>
%%
%% Permission to use, copy, modify, and/or distribute this software for any

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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
@ -14,7 +14,7 @@
{application, cowboy, [
{description, "Small, fast, modular HTTP server."},
{vsn, "0.5.0"},
{vsn, "0.6.0"},
{modules, []},
{registered, [cowboy_clock, cowboy_sup]},
{applications, [

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.eu>
%% Copyright (c) 2011, Anthony Ramine <nox@dev-extend.eu>
%%
%% Permission to use, copy, modify, and/or distribute this software for any
@ -85,8 +85,8 @@ do_split_path(RawPath, Separator, URLDec) ->
%% corresponding token value and return it.
%%
%% The list of hostname tokens is reversed before matching. For example, if
%% we were to match "www.dev-extend.eu", we would first match "eu", then
%% "dev-extend", then "www". This means that in the context of hostnames,
%% we were to match "www.ninenines.eu", we would first match "eu", then
%% "ninenines", then "www". This means that in the context of hostnames,
%% the <em>'...'</em> atom matches properly the lower levels of the domain
%% as would be expected.
%%
@ -173,16 +173,16 @@ split_host_test_() ->
{<<"">>, {[], <<"">>, undefined}},
{<<".........">>, {[], <<".........">>, undefined}},
{<<"*">>, {[<<"*">>], <<"*">>, undefined}},
{<<"cowboy.dev-extend.eu">>,
{[<<"cowboy">>, <<"dev-extend">>, <<"eu">>],
<<"cowboy.dev-extend.eu">>, undefined}},
{<<"dev-extend..eu">>,
{[<<"dev-extend">>, <<>>, <<"eu">>],
<<"dev-extend..eu">>, undefined}},
{<<"dev-extend.eu">>,
{[<<"dev-extend">>, <<"eu">>], <<"dev-extend.eu">>, undefined}},
{<<"dev-extend.eu:8080">>,
{[<<"dev-extend">>, <<"eu">>], <<"dev-extend.eu">>, 8080}},
{<<"cowboy.ninenines.eu">>,
{[<<"cowboy">>, <<"ninenines">>, <<"eu">>],
<<"cowboy.ninenines.eu">>, undefined}},
{<<"ninenines..eu">>,
{[<<"ninenines">>, <<>>, <<"eu">>],
<<"ninenines..eu">>, undefined}},
{<<"ninenines.eu">>,
{[<<"ninenines">>, <<"eu">>], <<"ninenines.eu">>, undefined}},
{<<"ninenines.eu:8080">>,
{[<<"ninenines">>, <<"eu">>], <<"ninenines.eu">>, 8080}},
{<<"a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z">>,
{[<<"a">>, <<"b">>, <<"c">>, <<"d">>, <<"e">>, <<"f">>, <<"g">>,
<<"h">>, <<"i">>, <<"j">>, <<"k">>, <<"l">>, <<"m">>, <<"n">>,
@ -195,13 +195,13 @@ split_host_test_() ->
split_host_fail_test_() ->
Tests = [
<<"dev-extend.eu:owns">>,
<<"dev-extend.eu: owns">>,
<<"dev-extend.eu:42fun">>,
<<"dev-extend.eu: 42fun">>,
<<"dev-extend.eu:42 fun">>,
<<"dev-extend.eu:fun 42">>,
<<"dev-extend.eu: 42">>,
<<"ninenines.eu:owns">>,
<<"ninenines.eu: owns">>,
<<"ninenines.eu:42fun">>,
<<"ninenines.eu: 42fun">>,
<<"ninenines.eu:42 fun">>,
<<"ninenines.eu:fun 42">>,
<<"ninenines.eu: 42">>,
<<":owns">>,
<<":42 fun">>
],
@ -233,14 +233,14 @@ split_path_test_() ->
match_test_() ->
Dispatch = [
{[<<"www">>, '_', <<"dev-extend">>, <<"eu">>], [
{[<<"www">>, '_', <<"ninenines">>, <<"eu">>], [
{[<<"users">>, '_', <<"mails">>], match_any_subdomain_users, []}
]},
{[<<"dev-extend">>, <<"eu">>], [
{[<<"ninenines">>, <<"eu">>], [
{[<<"users">>, id, <<"friends">>], match_extend_users_friends, []},
{'_', match_extend, []}
]},
{[<<"dev-extend">>, var], [
{[<<"ninenines">>, var], [
{[<<"threads">>, var], match_duplicate_vars,
[we, {expect, two}, var, here]}
]},
@ -255,22 +255,22 @@ match_test_() ->
%% {Host, Path, Result}
Tests = [
{[<<"any">>], [], {ok, match_any, [], []}},
{[<<"www">>, <<"any">>, <<"dev-extend">>, <<"eu">>],
{[<<"www">>, <<"any">>, <<"ninenines">>, <<"eu">>],
[<<"users">>, <<"42">>, <<"mails">>],
{ok, match_any_subdomain_users, [], []}},
{[<<"www">>, <<"dev-extend">>, <<"eu">>],
{[<<"www">>, <<"ninenines">>, <<"eu">>],
[<<"users">>, <<"42">>, <<"mails">>], {ok, match_any, [], []}},
{[<<"www">>, <<"dev-extend">>, <<"eu">>], [], {ok, match_any, [], []}},
{[<<"www">>, <<"any">>, <<"dev-extend">>, <<"eu">>],
{[<<"www">>, <<"ninenines">>, <<"eu">>], [], {ok, match_any, [], []}},
{[<<"www">>, <<"any">>, <<"ninenines">>, <<"eu">>],
[<<"not_users">>, <<"42">>, <<"mails">>], {error, notfound, path}},
{[<<"dev-extend">>, <<"eu">>], [], {ok, match_extend, [], []}},
{[<<"dev-extend">>, <<"eu">>], [<<"users">>, <<"42">>, <<"friends">>],
{[<<"ninenines">>, <<"eu">>], [], {ok, match_extend, [], []}},
{[<<"ninenines">>, <<"eu">>], [<<"users">>, <<"42">>, <<"friends">>],
{ok, match_extend_users_friends, [], [{id, <<"42">>}]}},
{[<<"erlang">>, <<"fr">>], '_',
{ok, match_erlang_ext, [], [{ext, <<"fr">>}]}},
{[<<"any">>], [<<"users">>, <<"444">>, <<"friends">>],
{ok, match_users_friends, [], [{id, <<"444">>}]}},
{[<<"dev-extend">>, <<"fr">>], [<<"threads">>, <<"987">>],
{[<<"ninenines">>, <<"fr">>], [<<"threads">>, <<"987">>],
{ok, match_duplicate_vars, [we, {expect, two}, var, here],
[{var, <<"fr">>}, {var, <<"987">>}]}}
],
@ -280,27 +280,27 @@ match_test_() ->
match_info_test_() ->
Dispatch = [
{[<<"www">>, <<"dev-extend">>, <<"eu">>], [
{[<<"www">>, <<"ninenines">>, <<"eu">>], [
{[<<"pathinfo">>, <<"is">>, <<"next">>, '...'], match_path, []}
]},
{['...', <<"dev-extend">>, <<"eu">>], [
{['...', <<"ninenines">>, <<"eu">>], [
{'_', match_any, []}
]}
],
Tests = [
{[<<"dev-extend">>, <<"eu">>], [],
{[<<"ninenines">>, <<"eu">>], [],
{ok, match_any, [], [], [], undefined}},
{[<<"bugs">>, <<"dev-extend">>, <<"eu">>], [],
{[<<"bugs">>, <<"ninenines">>, <<"eu">>], [],
{ok, match_any, [], [], [<<"bugs">>], undefined}},
{[<<"cowboy">>, <<"bugs">>, <<"dev-extend">>, <<"eu">>], [],
{[<<"cowboy">>, <<"bugs">>, <<"ninenines">>, <<"eu">>], [],
{ok, match_any, [], [], [<<"cowboy">>, <<"bugs">>], undefined}},
{[<<"www">>, <<"dev-extend">>, <<"eu">>],
{[<<"www">>, <<"ninenines">>, <<"eu">>],
[<<"pathinfo">>, <<"is">>, <<"next">>],
{ok, match_path, [], [], undefined, []}},
{[<<"www">>, <<"dev-extend">>, <<"eu">>],
{[<<"www">>, <<"ninenines">>, <<"eu">>],
[<<"pathinfo">>, <<"is">>, <<"next">>, <<"path_info">>],
{ok, match_path, [], [], undefined, [<<"path_info">>]}},
{[<<"www">>, <<"dev-extend">>, <<"eu">>],
{[<<"www">>, <<"ninenines">>, <<"eu">>],
[<<"pathinfo">>, <<"is">>, <<"next">>, <<"foo">>, <<"bar">>],
{ok, match_path, [], [], undefined, [<<"foo">>, <<"bar">>]}}
],

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.eu>
%% Copyright (c) 2011, Anthony Ramine <nox@dev-extend.eu>
%%
%% Permission to use, copy, modify, and/or distribute this software for any

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.eu>
%% Copyright (c) 2011, Anthony Ramine <nox@dev-extend.eu>
%%
%% Permission to use, copy, modify, and/or distribute this software for any

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.eu>
%% Copyright (c) 2011, Anthony Ramine <nox@dev-extend.eu>
%%
%% Permission to use, copy, modify, and/or distribute this software for any

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.eu>
%% Copyright (c) 2011, Michiel Hakvoort <michiel@hakvoort.it>
%%
%% Permission to use, copy, modify, and/or distribute this software for any

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.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

View file

@ -1,5 +1,5 @@
%% Copyright (c) 2011, Magnus Klaar <magnus.klaar@gmail.com>
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011-2012, Loïc Hoguin <essen@ninenines.eu>
%% Copyright (c) 2011, Anthony Ramine <nox@dev-extend.eu>
%%
%% Permission to use, copy, modify, and/or distribute this software for any
@ -358,7 +358,7 @@ The document has moved
{400, "\n"},
{400, "Garbage\r\n\r\n"},
{400, "\r\n\r\n\r\n\r\n\r\n\r\n"},
{400, "GET / HTTP/1.1\r\nHost: dev-extend.eu\r\n\r\n"},
{400, "GET / HTTP/1.1\r\nHost: ninenines.eu\r\n\r\n"},
{400, "GET http://proxy/ HTTP/1.1\r\n\r\n"},
{400, ResponsePacket},
{408, "GET / HTTP/1.1\r\n"},

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011, Loïc Hoguin <essen@ninenines.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

View file

@ -1,4 +1,4 @@
%% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
%% Copyright (c) 2011, Loïc Hoguin <essen@ninenines.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