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

44 commits

Author SHA1 Message Date
Loïc Hoguin
eef66e0928
Remove copyright years from all files except LICENSE 2025-02-17 15:00:02 +01:00
Marko Mindek
f071d772ed
Fix a few underspec'd types in cowboy_static 2025-01-23 15:07:10 +01:00
Loïc Hoguin
b36f064a91
Refresh copyright lines 2024-01-25 11:22:54 +01:00
Loïc Hoguin
4427108b69
Improve the cowboy_static consistency across platforms
As a result we explictly reject path_info components that include
a forward slash, backward slash or NUL character. This only applies
to the [...] part of the path for dir/priv_dir configuration.

Also improve the tests so that they work on Windows.
2019-09-07 12:18:16 +02:00
Loïc Hoguin
ae96aa6e49
Add an additional test to the static test suite 2018-11-19 12:24:28 +01:00
Loïc Hoguin
84aea5d24d
Silence expected errors from the static_handler test suite 2018-11-19 12:15:40 +01:00
Loïc Hoguin
fe1ee080de
Enable range requests support in cowboy_static 2018-11-11 16:25:45 +01:00
Loïc Hoguin
bdd324ec01
Fix unused type in cowboy_static 2018-11-05 17:33:00 +01:00
Loïc Hoguin
571719a164
Add a charset option to cowboy_static 2018-11-02 15:36:41 +01:00
Jean-Sébastien Pédron
2166733628
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).
2017-01-24 11:36:58 +01:00
Loïc Hoguin
43adacc760
Welcome to 2017 2017-01-02 19:36:36 +01:00
Loïc Hoguin
e10daf39fa
Numerous Dialyzer fixes 2017-01-02 16:47:16 +01:00
Loïc Hoguin
f14c45151d Escape reserved filename characters
Note that this commit has currently only been tested on Linux.
It might be incomplete for other platforms.
2016-06-06 17:39:06 +02:00
Loïc Hoguin
a82495fa5c Static: Fix status code returned with empty path_info 2016-06-06 17:38:39 +02:00
Loïc Hoguin
b370442a63 Initial commit with connection/streams
Breaking changes with previous commit. This is a very large change,
and I am giving up on making a single commit that fixes everything.
More commits will follow slowly adding back features, introducing
new tests and fixing the documentation.

This change contains most of the work toward unifying the interface
for handling both HTTP/1.1 and HTTP/2. HTTP/1.1 connections are now
no longer 1 process per connection; instead by default 1 process per
request is also created. This has a number of pros and cons.

Because it has cons, we also allow users to use a lower-level API
that acts on "streams" (requests/responses) directly at the connection
process-level. If performance is a concern, one can always write a
stream handler. The performance in this case will be even greater
than with Cowboy 1, although all the special handlers are unavailable.

