aboutsummaryrefslogtreecommitdiffstats
path: root/src/cowboy_http.erl
AgeCommit message (Collapse)Author
2016-06-20Fix cowboy_req:peer/1Loïc Hoguin
2016-06-06HTTP/1.1: Don't send 500 errors twiceLoïc Hoguin
The stream handler is responsible for sending errors. The protocol should only send errors when no responses were sent (this might not work yet).
2016-03-13Fix more HTTP/2 handshake test casesLoïc Hoguin
2016-03-12Add initial HTTP/1.1 Upgrade to HTTP/2Loïc Hoguin
The same edge cases that fail with other handshake methods also fail here (mostly bad preface/timeouts stuff). In addition, the HTTP2-Settings header contents are currently not checked and so the related edge case tests also fail.
2016-03-10Add the beginning of the rfc7540 test suiteLoïc Hoguin
Currently only testing handshake. Tests that pass currently involve no request/response. ALPN and prior knowledge support have some edge cases left to fix. HTTP/1.1 Upgrade has not been implemented yet.
2016-03-06Fix warningsLoïc Hoguin
2016-03-05Initial commit with connection/streamsLoïc Hoguin
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!
2015-02-04Use cowlib for parsing headers; remove cowboy_httpLoïc Hoguin
2014-09-23Breaking update of the cowboy_req interfaceLoïc Hoguin
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-04-26Merge branch 'language-range-header' of git://github.com/NineFX/cowboyLoïc Hoguin
2014-04-17Merge branch 'fix/basic-auth-empty-password' of git://github.com/soundrop/cowboyLoïc Hoguin
2014-03-26Remove outdated comments, all edoc, plus a few minor tweaksLoïc Hoguin
2014-03-24Use the new chunked and identity transfer decoding code from cowlibLoïc Hoguin
2014-03-10Remove cowboy_http:urldecode/1 and urlencode/1Loïc Hoguin
Use cow_qs:urldecode/1 and cow_qs:urlencode/1 instead
2014-02-09Allow empty passwords when parsing Basic authorization headerAli Sabil
2014-02-06Update copyright yearsLoïc Hoguin
2014-01-24Allows language_range/2 to parse RFC5646 language codes.Drew
2013-11-26Fix tohexu/1 and tohexl/1Matthias Endler
tohexu(16) or tohexl(16) will now crash, instead of evaluating to $G or $g.
2013-11-08Optimize query string parsingLoïc Hoguin
* Parsing code was moved to cowlib: cowboy_qs:parse_qs/1 * A function was added to build query strings: cowboy_qs:qs/1 * Also added cowboy_qs:urlencode/1 and cowboy_qsurldecode/1
2013-10-23Move cookie parsing/building code to cowlibLoïc Hoguin
The code for parsing has also been rewritten to be more efficient and to be able to handle cookie values with space inside them properly. Update cowlib to 0.2.0.
2013-07-05Fix decoding of chunked body.James Fish
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-06-20Add support for the webkit deflate frame extensionAli Sabil
2013-05-31In content-types, the charset parameter is converted to lowercaseLoïc Hoguin
We know this specific parameter is case insensitive so we automatically lowercase it to make things simpler to the developer.
2013-05-16Move cowboy_http:status() to cowboy:http_status()Loïc Hoguin
2013-05-16Move cowboy_http:headers() to cowboy:http_headers()Loïc Hoguin
2013-05-16Move cowboy_http:version() to cowboy:http_version()Loïc Hoguin
2013-05-16Make the HTTP version type more practicalLoïc Hoguin
Now instead of {1, 1} we have 'HTTP/1.1', and instead of {1, 0} we have 'HTTP/1.0'. This is more efficient, easier to read in crash logs, and clearer in the code.
2013-05-15Change some module calls to local function callsLoïc Hoguin
2013-04-26Merge branch 'range_header' of git://github.com/Egobrain/cowboyLoïc Hoguin
2013-04-26Added range header parserEgobrain
2013-04-26Removed asserts from unit testsEgobrain
2013-04-25Cookie names are case sensitiveLoïc Hoguin
This should be more in line with what browsers are doing, and will prevent errors due to failed expectations.
2013-03-05Make streamed chunk size configurableLoïc Hoguin
Defaults to a maximum of 1000000 bytes. Also standardize the te_identity and te_chunked decoding functions. Now they both try to read as much as possible (up to the limit), making body reading much faster when not using chunked encoding.
2013-02-12Make cowboy_http.erl compile with +nativeAdam Cammack
Worked until 27da092
2013-02-06Strip whitespaces when authorization type is unknownLoïc Hoguin
2013-01-29Merge branch 'feature_basic_auth' of https://github.com/ivlis/cowboyLoïc Hoguin
2013-01-30Implement authorization header parsingIvan Lisenkov
Basic HTTP authorization according to RFC 2617 is implemented. Added an example of its usage with REST handler.
2013-01-29Fix chunked streaming of request body and improve speedLoïc Hoguin
2013-01-04Hello 2013Loïc Hoguin
2012-12-20We accept iodata() when setting cookies; fix thatLoïc Hoguin
2012-12-20Fix parsing of the Cookie headerLoïc Hoguin
This should be equivalent to what we do in Set-Cookie. Real-world testing is needed to confirm it works as intended.
2012-12-17Fix cowboy_http:cookie_to_iodata/3Loïc Hoguin
No more trying to quote, this is still completely broken everywhere.
2012-12-13Add missing quotes to quoting for cookie valuesLoïc Hoguin
2012-12-07Make cookies use universal time instead of local timeLoïc Hoguin
Includes: * cowboy_clock:rfc2109/1 now expects UTC datetime * Rewrite of the cookie code to cowboy_http * Removal of cowboy_cookies * Add type cowboy_req:cookie_opts/0 Cookies should now be set using cowboy_req:set_resp_cookie/3. Code calling cowboy_cookies directly will need to be updated.
2012-09-29Remove the urldecode cowboy_protocol optionLoïc Hoguin
This allows inconsistent behavior and is not used enough to be supported.
2012-09-27Optimize Connection header parsingLoïc Hoguin
Still optimizing the critical path. Removes cowboy_http:connection_to_atom/1.
2012-09-26Optimize cowboy_protocolLoïc Hoguin
* #state{} changes are avoided where possible * #state{} is now smaller and use less memory * the Req object is created only after the whole request is parsed * parsing makes use of a single binary match context * external calls are avoided in the critical path * URL fragment is now extracted properly (retrieval API next commit) * argument orders to local functions modified to avoid extra operations * dispatching waits as long as possible before tokenizing host/path * handler opts are no longer shown in the error messages except in init The code may not look as beautiful as it was before. But it really is, for parsing code. The parsing section of the file may be skipped if your eyes start to burn.
2012-09-23Use binary:match/2 instead of binary:split/2 in cowboy_httpLoïc Hoguin
Also fix a bug introduced in a previous commit.
2012-09-21Don't use decode_packet/3 for parsing the headersLoïc Hoguin
Header names are now binaries. Since header names are case insensitive they are all converted to lowercase. For example: <<"content-length">>. The max_line_length option was removed. Three new options have been added instead: * max_request_line_length (defaults to 4096) * max_header_name_length (defaults to 64) * max_header_value_length (defaults to 4096)
2012-09-21Don't use decode_packet/3 for parsing the request-lineLoïc Hoguin
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.