When switching to Websocket, after the handler returns from init/2,
Cowboy stops the stream and the Websocket protocol takes over the
connection process. Websocket then calls websocket_init/2 for any
additional initialization such as timers, because the process is
different in init/2 and websocket_*/* functions. This however would
allow us to use websocket_init/2 for sending messages on connect,
instead of sending ourselves a message and be subject to races.
Note that websocket_init/2 is optional.

This is all a big change and while most of the tests pass, some
functionality currently doesn't. SPDY is broken and will be removed
soon in favor of HTTP/2. Automatic compression is currently disabled.
The cowboy_req interface probably still have a few functions that
need to be updated. The docs and examples do not refer the current
functionality anymore.

Everything will be fixed over time. Feedback is more than welcome.
Open a ticket!
2016-03-05 20:20:42 +01:00
Loïc Hoguin
bee5ca852b Replace some /binary to /bits in binary pattern matching
We don't need the extra check for multiple of 8 bits.
2014-10-03 18:25:29 +03:00
Loïc Hoguin
0dc063ab7d Improve handler interface and documentation
This change simplifies a little more the sub protocols mechanism.
Aliases have been removed. The renaming of loop handlers as long
polling handlers has been reverted.

Plain HTTP handlers now simply do their work in the init/2
callback. There is no specific code for them.

Loop handlers now follow the same return value as Websocket,
they use ok to continue and shutdown to stop.

Terminate reasons for all handler types have been documented.
The terminate callback is now appropriately called in all cases
(or should be).

Behaviors for all handler types have been moved in the module
that implement them. This means that cowboy_handler replaces
the cowboy_http_handler behavior, and similarly cowboy_loop
replaces cowboy_loop_handler, cowboy_websocket replaces
cowboy_websocket_handler. Finally cowboy_rest now has the
start of a behavior in it and will have the full list of
optional callbacks defined once Erlang 18.0 gets released.

The guide has been reorganized and should be easier to follow.
2014-09-30 20:12:13 +03:00
Loïc Hoguin
5ce4c2bfb4 Unify the init and terminate callbacks
This set of changes is the first step to simplify the
writing of handlers, by removing some extraneous
callbacks and making others optional.

init/3 is now init/2, its first argument being removed.

rest_init/2 and rest_terminate/2 have been removed.

websocket_init/3 and websocket_terminate/3 have been removed.

terminate/3 is now optional. It is called regardless of
the type of handler, including rest and websocket.

The return value of init/2 changed. It now returns
{Mod, Req, Opts} with Mod being either one of the four
handler type or a custom module. It can also return extra
timeout and hibernate options.

The signature for sub protocols has changed, they now
receive these extra timeout and hibernate options.

Loop handlers are now implemented in cowboy_long_polling,
and will be renamed throughout the project in a future commit.
2014-09-26 15:58:44 +03:00
Loïc Hoguin
f1c3b6d76f Breaking update of the cowboy_req interface
Simplify the interface for most cowboy_req functions. They all return
a single value except the four body reading functions. The reply functions
now only return a Req value.

Access functions do not return a Req anymore.

Functions that used to cache results do not have a cache anymore.

The interface for accessing query string and cookies has therefore
been changed.

There are now three query string functions: qs/1 provides access
to the raw query string value; parse_qs/1 returns the query string
as a list of key/values; match_qs/2 returns a map containing the
values requested in the second argument, after applying constraints
and default value.

Similarly, there are two cookie functions: parse_cookies/1 and
match_cookies/2. More match functions will be added in future commits.

None of the functions return an error tuple anymore. It either works
or crashes. Cowboy will attempt to provide an appropriate status code
in the response of crashed handlers.

As a result, the content decode function has its return value changed
to a simple binary, and the body reading functions only return on success.
2014-09-23 16:43:29 +03:00
Loïc Hoguin
e2b5c21443 Drop R15 support 2014-07-12 14:19:29 +02:00
Loïc Hoguin
c9b9644aa3 Add +warn_missing_spec and fix specs 2014-03-27 11:30:44 +01:00
Loïc Hoguin
17af50812c Remove outdated comments, all edoc, plus a few minor tweaks 2014-03-26 19:05:59 +01:00
Loïc Hoguin
903594bb87 Update copyright years 2014-02-06 19:57:23 +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
Sergey Rublev
d6c9bb27ad Use read_file_info/2 with {time, universal} option 2013-06-07 22:21:42 +07:00
Egobrain
3bf5b46786 Removed asserts from unit tests 2013-04-26 17:08:53 +04:00
Loïc Hoguin
97b8401c45 REST is no longer experimental 2013-04-20 17:46:29 +02:00
Andrzej Sliwa
1ff1ac85cd missing comma in documentation of static examples 2013-04-12 08:26:44 +02:00
Ali Sabil
83876c3e33 Do not crash if connection times out while sending a file using sendfile 2013-04-08 21:21:26 +02:00
Loïc Hoguin
dee7a8d3e1 Make path check cross-platform and generally safer 2013-03-01 13:54:47 +01:00
Loïc Hoguin
62e2635d8e Optimize cowboy_static:rest_init/2 2013-02-27 23:20:55 +01:00
Loïc Hoguin
87017e9699 Remove extraneous newlines in cowboy_static 2013-02-27 18:46:30 +01:00
Adam Cammack
6575ceb0dd Fix examples in cowboy_static edoc and guide 2013-02-11 09:44:25 -06:00
Loïc Hoguin
166761483d Do not crash if connection is closed while sending static file 2013-01-22 17:08:32 +01:00
0x00F6
ebadc185c1 Make cowboy_static use universal time 2013-01-22 17:41:00 +04:00
Loïc Hoguin
58e89e2189 Change the response body streaming fun interface
Before we were required to get the socket and transport ourselves,
now they're passed to the function.
2013-01-05 20:19:43 +01:00
Loïc Hoguin
72b26c6d0c Use Transport:sendfile/2 from Ranch
This removes a bunch of unneeded code, including code that was
made for R14 which we don't support anymore.

Note that the dependency on Ranch was updated, so you will need
to update Ranch for the new code to work.
2012-12-01 10:29:26 +01:00
Loïc Hoguin
6ec12f7ce8 static: Allow passing the mimetype fun as a {M, F} tuple 2012-11-29 11:18:57 +01:00
Loïc Hoguin
9942beb58c Fix dispatch documentation with regards to the <<"*">> path 2012-11-27 11:35:40 +01:00
Loïc Hoguin
5525369a4a Mimetype lookup expects lowercase extensions
We handle extensions in a case-insensitive manner when looking
for a mimetype for a file. Extensions are thus lowered.
2012-10-25 17:21:14 +02:00
Loïc Hoguin
d3277b08ce Fix examples in cowboy_static edoc 2012-10-19 01:32:18 +02:00
Loïc Hoguin
8497c8bbcd Don't use decode_packet/3 for parsing the request-line
First step in making all methods and header names binaries to
get rid of many inconsistencies caused by decode_packet/3.

Methods are all binary now. Note that since they are case
sensitive, the usual methods become <<"GET">>, <<"POST">> and so on.
2012-09-21 08:54:57 +02:00
Loïc Hoguin
d9e76d59a1 Change type #http_req{} to cowboy_req:req()
This removes cowboy_static's dependency on http.hrl.
2012-09-15 01:31:51 +02:00
Loïc Hoguin
f39c001c03 Rename cowboy_http_static to cowboy_static 2012-08-27 13:53:27 +02:00
Renamed from src/cowboy_http_static.erl (Browse further)