aboutsummaryrefslogtreecommitdiffstats
path: root/doc/src
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src')
-rw-r--r--doc/src/guide/book.asciidoc6
-rw-r--r--doc/src/guide/getting_started.asciidoc9
-rw-r--r--doc/src/guide/introduction.asciidoc2
-rw-r--r--doc/src/guide/listeners.asciidoc2
-rw-r--r--doc/src/guide/loop_handlers.asciidoc27
-rw-r--r--doc/src/guide/migrating_from_2.10.asciidoc139
-rw-r--r--doc/src/guide/migrating_from_2.11.asciidoc15
-rw-r--r--doc/src/guide/migrating_from_2.5.asciidoc2
-rw-r--r--doc/src/guide/migrating_from_2.9.asciidoc42
-rw-r--r--doc/src/guide/req_body.asciidoc30
-rw-r--r--doc/src/guide/resource_design.asciidoc17
-rw-r--r--doc/src/guide/rest_conneg.pngbin78133 -> 75587 bytes
-rw-r--r--doc/src/guide/rest_conneg.svg277
-rw-r--r--doc/src/guide/rest_flowcharts.asciidoc18
-rw-r--r--doc/src/guide/rest_get_head.pngbin94321 -> 171818 bytes
-rw-r--r--doc/src/guide/rest_get_head.svg1343
-rw-r--r--doc/src/guide/rest_handlers.asciidoc19
-rw-r--r--doc/src/guide/rest_start.pngbin110820 -> 107258 bytes
-rw-r--r--doc/src/guide/rest_start.svg69
-rw-r--r--doc/src/guide/streams.asciidoc5
-rw-r--r--doc/src/guide/ws_handlers.asciidoc2
-rw-r--r--doc/src/manual/cowboy.asciidoc1
-rw-r--r--doc/src/manual/cowboy.get_env.asciidoc78
-rw-r--r--doc/src/manual/cowboy.set_env.asciidoc1
-rw-r--r--doc/src/manual/cowboy_app.asciidoc1
-rw-r--r--doc/src/manual/cowboy_compress_h.asciidoc7
-rw-r--r--doc/src/manual/cowboy_decompress_h.asciidoc70
-rw-r--r--doc/src/manual/cowboy_http.asciidoc49
-rw-r--r--doc/src/manual/cowboy_http2.asciidoc41
-rw-r--r--doc/src/manual/cowboy_loop.asciidoc8
-rw-r--r--doc/src/manual/cowboy_metrics_h.asciidoc1
-rw-r--r--doc/src/manual/cowboy_req.asciidoc8
-rw-r--r--doc/src/manual/cowboy_req.cast.asciidoc16
-rw-r--r--doc/src/manual/cowboy_req.read_body.asciidoc10
-rw-r--r--doc/src/manual/cowboy_rest.asciidoc145
-rw-r--r--doc/src/manual/cowboy_static.asciidoc2
-rw-r--r--doc/src/manual/cowboy_stream.asciidoc17
-rw-r--r--doc/src/manual/cowboy_stream.data.asciidoc81
-rw-r--r--doc/src/manual/cowboy_stream.early_error.asciidoc73
-rw-r--r--doc/src/manual/cowboy_stream.info.asciidoc77
-rw-r--r--doc/src/manual/cowboy_stream.init.asciidoc80
-rw-r--r--doc/src/manual/cowboy_stream.terminate.asciidoc61
-rw-r--r--doc/src/manual/cowboy_stream_h.asciidoc56
-rw-r--r--doc/src/manual/cowboy_tracer_h.asciidoc1
-rw-r--r--doc/src/manual/cowboy_websocket.asciidoc4
45 files changed, 2493 insertions, 419 deletions
diff --git a/doc/src/guide/book.asciidoc b/doc/src/guide/book.asciidoc
index 0edb99a..cf8c943 100644
--- a/doc/src/guide/book.asciidoc
+++ b/doc/src/guide/book.asciidoc
@@ -75,6 +75,12 @@ include::performance.asciidoc[Performance]
= Additional information
+include::migrating_from_2.11.asciidoc[Migrating from Cowboy 2.11 to 2.12]
+
+include::migrating_from_2.10.asciidoc[Migrating from Cowboy 2.10 to 2.11]
+
+include::migrating_from_2.9.asciidoc[Migrating from Cowboy 2.9 to 2.10]
+
include::migrating_from_2.8.asciidoc[Migrating from Cowboy 2.8 to 2.9]
include::migrating_from_2.7.asciidoc[Migrating from Cowboy 2.7 to 2.8]
diff --git a/doc/src/guide/getting_started.asciidoc b/doc/src/guide/getting_started.asciidoc
index 7104d9a..a26802d 100644
--- a/doc/src/guide/getting_started.asciidoc
+++ b/doc/src/guide/getting_started.asciidoc
@@ -62,14 +62,16 @@ handler.
=== Cowboy setup
We will modify the 'Makefile' to tell the build system it needs to
-fetch and compile Cowboy:
+fetch and compile Cowboy, and that we will use releases:
[source,makefile]
----
PROJECT = hello_erlang
DEPS = cowboy
-dep_cowboy_commit = 2.9.0
+dep_cowboy_commit = 2.11.0
+
+REL_DEPS = relx
DEP_PLUGINS = cowboy
@@ -80,6 +82,9 @@ The `DEP_PLUGINS` line tells the build system to load the plugins
Cowboy provides. These include predefined templates that we will
use soon.
+The `REL_DEPS` line tells the build system to fetch and build
+`relx`, the library that will create the release.
+
If you do `make run` now, Cowboy will be included in the release
and started automatically. This is not enough however, as Cowboy
doesn't do anything by default. We still need to tell Cowboy to
diff --git a/doc/src/guide/introduction.asciidoc b/doc/src/guide/introduction.asciidoc
index f81c872..519608d 100644
--- a/doc/src/guide/introduction.asciidoc
+++ b/doc/src/guide/introduction.asciidoc
@@ -42,7 +42,7 @@ Cowboy is developed for Erlang/OTP 22.0 and newer.
Cowboy uses the ISC License.
----
-Copyright (c) 2011-2019, Loïc Hoguin <[email protected]>
+Copyright (c) 2011-2024, Loïc Hoguin <[email protected]>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
diff --git a/doc/src/guide/listeners.asciidoc b/doc/src/guide/listeners.asciidoc
index 04169f9..40aff83 100644
--- a/doc/src/guide/listeners.asciidoc
+++ b/doc/src/guide/listeners.asciidoc
@@ -7,7 +7,7 @@ Depending on the connection handshake, one or another protocol
may be used.
This chapter is specific to Cowboy. Please refer to the
-https://ninenines.eu/docs/en/ranch/1.3/guide/listeners/[Ranch User Guide]
+https://ninenines.eu/docs/en/ranch/1.8/guide/listeners/[Ranch User Guide]
for more information about listeners.
Cowboy provides two types of listeners: one listening for
diff --git a/doc/src/guide/loop_handlers.asciidoc b/doc/src/guide/loop_handlers.asciidoc
index e574854..fc45d1c 100644
--- a/doc/src/guide/loop_handlers.asciidoc
+++ b/doc/src/guide/loop_handlers.asciidoc
@@ -31,7 +31,10 @@ for plain HTTP handlers.
The `init/2` function must return a `cowboy_loop` tuple to enable
loop handler behavior. This tuple may optionally contain
the atom `hibernate` to make the process enter hibernation
-until a message is received.
+until a message is received. Alternatively, the tuple may
+optionally contain a positive integer to create a `timeout`
+message when the process has not received messages for too
+long.
This snippet enables the loop handler:
@@ -49,6 +52,14 @@ init(Req, State) ->
{cowboy_loop, Req, State, hibernate}.
----
+This makes the process time out after 1000ms of idle time.
+
+[source,erlang]
+----
+init(Req, State) ->
+ {cowboy_loop, Req, State, 1000}.
+----
+
=== Receive loop
Once initialized, Cowboy will wait for messages to arrive
@@ -123,3 +134,17 @@ messages received. This is done by returning the atom
`hibernate` as part of the `loop` tuple callbacks normally
return. Just add the atom at the end and Cowboy will hibernate
accordingly.
+
+=== Idle timeout
+
+You may activate timeout events by returning a positive integer
+`N` as part of the `loop` tuple callbacks return. The default
+value is `infinity`. The `info` callback will be called with the
+atom `timeout` unless a message is received within `N` milliseconds:
+
+[source,erlang]
+----
+info(timeout, Req, State) ->
+ %% Do something...
+ {ok, Req, State, 1000}.
+----
diff --git a/doc/src/guide/migrating_from_2.10.asciidoc b/doc/src/guide/migrating_from_2.10.asciidoc
new file mode 100644
index 0000000..aaa8fe9
--- /dev/null
+++ b/doc/src/guide/migrating_from_2.10.asciidoc
@@ -0,0 +1,139 @@
+[appendix]
+== Migrating from Cowboy 2.10 to 2.11
+
+Cowboy 2.11 contains a variety of new features and bug
+fixes. Nearly all previously experimental features are
+now marked as stable, including Websocket over HTTP/2.
+Included is a fix for an HTTP/2 protocol CVE.
+
+Cowboy 2.11 requires Erlang/OTP 24.0 or greater.
+
+Cowboy is now using GitHub Actions for CI. The main reason
+for the move is to reduce costs by no longer having to
+self-host CI runners. The downside is that GitHub runners
+are less reliable and timing dependent tests are now more
+likely to fail.
+
+=== Features added
+
+* A new HTTP/2 option `max_cancel_stream_rate` has been added
+ to control the rate of stream cancellation the server will
+ accept. By default Cowboy will accept 500 cancelled streams
+ every 10 seconds.
+
+* A new stream handler `cowboy_decompress_h` has been added.
+ It allows automatically decompressing incoming gzipped
+ request bodies. It includes options to protect against
+ zip bombs.
+
+* Websocket over HTTP/2 is no longer considered experimental.
+ Note that the `enable_connect_protocol` option must be set
+ to `true` in order to use Websocket over HTTP/2 for the
+ time being.
+
+* Automatic mode for reading request bodies has been
+ documented. In automatic mode, Cowboy waits indefinitely
+ for data and sends a `request_body` message when data
+ comes in. It mirrors `{active, once}` socket modes.
+ This is ideal for loop handlers and is also used
+ internally for HTTP/2 Websocket.
+
+* Ranged requests support is no longer considered
+ experimental. It was added in 2.6 to both `cowboy_static`
+ and `cowboy_rest`. Ranged responses can be produced
+ either automatically (for the `bytes` unit) or manually.
+ REST flowcharts have been updated with the new callbacks
+ and steps related to handling ranged requests.
+
+* A new HTTP/1.1 and HTTP/2 option `reset_idle_timeout_on_send`
+ has been added. When enabled, the `idle_timeout` will be
+ reset every time Cowboy sends data to the socket.
+
+* Loop handlers may now return a timeout value in the place
+ of `hibernate`. Timeouts behave the same as in `gen_server`.
+
+* The `generate_etag` callback of REST handlers now accepts
+ `undefined` as a return value to allow conditionally
+ generating etags.
+
+* The `cowboy_compress_h` options `compress_threshold` and
+ `compress_buffering` are no longer considered experimental.
+ They were de facto stable since 2.6 as they already were
+ documented.
+
+* Functions `cowboy:get_env/2,3` have been added.
+
+* Better error messages have been added when trying to send
+ a 204 or 304 response with a body; when attempting to
+ send two responses to a single request; when trying to
+ push a response after the final response; when trying
+ to send a `set-cookie` header without using
+ `cowboy_req:set_resp_cookie/3,4`.
+
+=== Features removed
+
+* Cowboy will no longer include the NPN extension when
+ starting a TLS listener. This extension has long been
+ deprecated and replaced with the ALPN extension. Cowboy
+ will continue using the ALPN extension for protocol
+ negotiation.
+
+=== Bugs fixed
+
+* A fix was made to address the HTTP/2 CVE CVE-2023-44487
+ via the new HTTP/2 option `max_cancel_stream_rate`.
+
+* HTTP/1.1 requests that contain both a content-length and
+ a transfer-encoding header will now be rejected to avoid
+ security risks. Previous behavior was to ignore the
+ content-length header as recommended by the HTTP RFC.
+
+* HTTP/1.1 connections would sometimes use the wrong timeout
+ value to determine whether the connection should be closed.
+ This resulted in connections staying up longer than
+ intended. This should no longer be the case.
+
+* Cowboy now reacts to socket errors immediately for HTTP/1.1
+ and HTTP/2 when possible. Cowboy will notice when connections
+ have been closed properly earlier than before. This also
+ means that the socket option `send_timeout_close` will work
+ as expected.
+
+* Shutting down HTTP/1.1 pipelined requests could lead to
+ the current request being terminated before the response
+ has been sent. This has been addressed.
+
+* When using HTTP/1.1 an invalid Connection header will now
+ be rejected with a 400 status code instead of crashing.
+
+* The documentation now recommends increasing the HTTP/2
+ option `max_frame_size_received`. Cowboy currently uses
+ the protocol default but will increase its default in a
+ future release. Until then users are recommended to set
+ the option to ensure larger requests are accepted and
+ processed with acceptable performance.
+
+* Cowboy could sometimes send HTTP/2 WINDOW_UPDATE frames
+ twice in a row. Now they should be consolidated.
+
+* Cowboy would sometimes send HTTP/2 WINDOW_UPDATE frames
+ for streams that have stopped internally. This should
+ no longer be the case.
+
+* The `cowboy_compress_h` stream handler will no longer
+ attempt to compress responses that have an `etag` header
+ to avoid caching issues.
+
+* The `cowboy_compress_h` will now always add `accept-encoding`
+ to the `vary` header as it indicates that responses may
+ be compressed.
+
+* Cowboy will now remove the `trap_exit` process flag when
+ HTTP/1.1 connections upgrade to Websocket.
+
+* Exit gracefully instead of crashing when the socket gets
+ closed when reading the PROXY header.
+
+* Missing `cowboy_stream` manual pages have been added.
+
+* A number of fixes were made to documentation and examples.
diff --git a/doc/src/guide/migrating_from_2.11.asciidoc b/doc/src/guide/migrating_from_2.11.asciidoc
new file mode 100644
index 0000000..ab74642
--- /dev/null
+++ b/doc/src/guide/migrating_from_2.11.asciidoc
@@ -0,0 +1,15 @@
+[appendix]
+== Migrating from Cowboy 2.11 to 2.12
+
+Cowboy 2.12 contains a small security improvement for
+the HTTP/2 protocol.
+
+Cowboy 2.12 requires Erlang/OTP 24.0 or greater.
+
+=== Features added
+
+* A new HTTP/2 option `max_fragmented_header_block_size` has
+ been added to limit the size of header blocks that are
+ sent over multiple HEADERS and CONTINUATION frames.
+
+* Update Cowlib to 2.13.0.
diff --git a/doc/src/guide/migrating_from_2.5.asciidoc b/doc/src/guide/migrating_from_2.5.asciidoc
index b91b617..5196cc7 100644
--- a/doc/src/guide/migrating_from_2.5.asciidoc
+++ b/doc/src/guide/migrating_from_2.5.asciidoc
@@ -64,7 +64,7 @@ experimental.
* Add automatic handling of range requests to REST handlers
that return the callback `auto` from `ranges_accepted/2`.
Cowboy will call the configured `ProvideCallback` and
- then split the ouput automatically for the ranged response.
+ then split the output automatically for the ranged response.
* Enable range requests support in `cowboy_static`.
diff --git a/doc/src/guide/migrating_from_2.9.asciidoc b/doc/src/guide/migrating_from_2.9.asciidoc
new file mode 100644
index 0000000..7395e5f
--- /dev/null
+++ b/doc/src/guide/migrating_from_2.9.asciidoc
@@ -0,0 +1,42 @@
+[appendix]
+== Migrating from Cowboy 2.9 to 2.10
+
+Cowboy 2.10 is a maintenance release adding support
+for Erlang/OTP 26. The main change is a Cowlib update
+to fix a compilation error that only occurs starting
+from OTP 26.
+
+Cowboy 2.10 requires Erlang/OTP 22.0 or greater.
+
+=== Features added
+
+* Add support for `Default` value of SameSite
+ cookie attribute.
+
+* Add support for the `stale-*` cache-control directives
+ from RFC 5861.
+
+* Update Cowlib to 2.12.1.
+
+=== Bugs fixed
+
+* Fix a compilation error in Cowlib when using Erlang/OTP 26.
+
+* Fix data sent after RST_STREAM in HTTP/2 in rare cases.
+
+* Fix parsing of RST_STREAM frames to properly handle
+ frames that have a valid length but were not fully
+ received yet.
+
+* Remove the obsolete `Version` cookie attribute.
+
+* Handle more edge cases for cookie parsing based on updates
+ to the RFC 6265bis draft.
+
+* Make Basic auth parsing ignore unknown authentication
+ parameters and generally update the code to conform
+ to RFC 7617.
+
+* Fix URI template reserved expansion of %-encoded.
+
+* Update structured headers implementation to RFC 8941.
diff --git a/doc/src/guide/req_body.asciidoc b/doc/src/guide/req_body.asciidoc
index 4906811..88389f6 100644
--- a/doc/src/guide/req_body.asciidoc
+++ b/doc/src/guide/req_body.asciidoc
@@ -74,17 +74,33 @@ only up to 1MB for up to 5 seconds:
#{length => 1000000, period => 5000}).
----
-You may also disable the length limit:
+These two options can effectively be used to control
+the rate of transmission of the request body.
+
+It is also possible to asynchronously read the request
+body using auto mode:
[source,erlang]
-{ok, Data, Req} = cowboy_req:read_body(Req0, #{length => infinity}).
+----
+Ref = make_ref(),
+cowboy_req:cast({read_body, self(), Ref, auto, infinity}, Req).
+----
-This makes the function wait 15 seconds and return with
-whatever arrived during that period. This is not
-recommended for public facing applications.
+Cowboy will wait indefinitely for data and then send a
+`request_body` message as soon as it has data available,
+regardless of length.
-These two options can effectively be used to control
-the rate of transmission of the request body.
+[source,erlang]
+----
+receive
+ {request_body, Ref, nofin, Data} ->
+ do_something(Data);
+ {request_body, Ref, fin, _BodyLen, Data} ->
+ do_something(Data)
+end.
+----
+
+Asynchronous reading of data pairs well with loop handlers.
=== Streaming the body
diff --git a/doc/src/guide/resource_design.asciidoc b/doc/src/guide/resource_design.asciidoc
index 954d87d..125b437 100644
--- a/doc/src/guide/resource_design.asciidoc
+++ b/doc/src/guide/resource_design.asciidoc
@@ -144,6 +144,16 @@ never be called.
Implement the `languages_provided` or `charsets_provided`
callbacks if applicable.
+Does the resource accept ranged requests? If it does,
+implement the `ranges_provided` callback. Resources that
+only accept `bytes` units can use the callback name
+`auto` and let Cowboy automatically do ranged responses.
+Other callbacks should have a name prefix of `ranged_`
+for clarity. For example, `ranged_bytes` or `ranged_pages`.
+If the resource needs to perform additional checks before
+accepting to do a ranged responses, implement the
+`range_satisfiable` callback.
+
Is there any other header that may make the representation
of the resource vary? Implement the `variances` callback.
@@ -191,10 +201,15 @@ the `options` method.
=== GET and HEAD methods
If you implement the methods GET and/or HEAD, you must
-implement one `ProvideResource` callback for each
+implement one `ProvideCallback` callback for each
content-type returned by the `content_types_provided`
callback.
+When range requests are accepted, you must implement one
+`RangeCallback` for each range unit returned by
+`ranges_provided` (unless `auto` was used). This is
+in addition to the `ProvideCallback` callback.
+
=== PUT, POST and PATCH methods
If you implement the methods PUT, POST and/or PATCH,
diff --git a/doc/src/guide/rest_conneg.png b/doc/src/guide/rest_conneg.png
index 65ecdcf..79aa69b 100644
--- a/doc/src/guide/rest_conneg.png
+++ b/doc/src/guide/rest_conneg.png
Binary files differ
diff --git a/doc/src/guide/rest_conneg.svg b/doc/src/guide/rest_conneg.svg
index 247567a..97bba6a 100644
--- a/doc/src/guide/rest_conneg.svg
+++ b/doc/src/guide/rest_conneg.svg
@@ -2,24 +2,23 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
- xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.09448819"
height="1052.3622047"
id="svg2"
version="1.1"
- inkscape:version="0.48.4 r9939"
+ inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="rest_conneg.svg"
inkscape:export-filename="/home/essen/Dropbox/Public/drawing.png"
inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
+ inkscape:export-ydpi="90"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<linearGradient
@@ -50,7 +49,7 @@
</linearGradient>
<linearGradient
id="linearGradient5233"
- osb:paint="solid">
+ inkscape:swatch="solid">
<stop
style="stop-color:#69d2e7;stop-opacity:1;"
offset="0"
@@ -64,26 +63,34 @@
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
- inkscape:zoom="1.4142136"
- inkscape:cx="222.80947"
- inkscape:cy="634.56615"
+ inkscape:zoom="0.65304847"
+ inkscape:cx="259.55194"
+ inkscape:cy="483.11881"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
- inkscape:window-width="2560"
- inkscape:window-height="1402"
+ inkscape:window-width="1440"
+ inkscape:window-height="900"
inkscape:window-x="0"
- inkscape:window-y="38"
+ inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="true"
- showguides="true">
+ showguides="true"
+ inkscape:showpageshadow="2"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid5357"
empspacing="5"
- visible="true"
+ visible="false"
enabled="true"
- snapvisiblegridlinesonly="true" />
+ snapvisiblegridlinesonly="true"
+ originx="0"
+ originy="0"
+ spacingy="1"
+ spacingx="1"
+ units="px" />
</sodipodi:namedview>
<metadata
id="metadata7">
@@ -93,7 +100,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
+ <dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -112,7 +119,7 @@
<g
transform="translate(303.92143,-296.03137)"
id="g5650-7"
- inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-filename="rest_conneg.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643">
<path
@@ -557,149 +564,149 @@
inkscape:export-ydpi="89.926643" />
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
x="-58.692513"
y="114.39204"
- id="text5371"
- sodipodi:linespacing="125%"><tspan
+ id="text5371"><tspan
sodipodi:role="line"
id="tspan5373"
x="-58.692513"
- y="114.39204">some text</tspan></text>
+ y="114.39204"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">some text</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="-58.692513"
y="53.112247"
- id="text5371-2"
- sodipodi:linespacing="125%"><tspan
+ id="text5371-2"><tspan
sodipodi:role="line"
id="tspan5373-6"
x="-58.692513"
- y="53.112247">some text</tspan></text>
+ y="53.112247"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">some text</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="246.18575"
y="310.19913"
id="text5371-2-3"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-7"
x="246.18575"
- y="310.19913">has accept-language?</tspan></text>
+ y="310.19913"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">has accept-language?</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="245.60762"
y="477.47531"
id="text5371-2-3-0"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-7-3"
x="245.60762"
- y="477.47531">has accept-charset?</tspan></text>
+ y="477.47531"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">has accept-charset?</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
x="-58.692513"
y="236.95154"
- id="text5371-4"
- sodipodi:linespacing="125%"><tspan
+ id="text5371-4"><tspan
sodipodi:role="line"
id="tspan5373-9"
x="-58.692513"
- y="236.95154">some text</tspan></text>
+ y="236.95154"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">some text</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
x="245.00391"
y="60.912468"
id="text5371-4-0"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
x="245.00391"
y="60.912468"
- id="tspan17171">start</tspan></text>
+ id="tspan17171"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">start</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="246.11153"
y="561.14258"
id="text5371-2-9"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-8"
x="246.11153"
- y="561.14258">charsets_provided</tspan></text>
+ y="561.14258"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">charsets_provided</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="246.64278"
y="646.58331"
id="text5371-2-7"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-2"
x="246.64278"
- y="646.58331">variances</tspan></text>
+ y="646.58331"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">ranges_provided</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="246.13106"
y="142.80627"
id="text5371-2-95"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-80"
x="246.13106"
- y="142.80627">has accept?</tspan></text>
+ y="142.80627"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">has accept?</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="245.80684"
y="226.4736"
id="text5371-2-32"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-27"
x="245.80684"
- y="226.4736">content_types_provided</tspan></text>
+ y="226.4736"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">content_types_provided</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="246.05293"
y="393.80801"
id="text5371-2-74"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-18"
x="246.05293"
- y="393.80801">languages_provided</tspan></text>
+ y="393.80801"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">languages_provided</tspan></text>
<rect
style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect5273-1-2"
@@ -710,88 +717,88 @@
rx="15" />
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
x="262.26562"
y="185.95248"
id="text5371-2-391"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-63"
x="262.26562"
- y="185.95248">true</tspan></text>
+ y="185.95248"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
x="262.26562"
y="269.61978"
id="text5371-2-954"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-808"
x="262.26562"
- y="269.61978">provided*</tspan></text>
+ y="269.61978"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">provided*</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
x="262.26562"
y="353.28702"
id="text5371-2-4"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-11"
x="262.26562"
- y="353.28702">true</tspan></text>
+ y="353.28702"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
x="262.26562"
y="436.95425"
id="text5371-2-92"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-4"
x="262.26562"
- y="436.95425">provided*</tspan></text>
+ y="436.95425"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">provided*</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
x="262.26562"
y="520.62152"
id="text5371-2-739"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-0"
x="262.26562"
- y="520.62152">true</tspan></text>
+ y="520.62152"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
x="262.26562"
y="604.28876"
id="text5371-2-8"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-3"
x="262.26562"
- y="604.28876">provided*</tspan></text>
+ y="604.28876"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">provided*</tspan></text>
<g
transform="matrix(0,-1,1,0,-513.31414,353.05561)"
id="g5650-2">
@@ -820,75 +827,75 @@
</g>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
x="76.761719"
y="227.88033"
id="text5371-4-6"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-0"
x="76.761719"
- y="227.88033">false</tspan></text>
+ y="227.88033"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
x="76.761719"
y="395.20209"
id="text5371-4-2"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-01"
x="76.761719"
- y="395.20209">false</tspan></text>
+ y="395.20209"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
x="413.26172"
y="374.19577"
id="text5371-4-3"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-62"
x="413.26172"
- y="374.19577">not provided*</tspan></text>
+ y="374.19577"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">not provided*</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
x="76.761719"
y="562.52386"
id="text5371-4-4"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-2"
x="76.761719"
- y="562.52386">false</tspan></text>
+ y="562.52386"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
x="-8.8034744"
y="663.24762"
id="text5371-4-5"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"
- transform="matrix(0.7410941,-0.67140117,0.67140117,0.7410941,0,0)"><tspan
+ transform="rotate(-42.1753)"><tspan
sodipodi:role="line"
id="tspan5373-9-09"
x="-8.8034744"
- y="663.24762">not provided*</tspan></text>
+ y="663.24762"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">not provided*</tspan></text>
<rect
style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.73499846;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect5273-7-3-1"
@@ -931,18 +938,18 @@
</g>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
x="599.20062"
y="394.09869"
id="text5371-43"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-3"
x="599.20062"
- y="394.09869">406 not acceptable</tspan></text>
+ y="394.09869"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">406 not acceptable</tspan></text>
<rect
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:2.44279909;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect5367"
@@ -956,19 +963,19 @@
inkscape:export-ydpi="89.926643" />
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="-544.69421"
y="-354.17184"
id="text5371-2-3-0-7"
- sodipodi:linespacing="125%"
- transform="matrix(0,-1,1,0,0,0)"
+ transform="rotate(-90)"
inkscape:export-filename="/home/essen/extend/cowboy/guide/http_req_resp.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-7-3-9"
x="-544.69421"
- y="-354.17184">middlewares</tspan></text>
+ y="-354.17184"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">middlewares</tspan></text>
<g
transform="matrix(0,-1,1,0,-508.93096,565.23553)"
id="g5650-2-0-4"
@@ -1093,19 +1100,48 @@
</g>
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
x="509.41452"
y="-106.16136"
id="text5371-4-5-9"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"
- transform="matrix(0.69480867,0.71919462,-0.71919462,0.69480867,0,0)"><tspan
+ transform="rotate(45.988027)"><tspan
sodipodi:role="line"
id="tspan5373-9-09-1"
x="509.41452"
- y="-106.16136">not provided*</tspan></text>
+ y="-106.16136"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">not provided*</tspan></text>
+ <g
+ transform="translate(303.92156,372.14538)"
+ id="g5650-6-2-7"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-78-4-5"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-9-2-3"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
<rect
style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect5273-1-41-0"
@@ -1119,17 +1155,42 @@
inkscape:export-ydpi="89.926643" />
<text
xml:space="preserve"
- style="font-size:16px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
x="246.15048"
- y="725.27777"
+ y="730.10156"
id="text5371-2-7-9"
- sodipodi:linespacing="125%"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-2-1"
x="246.15048"
- y="725.27777">...</tspan></text>
+ y="730.10156"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">variances</tspan></text>
+ <rect
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-1-41-0-2"
+ width="210.17955"
+ height="35.209244"
+ x="141.049"
+ y="789.44257"
+ rx="15"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="246.15047"
+ y="808.03937"
+ id="text5371-2-7-9-9"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-2-1-1"
+ x="246.15047"
+ y="808.03937"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">...</tspan></text>
</g>
</svg>
diff --git a/doc/src/guide/rest_flowcharts.asciidoc b/doc/src/guide/rest_flowcharts.asciidoc
index 308a919..b8d0e0d 100644
--- a/doc/src/guide/rest_flowcharts.asciidoc
+++ b/doc/src/guide/rest_flowcharts.asciidoc
@@ -95,6 +95,11 @@ callback will only be called at the end of the
"GET and HEAD methods" diagram, when all conditions
have been met.
+Optionally, the `ranges_provided` also returns the
+name of a callback for every range unit it accepts. This
+will be called at the end of the "GET and HEAD methods"
+diagram in the case of ranged requests.
+
The selected content-type, language and charset are
saved as meta values in the Req object. You *should*
use the appropriate representation if you set a
@@ -121,11 +126,18 @@ succeed, the resource can be retrieved.
Cowboy prepares the response by first retrieving
metadata about the representation, then by calling
-the `ProvideResource` callback. This is the callback
+the `ProvideCallback` callback. This is the callback
you defined for each content-types you returned from
`content_types_provided`. This callback returns the body
-that will be sent back to the client, or a fun if the
-body must be streamed.
+that will be sent back to the client.
+
+For ranged requests, but only when the `ranges_provided`
+callback was defined earlier, Cowboy will add the selected
+`range` information to the Req object and call the
+`range_satisfiable` callback. After confirming that the
+range can be provided, Cowboy calls the `RangeResource`
+callback and produces a ranged response using the
+ranged data from the callback.
When the resource does not exist, Cowboy will figure out
whether the resource existed previously, and if so whether
diff --git a/doc/src/guide/rest_get_head.png b/doc/src/guide/rest_get_head.png
index 211ab60..24f8de4 100644
--- a/doc/src/guide/rest_get_head.png
+++ b/doc/src/guide/rest_get_head.png
Binary files differ
diff --git a/doc/src/guide/rest_get_head.svg b/doc/src/guide/rest_get_head.svg
index 92030cf..cf66089 100644
--- a/doc/src/guide/rest_get_head.svg
+++ b/doc/src/guide/rest_get_head.svg
@@ -2,24 +2,23 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
- xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.09448819"
height="1052.3622047"
id="svg2"
version="1.1"
- inkscape:version="0.92.1 r"
+ inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="rest_get_head.svg"
inkscape:export-filename="/home/essen/Dropbox/Public/drawing.png"
inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
+ inkscape:export-ydpi="90"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<linearGradient
@@ -50,7 +49,7 @@
</linearGradient>
<linearGradient
id="linearGradient5233"
- osb:paint="solid">
+ inkscape:swatch="solid">
<stop
style="stop-color:#69d2e7;stop-opacity:1;"
offset="0"
@@ -64,26 +63,34 @@
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
- inkscape:zoom="1.4142136"
- inkscape:cx="353.51266"
- inkscape:cy="522.73683"
+ inkscape:zoom="0.66612663"
+ inkscape:cx="444.35996"
+ inkscape:cy="784.3854"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
- inkscape:window-width="1920"
- inkscape:window-height="1043"
+ inkscape:window-width="1440"
+ inkscape:window-height="900"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="true"
- showguides="true">
+ showguides="true"
+ inkscape:showpageshadow="2"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1">
<inkscape:grid
type="xygrid"
id="grid5357"
empspacing="5"
- visible="true"
+ visible="false"
enabled="true"
- snapvisiblegridlinesonly="true" />
+ snapvisiblegridlinesonly="true"
+ originx="0"
+ originy="0"
+ spacingy="1"
+ spacingx="1"
+ units="px" />
</sodipodi:namedview>
<metadata
id="metadata7">
@@ -101,6 +108,223 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
+ <g
+ transform="rotate(57.423293,-360.21231,998.44074)"
+ id="g5650-2-6-7"
+ inkscape:export-filename="rest_get_head.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-2-10-6"
+ d="M -57.78256,275.13761 V 404.27753"
+ style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-12-6-7"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <g
+ transform="rotate(90,13.664042,694.60225)"
+ id="g5650-2-2-17-9">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-2-1-0-4"
+ d="m -57.78256,343.20394 v 61.59661"
+ style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-12-5-45-9"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <g
+ transform="rotate(142.84301,-18.689938,738.63976)"
+ id="g5650-2-2-17-9-1">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-2-1-0-4-2"
+ d="m -57.78256,343.20394 v 61.59661"
+ style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-12-5-45-9-9"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <g
+ transform="rotate(57.423293,-61.041025,828.63629)"
+ id="g5650-2-6">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-2-10"
+ d="M -57.78256,275.13761 V 404.27753"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-12-6"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <g
+ transform="matrix(0.53842825,-0.84267136,-0.84267136,-0.53842825,668.22258,813.26466)"
+ id="g5650-2-6-0">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-2-10-9"
+ d="M -57.78256,275.13761 V 404.27753"
+ style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-12-6-1"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <g
+ transform="matrix(0.7948003,-0.60687106,-0.60687106,-0.7948003,570.69023,937.57491)"
+ id="g5650-2-6-0-1">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-2-10-9-1"
+ d="m -56.935096,252.07781 -0.800167,152.0263"
+ style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2.35779;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-12-6-1-5"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <g
+ transform="translate(656.82134,696.68054)"
+ id="g5650-93-2-6-9-5-7-3-5-9"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-3-7-2-2-9-3-1-4-3"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-4-0-6-0-2-6-9-7-7"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <g
+ transform="translate(400.94834,696.68054)"
+ id="g5650-93-2-6-9-5-7-3-5"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-3-7-2-2-9-3-1-4"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-4-0-6-0-2-6-9-7"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
<path
inkscape:export-ydpi="89.926643"
inkscape:export-xdpi="89.926643"
@@ -110,7 +334,7 @@
d="m -360.31658,371.70113 203.00246,0.045"
style="fill:none;stroke:#6d8e41;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:1.99999999, 3.99999998;stroke-dashoffset:0" />
<g
- transform="translate(416.63925,-305.0045)"
+ transform="translate(674.63925,-305.0045)"
id="g5650-7"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -118,8 +342,8 @@
<path
inkscape:connector-curvature="0"
id="path5570-9"
- d="m -57.78256,351.41962 0,52.3259"
- style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -135,11 +359,11 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-0"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<g
- transform="translate(270.88515,-59.451492)"
+ transform="translate(528.88515,-59.451492)"
id="g5650-0"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -147,8 +371,8 @@
<path
inkscape:connector-curvature="0"
id="path5570-5"
- d="m -57.78256,351.41962 0,52.3259"
- style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -164,11 +388,11 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-1"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<g
- transform="translate(270.88515,22.975441)"
+ transform="translate(528.88515,22.975441)"
id="g5650-94"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -176,8 +400,8 @@
<path
inkscape:connector-curvature="0"
id="path5570-71"
- d="m -57.78256,351.41962 0,52.3259"
- style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -193,11 +417,11 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-5"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<g
- transform="translate(270.88515,105.29639)"
+ transform="translate(528.88515,105.29639)"
id="g5650-93"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -205,8 +429,8 @@
<path
inkscape:connector-curvature="0"
id="path5570-3"
- d="m -57.78256,351.41962 0,52.3259"
- style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -222,11 +446,11 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-4"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<g
- transform="translate(270.88515,187.81342)"
+ transform="translate(240.08356,270.33438)"
id="g5650-3"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -234,8 +458,8 @@
<path
inkscape:connector-curvature="0"
id="path5570-93"
- d="m -57.78256,351.41962 0,52.3259"
- style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -251,11 +475,11 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-04"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<g
- transform="translate(270.88515,270.7128)"
+ transform="translate(240.08356,353.23338)"
id="g5650-6"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -263,8 +487,8 @@
<path
inkscape:connector-curvature="0"
id="path5570-78"
- d="m -57.78256,351.41962 0,52.3259"
- style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -280,11 +504,11 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-9"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<g
- transform="translate(270.88515,-141.93971)"
+ transform="translate(528.88515,-141.93971)"
id="g5650-0-8"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -292,8 +516,8 @@
<path
inkscape:connector-curvature="0"
id="path5570-5-3"
- d="m -57.78256,351.41962 0,52.3259"
- style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -309,65 +533,65 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-1-1"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1-28"
width="210.17955"
height="35.209244"
- x="108.01281"
+ x="366.01282"
y="275.4668"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643" />
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1-5"
width="210.17955"
height="35.209244"
- x="108.01281"
+ x="366.01282"
y="357.98779"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643" />
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1-8"
width="210.17955"
height="35.209244"
- x="108.01281"
+ x="366.01282"
y="440.50873"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643" />
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1-4"
width="210.17955"
height="35.209244"
- x="108.01281"
- y="523.02966"
+ x="81.249367"
+ y="605.55103"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643" />
<g
- transform="matrix(0,-1,1,0,-314.06239,730.23773)"
+ transform="rotate(-90,235.94692,576.81149)"
id="g5650-2-0-4-8"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643">
<path
- style="fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 146.3711,152.21525 c 0,0 -65.760927,60.81119 -8.48528,132.93608"
id="path20172-9-5"
inkscape:connector-curvature="0"
- transform="matrix(0,1,-1,0,248.85545,276.69312)" />
+ transform="rotate(90,-13.918835,262.77429)" />
<path
transform="matrix(0.38224114,0.44664484,-0.44664484,0.38224114,233.48523,355.54168)"
inkscape:transform-center-y="-1.0388082"
@@ -383,29 +607,29 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-12-1-7-2"
- style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star"
inkscape:transform-center-x="4.5299474" />
</g>
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1-87"
width="210.17955"
height="35.209244"
- x="108.01281"
- y="605.5506"
+ x="81.249367"
+ y="688.07202"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643" />
<g
- transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,261.76354,-143.71473)"
+ transform="rotate(-45,86.402746,-699.267)"
id="g5650-2-2-8">
<path
inkscape:connector-curvature="0"
id="path5570-2-1-4"
- d="m -57.78256,343.20394 0,61.59661"
- style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,343.20394 v 61.59661"
+ style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -421,15 +645,15 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-12-5-3"
- style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1"
width="210.17955"
height="35.209244"
- x="253.76691"
+ x="511.76691"
y="112.69559"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -506,7 +730,7 @@
y="0"
xlink:href="#rect5273-22"
id="use5355"
- transform="translate(530.58261,-183.7816)"
+ transform="translate(788.58261,-183.7816)"
width="744.09448"
height="1052.3622"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -537,7 +761,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="213.07524"
+ x="471.07526"
y="379.78381"
id="text5371-2-3"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -545,22 +769,47 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-7"
- x="213.07524"
+ x="471.07526"
y="379.78381"
style="font-size:16px;line-height:1.25;font-family:sans-serif">last_modified</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="212.74321"
- y="546.59912"
+ x="185.63515"
+ y="629.15564"
id="text5371-2-3-0"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-7-3"
- x="212.74321"
- y="546.59912"
+ x="185.63515"
+ y="629.15564"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">ProvideCallback</tspan></text>
+ <rect
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-1-4-4"
+ width="210.17955"
+ height="35.209244"
+ x="238.076"
+ y="1018.396"
+ rx="15"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="342.46179"
+ y="1042.0006"
+ id="text5371-2-3-0-5"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-7-3-0"
+ x="342.46179"
+ y="1042.0006"
style="font-size:16px;line-height:1.25;font-family:sans-serif">ProvideCallback</tspan></text>
<text
xml:space="preserve"
@@ -576,35 +825,35 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
- x="359.14185"
- y="50.482433"
+ x="617.14185"
+ y="50.114025"
id="text5371-4-0"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
- x="359.14185"
- y="50.482433"
+ x="617.14185"
+ y="50.114025"
id="tspan17171"
style="font-size:16px;line-height:1.25;font-family:sans-serif">conneg</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="212.77055"
- y="627.34662"
+ x="186.01915"
+ y="709.83667"
id="text5371-2-9"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-8"
- x="212.77055"
- y="627.34662"
+ x="186.01915"
+ y="709.83667"
style="font-size:16px;line-height:1.25;font-family:sans-serif">multiple_choices</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="358.52466"
+ x="616.52466"
y="134.49161"
id="text5371-2-95"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -612,13 +861,13 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-80"
- x="358.52466"
+ x="616.52466"
y="134.49161"
style="font-size:16px;line-height:1.25;font-family:sans-serif">resource_exists</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="213.38774"
+ x="471.38776"
y="296.80188"
id="text5371-2-32"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -626,13 +875,13 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-27"
- x="213.38774"
+ x="471.38776"
y="296.80188"
style="font-size:16px;line-height:1.25;font-family:sans-serif">generate_etag</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="213.05571"
+ x="471.05573"
y="462.5274"
id="text5371-2-74"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -640,9 +889,362 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-18"
- x="213.05571"
+ x="471.05573"
y="462.5274"
style="font-size:16px;line-height:1.25;font-family:sans-serif">expires</tspan></text>
+ <g
+ transform="translate(528.88515,270.08038)"
+ id="g5650-93-2"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-3-7"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-4-0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <rect
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-1-8-93"
+ width="210.17955"
+ height="35.209244"
+ x="366.013"
+ y="605.5506"
+ rx="15"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="470.63077"
+ y="627.31525"
+ id="text5371-2-74-6"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-18-0"
+ x="470.63077"
+ y="627.31525"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">has range?</tspan></text>
+ <g
+ transform="translate(528.88515,187.69716)"
+ id="g5650-93-2-6"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-3-7-2"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-4-0-6"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <rect
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-1-8-93-1"
+ width="210.17955"
+ height="35.209244"
+ x="366.013"
+ y="523.02966"
+ rx="15"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="470.63077"
+ y="544.79431"
+ id="text5371-2-74-6-8"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-18-0-7"
+ x="470.63077"
+ y="544.79431"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">resource provides ranges?</tspan></text>
+ <g
+ transform="translate(528.88515,353.49259)"
+ id="g5650-93-2-6-9"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-3-7-2-2"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-4-0-6-0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <rect
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-1-8-93-1-2"
+ width="210.17955"
+ height="35.209244"
+ x="366.013"
+ y="687.83093"
+ rx="15"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="470.63077"
+ y="709.63556"
+ id="text5371-2-74-6-8-3"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-18-0-7-7"
+ x="470.63077"
+ y="709.63556"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">has if-range?</tspan></text>
+ <g
+ transform="translate(528.88515,435.58038)"
+ id="g5650-93-2-6-9-5"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-3-7-2-2-9"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-4-0-6-0-2"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <rect
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-1-8-93-1-2-2"
+ width="210.17955"
+ height="35.209244"
+ x="366.013"
+ y="770.83313"
+ rx="15"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="470.63077"
+ y="792.59778"
+ id="text5371-2-74-6-8-3-8"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-18-0-7-7-9"
+ x="470.63077"
+ y="792.59778"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">requested range provided?</tspan></text>
+ <g
+ transform="translate(528.88515,518.28038)"
+ id="g5650-93-2-6-9-5-7"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-3-7-2-2-9-3"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-4-0-6-0-2-6"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <rect
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-1-8-93-1-2-2-1"
+ width="210.17955"
+ height="35.209244"
+ x="366.013"
+ y="853.35419"
+ rx="15"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="470.83078"
+ y="875.15881"
+ id="text5371-2-74-6-8-3-8-2"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-18-0-7-7-9-9"
+ x="470.83078"
+ y="875.15881"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">range_satisfiable</tspan></text>
+ <g
+ transform="rotate(-34.012747,1234.1863,-299.61425)"
+ id="g5650-93-2-6-9-5-7-3"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-3-7-2-2-9-3-1"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-4-0-6-0-2-6-9"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <g
+ transform="rotate(33.477859,-837.91737,1442.2703)"
+ id="g5650-93-2-6-9-5-7-3-8"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5570-3-7-2-2-9-3-1-43"
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
+ inkscape:transform-center-y="2.1823437"
+ d="m -222.73865,430.10821 -12.85982,-22.27386 25.71964,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="2.6179939"
+ sodipodi:arg1="1.5707963"
+ sodipodi:r2="7.4246211"
+ sodipodi:r1="14.849242"
+ sodipodi:cy="415.25897"
+ sodipodi:cx="-222.73865"
+ sodipodi:sides="3"
+ id="path5576-4-0-6-0-2-6-9-1"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:type="star" />
+ </g>
+ <rect
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-1-8-93-1-2-2-1-4"
+ width="210.17955"
+ height="35.209244"
+ x="366.013"
+ y="935.875"
+ rx="15"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="470.94278"
+ y="957.45563"
+ id="text5371-2-74-6-8-3-8-2-7"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-18-0-7-7-9-9-8"
+ x="470.94278"
+ y="957.45563"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">automatic range?</tspan></text>
<rect
style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect5273-1-2"
@@ -654,7 +1256,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="251.83722"
+ x="509.83722"
y="175.92931"
id="text5371-2-391"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -662,22 +1264,120 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-63"
- x="251.83722"
+ x="509.83722"
y="175.92931"
style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="161.54012"
- y="670.38055"
+ x="336.74399"
+ y="1000.7801"
+ id="text5371-2-391-4"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-63-9"
+ x="336.74399"
+ y="1000.7801"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="484.61441"
+ y="669.48737"
+ id="text5371-2-391-4-6"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-63-9-8"
+ x="484.61441"
+ y="669.48737"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="484.61441"
+ y="587.08673"
+ id="text5371-2-391-4-9"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-63-9-2"
+ x="484.61441"
+ y="587.08673"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="397.49249"
+ y="751.30035"
+ id="text5371-2-391-4-66"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-63-9-4"
+ x="397.49249"
+ y="751.30035"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false, or</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="484.61441"
+ y="834.89026"
+ id="text5371-2-391-4-95"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-63-9-0"
+ x="484.61441"
+ y="834.89026"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="484.61441"
+ y="917.41119"
+ id="text5371-2-391-4-4"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-63-9-87"
+ x="484.61441"
+ y="917.41119"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="570.74402"
+ y="1000.7801"
+ id="text5371-2-391-2"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-63-0"
+ x="570.74402"
+ y="1000.7801"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="130.73801"
+ y="752.90198"
id="text5371-2-8"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-3"
- x="161.54012"
- y="670.38055"
+ x="130.73801"
+ y="752.90198"
style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<g
transform="matrix(0,-1,1,0,-513.31414,353.05561)"
@@ -708,7 +1408,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
- x="447.26678"
+ x="705.26678"
y="176.39024"
id="text5371-4-6"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -716,17 +1416,111 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-0"
- x="447.26678"
+ x="705.26678"
y="176.39024"
style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
+ x="334.72018"
+ y="614.93298"
+ id="text5371-4-6-1"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-9-0-5"
+ x="334.72018"
+ y="614.93298"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="312.42276"
+ y="575.93713"
+ id="text5371-4-6-1-0"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-9-0-5-8"
+ x="312.42276"
+ y="575.93713"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif;fill:#6d8e41;fill-opacity:1">false</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
+ x="323.40799"
+ y="900.71991"
+ id="text5371-4-6-1-3"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-9-0-5-6"
+ x="323.40799"
+ y="900.71991"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
+ x="318.40799"
+ y="744.23999"
+ id="text5371-4-6-1-9"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-9-0-5-7"
+ x="318.40799"
+ y="744.23999"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
+ x="372.94284"
+ y="665.52533"
+ id="text5371-4-6-1-7"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ x="372.94284"
+ y="665.52533"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif"
+ id="tspan10">no match</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#9b3b1c;fill-opacity:1;stroke:none"
+ x="218.43921"
+ y="1004.6766"
+ id="text5371-4-6-1-7-3"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ x="218.43921"
+ y="1004.6766"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end"
+ id="tspan10-9">error producing</tspan><tspan
+ sodipodi:role="line"
+ x="218.43921"
+ y="1024.6765"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end"
+ id="tspan11">automatic</tspan><tspan
+ sodipodi:role="line"
+ x="218.43921"
+ y="1044.6765"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end"
+ id="tspan12">ranged response</tspan></text>
<g
- transform="translate(563.72619,-141.76777)"
+ transform="translate(821.72619,-141.76777)"
id="g5650-2-2">
<path
inkscape:connector-curvature="0"
id="path5570-2-1"
- d="m -57.78256,343.20394 0,61.59661"
- style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,343.20394 v 61.59661"
+ style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -742,7 +1536,7 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-12-5"
- style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<rect
@@ -805,21 +1599,21 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
- x="46.409981"
- y="711.18011"
+ x="23.607994"
+ y="793.70099"
id="text5371-4-3-9"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-62-9"
- x="46.409981"
- y="711.18011"
+ x="23.607994"
+ y="793.70099"
style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
- x="545.12921"
+ x="803.12921"
y="257.43518"
id="text5371-4-4-9"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -827,11 +1621,11 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-2-6"
- x="545.12921"
+ x="803.12921"
y="257.43518"
style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
<g
- transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,547.47379,-62.310424)"
+ transform="rotate(45,477.95223,941.13721)"
id="g5650-9-9"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -839,8 +1633,8 @@
<path
inkscape:connector-curvature="0"
id="path5570-7-6"
- d="m -57.78256,351.41962 0,52.3259"
- style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -856,7 +1650,7 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-09-5"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<use
@@ -864,7 +1658,7 @@
y="0"
xlink:href="#rect5273-22"
id="use5355-0"
- transform="translate(384.82851,-20.897068)"
+ transform="translate(642.82851,-20.897068)"
width="744.09448"
height="1052.3622"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -873,24 +1667,24 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
- x="213.38774"
+ x="471.38776"
y="216.5154"
id="text5371-4-0-8"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
- x="213.38774"
+ x="471.38776"
y="216.5154"
id="tspan17171-6"
style="font-size:16px;line-height:1.25;font-family:sans-serif">cond</tspan></text>
<rect
- style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.73499846;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-7-3-1-1"
width="218.52127"
height="34.993004"
- x="103.84195"
- y="770.70062"
+ x="77.078499"
+ y="853.2215"
rx="12.372616"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -898,24 +1692,24 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
- x="212.88774"
- y="792.61121"
+ x="186.33914"
+ y="874.87799"
id="text5371-43-5"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-3-62"
- x="212.88774"
- y="792.61121"
+ x="186.33914"
+ y="874.87799"
style="font-size:16px;line-height:1.25;font-family:sans-serif">300 multiple choices</tspan></text>
<rect
- style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.73499846;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-7-3-1-8"
width="218.52127"
height="34.993004"
- x="103.84195"
- y="688.17969"
+ x="77.078499"
+ y="770.7005"
rx="12.372616"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -923,29 +1717,137 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
- x="212.35258"
- y="711.50043"
+ x="185.95512"
+ y="793.91699"
id="text5371-43-3"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-3-1"
- x="212.35258"
- y="711.50043"
+ x="185.95512"
+ y="793.91699"
style="font-size:16px;line-height:1.25;font-family:sans-serif">200 OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="360.77811"
+ y="1077.916"
+ id="text5371-2-8-2"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-3-0"
+ x="360.77811"
+ y="1077.916"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">automatic</tspan><tspan
+ sodipodi:role="line"
+ x="360.77811"
+ y="1097.916"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif"
+ id="tspan4">ranged response</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:16px;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="484.05441"
+ y="751.09668"
+ id="text5371-2-8-2-4"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ x="484.05441"
+ y="751.09668"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif"
+ id="tspan6">strong etag match</tspan></text>
+ <rect
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-7-3-1-8-6"
+ width="218.52127"
+ height="34.993004"
+ x="233.9435"
+ y="1114.3829"
+ rx="12.372616"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
+ x="342.99612"
+ y="1137.7036"
+ id="text5371-43-3-1"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-3-1-5"
+ x="342.99612"
+ y="1137.7036"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">206 partial content</tspan></text>
+ <rect
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-1-4-4-6"
+ width="210.17955"
+ height="35.209244"
+ x="493.94901"
+ y="1018.396"
+ rx="15"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
+ x="598.33478"
+ y="1040.1606"
+ id="text5371-2-3-0-5-5"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-6-7-3-0-6"
+ x="598.33478"
+ y="1040.1606"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">RangeCallback</tspan></text>
+ <rect
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-7-3-1-8-6-4"
+ width="218.52127"
+ height="34.993004"
+ x="489.77835"
+ y="1114.1394"
+ rx="12.372616"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
+ x="598.83099"
+ y="1137.4601"
+ id="text5371-43-3-1-7"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ id="tspan5373-3-1-5-4"
+ x="598.83099"
+ y="1137.4601"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">206 partial content</tspan></text>
<g
- transform="matrix(0,-1,-1,0,1028.2004,317.70407)"
+ transform="matrix(0,-1,-1,0,1286.2004,317.70407)"
id="g5650-2-0-4-3-8"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643">
<path
- style="fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 146.3711,152.21525 c 0,0 -65.760927,60.81119 -8.48528,132.93608"
id="path20172-9-8-9"
inkscape:connector-curvature="0"
- transform="matrix(0,1,-1,0,248.85545,276.69312)" />
+ transform="rotate(90,-13.918835,262.77429)" />
<path
transform="matrix(0.38224114,0.44664484,-0.44664484,0.38224114,233.48523,355.54168)"
inkscape:transform-center-y="-1.0388082"
@@ -961,16 +1863,16 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-12-1-7-58-6"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star"
inkscape:transform-center-x="4.5299474" />
</g>
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1-28-4"
width="210.17955"
height="35.209244"
- x="400.85385"
+ x="658.85388"
y="192.94594"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -979,7 +1881,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="505.77957"
+ x="763.77954"
y="216.51541"
id="text5371-2-32-6"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -987,13 +1889,13 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-27-8"
- x="505.77957"
+ x="763.77954"
y="216.51541"
style="font-size:16px;line-height:1.25;font-family:sans-serif">has if-match?</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="651.74426"
+ x="875.74426"
y="299.27689"
id="text5371-2-391-5"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1001,11 +1903,11 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-63-7"
- x="651.74426"
+ x="875.74426"
y="299.27689"
style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<g
- transform="translate(563.72619,22.800669)"
+ transform="translate(821.72619,22.800669)"
id="g5650-0-6"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
@@ -1013,8 +1915,8 @@
<path
inkscape:connector-curvature="0"
id="path5570-5-7"
- d="m -57.78256,351.41962 0,52.3259"
- style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,351.41962 v 52.3259"
+ style="opacity:0.8;fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -1030,21 +1932,21 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-1-3"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<g
- transform="matrix(0,-1,-1,0,1027.6701,482.30508)"
+ transform="matrix(0,-1,-1,0,1285.6701,482.30508)"
id="g5650-2-0-4-3"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643">
<path
- style="fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 146.3711,152.21525 c 0,0 -65.760927,60.81119 -8.48528,132.93608"
id="path20172-9-8"
inkscape:connector-curvature="0"
- transform="matrix(0,1,-1,0,248.85545,276.69312)" />
+ transform="rotate(90,-13.918835,262.77429)" />
<path
transform="matrix(0.38224114,0.44664484,-0.44664484,0.38224114,233.48523,355.54168)"
inkscape:transform-center-y="-1.0388082"
@@ -1060,16 +1962,16 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-12-1-7-58"
- style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star"
inkscape:transform-center-x="4.5299474" />
</g>
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1-28-7"
width="210.17955"
height="35.209244"
- x="400.85385"
+ x="658.85388"
y="357.98779"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1078,7 +1980,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="505.94363"
+ x="763.9436"
y="379.78381"
id="text5371-2-32-8"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1086,15 +1988,15 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-27-1"
- x="505.94363"
+ x="763.9436"
y="379.78381"
style="font-size:16px;line-height:1.25;font-family:sans-serif">previously_existed</tspan></text>
<rect
- style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.73499846;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-7-3-1-5"
width="218.52127"
height="34.993004"
- x="396.68301"
+ x="654.68298"
y="440.37622"
rx="12.372616"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1103,7 +2005,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
- x="506.2796"
+ x="764.2796"
y="463.83755"
id="text5371-43-2"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1111,13 +2013,13 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-3-9"
- x="506.2796"
+ x="764.2796"
y="463.83755"
style="font-size:16px;line-height:1.25;font-family:sans-serif">404 not found</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="528.75421"
+ x="786.75421"
y="422.69736"
id="text5371-2-8-9"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1125,17 +2027,17 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-3-4"
- x="528.75421"
+ x="786.75421"
y="422.69736"
style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<g
- transform="translate(563.72619,187.85116)"
+ transform="translate(821.72619,187.85116)"
id="g5650-2-2-17">
<path
inkscape:connector-curvature="0"
id="path5570-2-1-0"
- d="m -57.78256,343.20394 0,61.59661"
- style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,343.20394 v 61.59661"
+ style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -1151,21 +2053,21 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-12-5-45"
- style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<g
- transform="matrix(0,-1,-1,0,1027.4933,646.81763)"
+ transform="matrix(0,-1,-1,0,1285.4933,646.81763)"
id="g5650-2-0-4-3-8-0-3"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643">
<path
- style="fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 146.3711,152.21525 c 0,0 -65.760927,60.81119 -8.48528,132.93608"
id="path20172-9-8-9-31-8"
inkscape:connector-curvature="0"
- transform="matrix(0,1,-1,0,248.85545,276.69312)" />
+ transform="rotate(90,-13.918835,262.77429)" />
<path
transform="matrix(0.38224114,0.44664484,-0.44664484,0.38224114,233.48523,355.54168)"
inkscape:transform-center-y="-1.0388082"
@@ -1181,16 +2083,16 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-12-1-7-58-6-3-6"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star"
inkscape:transform-center-x="4.5299474" />
</g>
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1-8-9"
width="210.17955"
height="35.209244"
- x="400.85385"
+ x="658.85388"
y="523.02966"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1199,7 +2101,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="505.45535"
+ x="763.45532"
y="544.82568"
id="text5371-2-74-0"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1207,7 +2109,7 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-18-2"
- x="505.45535"
+ x="763.45532"
y="544.82568"
style="font-size:16px;line-height:1.25;font-family:sans-serif">moved_permanently</tspan></text>
<g
@@ -1242,11 +2144,11 @@
inkscape:transform-center-x="4.5299474" />
</g>
<rect
- style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.73499846;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-7-3-1"
width="218.52127"
height="34.993004"
- x="396.68301"
+ x="654.68298"
y="275.81555"
rx="12.372616"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1255,7 +2157,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
- x="506.2796"
+ x="764.2796"
y="297.7261"
id="text5371-43"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1263,13 +2165,13 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-3"
- x="506.2796"
+ x="764.2796"
y="297.7261"
style="font-size:16px;line-height:1.25;font-family:sans-serif">412 precondition failed</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
- x="668.11926"
+ x="892.11926"
y="463.37662"
id="text5371-4-3-9-8"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1277,13 +2179,13 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-62-9-9"
- x="668.11926"
+ x="892.11926"
y="463.37662"
style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
- x="549.12921"
+ x="807.12921"
y="587.59863"
id="text5371-4-4-9-3"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1291,13 +2193,13 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-2-6-2"
- x="549.12921"
+ x="807.12921"
y="587.59863"
style="font-size:16px;line-height:1.25;font-family:sans-serif">true*</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="651.74426"
+ x="875.74426"
y="628.87946"
id="text5371-2-391-5-5-1"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1305,15 +2207,15 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-63-7-9-9"
- x="651.74426"
+ x="875.74426"
y="628.87946"
style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<rect
- style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.73499846;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-7-3-1-5-9"
width="218.52127"
height="34.993004"
- x="396.68301"
+ x="654.68298"
y="605.41809"
rx="12.372616"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1322,7 +2224,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
- x="505.57257"
+ x="763.57257"
y="627.32867"
id="text5371-43-2-9"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1330,17 +2232,17 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-3-9-7"
- x="505.57257"
+ x="763.57257"
y="627.32867"
style="font-size:16px;line-height:1.25;font-family:sans-serif">301 moved permanently</tspan></text>
<g
- transform="translate(563.72619,353.12604)"
+ transform="translate(821.72619,353.12604)"
id="g5650-2-2-65">
<path
inkscape:connector-curvature="0"
id="path5570-2-1-5"
- d="m -57.78256,343.20394 0,61.59661"
- style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ d="m -57.78256,343.20394 v 61.59661"
+ style="opacity:0.8;fill:none;stroke:#9b3b1c;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
transform="matrix(0.58787746,0,0,0.58787746,73.160466,163.35774)"
inkscape:transform-center-y="2.1823437"
@@ -1356,21 +2258,21 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-12-5-5"
- style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star" />
</g>
<g
- transform="matrix(0,-1,-1,0,1032.2004,811.50699)"
+ transform="matrix(0,-1,-1,0,1290.2004,811.50699)"
id="g5650-2-0-4-3-8-0-3-7"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
inkscape:export-xdpi="89.926643"
inkscape:export-ydpi="89.926643">
<path
- style="fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ style="fill:none;stroke:#6d8e41;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 146.3711,152.21525 c 0,0 -65.760927,60.81119 -8.48528,132.93608"
id="path20172-9-8-9-31-8-1"
inkscape:connector-curvature="0"
- transform="matrix(0,1,-1,0,248.85545,276.69312)" />
+ transform="rotate(90,-13.918835,262.77429)" />
<path
transform="matrix(0.38224114,0.44664484,-0.44664484,0.38224114,233.48523,355.54168)"
inkscape:transform-center-y="-1.0388082"
@@ -1386,16 +2288,16 @@
sodipodi:cx="-222.73865"
sodipodi:sides="3"
id="path5576-12-1-7-58-6-3-6-3"
- style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="opacity:0.8;fill:#6d8e41;fill-opacity:1;fill-rule:nonzero;stroke:#6d8e41;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
sodipodi:type="star"
inkscape:transform-center-x="4.5299474" />
</g>
<rect
- style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#d1f2a5;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-1-8-9-1"
width="210.17955"
height="35.209244"
- x="400.85385"
+ x="658.85388"
y="687.83093"
rx="15"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1404,7 +2306,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="505.45535"
+ x="763.45532"
y="709.62695"
id="text5371-2-74-0-7"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1412,13 +2314,13 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-18-2-8"
- x="505.45535"
+ x="763.45532"
y="709.62695"
style="font-size:16px;line-height:1.25;font-family:sans-serif">moved_temporarily</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
- x="549.12921"
+ x="807.12921"
y="752.64056"
id="text5371-4-4-9-3-2"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1426,13 +2328,13 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-9-2-6-2-6"
- x="549.12921"
+ x="807.12921"
y="752.64056"
style="font-size:16px;line-height:1.25;font-family:sans-serif">true*</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
- x="651.74426"
+ x="875.74426"
y="794.16199"
id="text5371-2-391-5-5-1-0"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1440,15 +2342,15 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-6-63-7-9-9-2"
- x="651.74426"
+ x="875.74426"
y="794.16199"
style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<rect
- style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.73499846;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-7-3-1-5-9-2"
width="218.52127"
height="34.993004"
- x="396.68301"
+ x="654.68298"
y="770.70062"
rx="12.372616"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1457,7 +2359,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
- x="505.57257"
+ x="763.57257"
y="792.61121"
id="text5371-43-2-9-7"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1465,15 +2367,15 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-3-9-7-8"
- x="505.57257"
+ x="763.57257"
y="792.61121"
style="font-size:16px;line-height:1.25;font-family:sans-serif">307 moved temporarily</tspan></text>
<rect
- style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.73499846;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-7-3-1-5-9-2-4"
width="218.52127"
height="34.993004"
- x="396.68301"
+ x="654.68298"
y="853.22168"
rx="12.372616"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1482,7 +2384,7 @@
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
- x="505.97882"
+ x="763.97882"
y="874.99164"
id="text5371-43-2-9-7-3"
inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
@@ -1490,7 +2392,7 @@
inkscape:export-ydpi="89.926643"><tspan
sodipodi:role="line"
id="tspan5373-3-9-7-8-7"
- x="505.97882"
+ x="763.97882"
y="874.99164"
style="font-size:16px;line-height:1.25;font-family:sans-serif">410 gone</tspan></text>
<g
@@ -1519,5 +2421,30 @@
style="opacity:0.8;fill:#9b3b1c;fill-opacity:1;fill-rule:nonzero;stroke:#9b3b1c;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
sodipodi:type="star" />
</g>
+ <rect
+ style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:2.735;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5273-7-3-1-8-6-4-8"
+ width="218.52127"
+ height="34.993004"
+ x="77.078499"
+ y="935.98315"
+ rx="12.372616"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
+ x="186.57913"
+ y="959.51965"
+ id="text5371-43-3-1-7-6"
+ inkscape:export-filename="/home/essen/ninenines/cowboy/guide/rest_options.png"
+ inkscape:export-xdpi="89.926643"
+ inkscape:export-ydpi="89.926643"><tspan
+ sodipodi:role="line"
+ x="186.57913"
+ y="959.51965"
+ style="font-size:16px;line-height:1.25;font-family:sans-serif"
+ id="tspan8">416 not satisfiable</tspan></text>
</g>
</svg>
diff --git a/doc/src/guide/rest_handlers.asciidoc b/doc/src/guide/rest_handlers.asciidoc
index baf8e6a..19a9859 100644
--- a/doc/src/guide/rest_handlers.asciidoc
+++ b/doc/src/guide/rest_handlers.asciidoc
@@ -84,6 +84,8 @@ if it is undefined, moving directly to the next step. Similarly,
| multiple_choices | `false`
| options | `ok`
| previously_existed | `false`
+| ranges_provided | skip
+| range_satisfiable | `true`
| rate_limited | `false`
| resource_exists | `true`
| service_available | `true`
@@ -97,8 +99,9 @@ As you can see, Cowboy tries to move on with the request whenever
possible by using well thought out default values.
In addition to these, there can be any number of user-defined
-callbacks that are specified through `content_types_accepted/2`
-and `content_types_provided/2`. They can take any name, however
+callbacks that are specified through `content_types_accepted/2`,
+`content_types_provided/2` or `ranges_provided/2`. They can take
+any name (except `auto` for range callbacks), however
it is recommended to use a separate prefix for the callbacks of
each function. For example, `from_html` and `to_html` indicate
in the first case that we're accepting a resource given as HTML,
@@ -113,9 +116,10 @@ Req object directly. The values are defined in the following table:
[cols="<,<",options="header"]
|===
| Key | Details
-| media_type | The content-type negotiated for the response entity.
-| language | The language negotiated for the response entity.
-| charset | The charset negotiated for the response entity.
+| media_type | The content-type negotiated for the response entity
+| language | The language negotiated for the response entity
+| charset | The charset negotiated for the response entity
+| range | The range selected for the ranged response
|===
They can be used to send a proper body with the response to a
@@ -129,11 +133,16 @@ of the REST code. They are listed in the following table.
[cols="<,<",options="header"]
|===
| Header name | Details
+| accept-ranges | Range units accepted by the resource
+| allow | HTTP methods allowed by the resource
| content-language | Language used in the response body
+| content-range | Range of the content found in the response
| content-type | Media type and charset of the response body
| etag | Etag of the resource
| expires | Expiration date of the resource
| last-modified | Last modification date for the resource
| location | Relative or absolute URI to the requested resource
+| retry-after | Delay or time the client should wait before accessing the resource
| vary | List of headers that may change the representation of the resource
+| www-authenticate | Authentication information to access the resource
|===
diff --git a/doc/src/guide/rest_start.png b/doc/src/guide/rest_start.png
index 4c230a0..bbaa655 100644
--- a/doc/src/guide/rest_start.png
+++ b/doc/src/guide/rest_start.png
Binary files differ
diff --git a/doc/src/guide/rest_start.svg b/doc/src/guide/rest_start.svg
index 6f1dd87..9a2646f 100644
--- a/doc/src/guide/rest_start.svg
+++ b/doc/src/guide/rest_start.svg
@@ -2,24 +2,23 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
- xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.09448819"
height="1052.3622047"
id="svg2"
version="1.1"
- inkscape:version="0.92.2 2405546, 2018-03-11"
+ inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
sodipodi:docname="rest_start.svg"
inkscape:export-filename="/home/essen/Dropbox/Public/drawing.png"
inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
+ inkscape:export-ydpi="90"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4">
<linearGradient
@@ -50,7 +49,7 @@
</linearGradient>
<linearGradient
id="linearGradient5233"
- osb:paint="solid">
+ inkscape:swatch="solid">
<stop
style="stop-color:#69d2e7;stop-opacity:1;"
offset="0"
@@ -65,25 +64,34 @@
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1.0000001"
- inkscape:cx="213.11305"
- inkscape:cy="726.77495"
+ inkscape:cx="293.49997"
+ inkscape:cy="315.49997"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
- inkscape:window-width="1920"
- inkscape:window-height="1043"
+ inkscape:window-width="1440"
+ inkscape:window-height="900"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-global="true"
- showguides="true">
+ showguides="true"
+ inkscape:showpageshadow="2"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:export-bgcolor="#ffffffff">
<inkscape:grid
type="xygrid"
id="grid5357"
empspacing="5"
- visible="true"
+ visible="false"
enabled="true"
- snapvisiblegridlinesonly="true" />
+ snapvisiblegridlinesonly="true"
+ originx="0"
+ originy="0"
+ spacingy="1"
+ spacingx="1"
+ units="px" />
</sodipodi:namedview>
<metadata
id="metadata7">
@@ -113,7 +121,8 @@
transform="translate(205.92143,-296.03137)"
id="g5650-7"
inkscape:export-xdpi="90"
- inkscape:export-ydpi="90">
+ inkscape:export-ydpi="90"
+ inkscape:export-filename="rest_start.png">
<path
inkscape:connector-curvature="0"
id="path5570-9"
@@ -921,7 +930,7 @@
id="tspan5373-6-5"
x="148.29512"
y="728.47717"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">valid_content_headers</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">rate_limited</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
@@ -934,7 +943,7 @@
id="tspan5373-6-1"
x="147.83809"
y="812.14441"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">valid_entity_length</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">valid_content_headers</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
@@ -1098,7 +1107,7 @@
id="tspan5373-6-33"
x="164.26562"
y="771.62329"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:start;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#6d8e41;fill-opacity:1;stroke:none"
@@ -1241,7 +1250,7 @@
id="tspan5373-9-5"
x="315.26172"
y="707.97595"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true*</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
@@ -1448,7 +1457,7 @@
id="tspan5373-58"
x="524.26172"
y="729.9563"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">501 not implemented</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">429 too many requests</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#77823c;fill-opacity:1;stroke:none"
@@ -1461,7 +1470,7 @@
id="tspan5373-60"
x="524.26172"
y="813.64819"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">413 request entity too large</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">501 not implemented</tspan></text>
<rect
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#a9ca7d;stroke-width:2.44279909;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect5367"
@@ -1576,7 +1585,7 @@
id="tspan5373-6-1-1"
x="147.8381"
y="895.81165"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">rate_limited</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">valid_entity_length</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#6d8e41;fill-opacity:1;stroke:none"
@@ -1615,7 +1624,7 @@
id="tspan5373-6-9-6"
x="164.26562"
y="938.95776"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">true</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;-inkscape-font-specification:Sans;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#9b3b1c;fill-opacity:1;stroke:none"
@@ -1628,7 +1637,7 @@
id="tspan5373-9-012-6"
x="315.26172"
y="875.08826"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">true*</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">false</tspan></text>
<rect
style="fill:#effab4;fill-opacity:1;fill-rule:nonzero;stroke:#c7d28c;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect5273-7-3-5-2"
@@ -1651,6 +1660,6 @@
id="tspan5373-60-1"
x="524.26172"
y="897.31543"
- style="font-size:16px;line-height:1.25;font-family:sans-serif">429 too many requests</tspan></text>
+ style="font-size:16px;line-height:1.25;font-family:sans-serif">413 request entity too large</tspan></text>
</g>
</svg>
diff --git a/doc/src/guide/streams.asciidoc b/doc/src/guide/streams.asciidoc
index 0ac84ce..e8ddae0 100644
--- a/doc/src/guide/streams.asciidoc
+++ b/doc/src/guide/streams.asciidoc
@@ -65,6 +65,11 @@ automatically compress responses when possible. It is not
enabled by default. It is a good example for writing your
own handlers that will modify responses.
+link:man:cowboy_decompress_h(3)[cowboy_decompress_h] will
+automatically decompress request bodies when possible.
+It is not enabled by default. It is a good example for
+writing your own handlers that will modify requests.
+
link:man:cowboy_metrics_h(3)[cowboy_metrics_h] gathers
metrics about a stream then passes them to a configurable
function. It is not enabled by default.
diff --git a/doc/src/guide/ws_handlers.asciidoc b/doc/src/guide/ws_handlers.asciidoc
index 5cfdcb1..7005665 100644
--- a/doc/src/guide/ws_handlers.asciidoc
+++ b/doc/src/guide/ws_handlers.asciidoc
@@ -62,7 +62,7 @@ init(Req0, State) ->
undefined ->
{cowboy_websocket, Req0, State};
Subprotocols ->
- case lists:keymember(<<"mqtt">>, 1, Subprotocols) of
+ case lists:member(<<"mqtt">>, 1, Subprotocols) of
true ->
Req = cowboy_req:set_resp_header(<<"sec-websocket-protocol">>,
<<"mqtt">>, Req0),
diff --git a/doc/src/manual/cowboy.asciidoc b/doc/src/manual/cowboy.asciidoc
index c213df0..9298b6d 100644
--- a/doc/src/manual/cowboy.asciidoc
+++ b/doc/src/manual/cowboy.asciidoc
@@ -14,6 +14,7 @@ manipulating Ranch listeners.
* link:man:cowboy:start_clear(3)[cowboy:start_clear(3)] - Listen for connections using plain TCP
* link:man:cowboy:start_tls(3)[cowboy:start_tls(3)] - Listen for connections using TLS
* link:man:cowboy:stop_listener(3)[cowboy:stop_listener(3)] - Stop the given listener
+* link:man:cowboy:get_env(3)[cowboy:get_env(3)] - Retrieve a listener's environment value
* link:man:cowboy:set_env(3)[cowboy:set_env(3)] - Update a listener's environment value
== Types
diff --git a/doc/src/manual/cowboy.get_env.asciidoc b/doc/src/manual/cowboy.get_env.asciidoc
new file mode 100644
index 0000000..c2895b0
--- /dev/null
+++ b/doc/src/manual/cowboy.get_env.asciidoc
@@ -0,0 +1,78 @@
+= cowboy:get_env(3)
+
+== Name
+
+cowboy:get_env - Retrieve a listener's environment value
+
+== Description
+
+[source,erlang]
+----
+get_env(Name :: ranch:ref(),
+ Key :: atom())
+ -> any()
+
+get_env(Name :: ranch:ref(),
+ Key :: atom(),
+ Default :: any())
+ -> any()
+----
+
+Retrieve an environment value for a previously started
+listener.
+
+This function may crash when the key is missing from the
+environment and a default value is not provided.
+
+== Arguments
+
+Name::
+
+The name of the listener to access.
++
+The name of the listener is the first argument given to the
+link:man:cowboy:start_clear(3)[cowboy:start_clear(3)],
+link:man:cowboy:start_tls(3)[cowboy:start_tls(3)] or
+link:man:ranch:start_listener(3)[ranch:start_listener(3)] function.
+
+Key::
+
+The key in the environment map. Common keys include `dispatch`
+and `middlewares`.
+
+Default::
+
+The default value if the key is missing.
+
+== Return value
+
+The environment value is returned on success.
+
+If a default was provided and the key is missing, then the
+default value is returned.
+
+An `exit:badarg` exception is thrown when the listener does
+not exist.
+
+An `exit:{badkey, Key}` exception is thrown when the key
+requested is missing and no default was provided.
+
+== Changelog
+
+* *2.11*: Function introduced.
+
+== Examples
+
+.Retrieve a listener's routes
+[source,erlang]
+----
+Dispatch = cowboy:get_env(example, dispatch).
+----
+
+== See also
+
+link:man:cowboy(3)[cowboy(3)],
+link:man:cowboy:start_clear(3)[cowboy:start_clear(3)],
+link:man:cowboy:start_tls(3)[cowboy:start_tls(3)],
+link:man:cowboy:set_env(3)[cowboy:set_env(3)],
+link:man:ranch:get_protocol_options(3)[ranch:get_protocol_options(3)]
diff --git a/doc/src/manual/cowboy.set_env.asciidoc b/doc/src/manual/cowboy.set_env.asciidoc
index 30af485..fc0d1f7 100644
--- a/doc/src/manual/cowboy.set_env.asciidoc
+++ b/doc/src/manual/cowboy.set_env.asciidoc
@@ -76,4 +76,5 @@ cowboy:set_env(example, dispatch, Dispatch).
link:man:cowboy(3)[cowboy(3)],
link:man:cowboy:start_clear(3)[cowboy:start_clear(3)],
link:man:cowboy:start_tls(3)[cowboy:start_tls(3)],
+link:man:cowboy:get_env(3)[cowboy:get_env(3)],
link:man:ranch:set_protocol_options(3)[ranch:set_protocol_options(3)]
diff --git a/doc/src/manual/cowboy_app.asciidoc b/doc/src/manual/cowboy_app.asciidoc
index 8db84b1..fd833be 100644
--- a/doc/src/manual/cowboy_app.asciidoc
+++ b/doc/src/manual/cowboy_app.asciidoc
@@ -36,6 +36,7 @@ Stream handlers:
* link:man:cowboy_stream_h(3)[cowboy_stream_h(3)] - Default stream handler
* link:man:cowboy_compress_h(3)[cowboy_compress_h(3)] - Compress stream handler
+* link:man:cowboy_decompress_h(3)[cowboy_decompress_h(3)] - Decompress stream handler
* link:man:cowboy_metrics_h(3)[cowboy_metrics_h(3)] - Metrics stream handler
* link:man:cowboy_tracer_h(3)[cowboy_tracer_h(3)] - Tracer stream handler
diff --git a/doc/src/manual/cowboy_compress_h.asciidoc b/doc/src/manual/cowboy_compress_h.asciidoc
index 31a9162..6551567 100644
--- a/doc/src/manual/cowboy_compress_h.asciidoc
+++ b/doc/src/manual/cowboy_compress_h.asciidoc
@@ -9,7 +9,7 @@ cowboy_compress_h - Compress stream handler
The module `cowboy_compress_h` compresses response bodies
automatically when the client supports it. It will not
try to compress responses that already have a content
-encoding.
+encoding or that have an etag header defined.
Normal responses will only be compressed when their
size is lower than the configured threshold. Streamed
@@ -55,6 +55,10 @@ The compress stream handler does not produce any event.
== Changelog
+* *2.11*: Compression is now disabled when the etag
+ header is in the response headers.
+* *2.11*: The vary: accept-encoding header is now
+ always set when this handler is enabled.
* *2.6*: The options `compress_buffering` and
`compress_threshold` were added.
* *2.0*: Module introduced.
@@ -63,6 +67,7 @@ The compress stream handler does not produce any event.
link:man:cowboy(7)[cowboy(7)],
link:man:cowboy_stream(3)[cowboy_stream(3)],
+link:man:cowboy_decompress_h(3)[cowboy_decompress_h(3)],
link:man:cowboy_metrics_h(3)[cowboy_metrics_h(3)],
link:man:cowboy_stream_h(3)[cowboy_stream_h(3)],
link:man:cowboy_tracer_h(3)[cowboy_tracer_h(3)]
diff --git a/doc/src/manual/cowboy_decompress_h.asciidoc b/doc/src/manual/cowboy_decompress_h.asciidoc
new file mode 100644
index 0000000..8598ae4
--- /dev/null
+++ b/doc/src/manual/cowboy_decompress_h.asciidoc
@@ -0,0 +1,70 @@
+= cowboy_decompress_h(3)
+
+== Name
+
+cowboy_decompress_h - Decompress stream handler
+
+== Description
+
+The module `cowboy_decompress_h` decompresses request bodies
+automatically when the server supports it.
+
+The only compression algorithm currently supported is the
+gzip algorithm. Another limitation is that decompression
+is only attempted when gzip is the only content-encoding
+in the request.
+
+This stream handler always adds a field to the Req object
+with the name `content_decoded` which is treated as a
+list of decoded content-encoding values. Currently this
+list may only contain the `<<"gzip">>` binary if content
+was decoded; or be empty otherwise.
+
+== Options
+
+[source,erlang]
+----
+opts() :: #{
+ decompress_enabled => boolean(),
+ decompress_ratio_limit => non_neg_integer()
+}
+----
+
+Configuration for the decompress stream handler.
+
+The default value is given next to the option name:
+
+decompress_ratio_limit (20)::
+The max ratio of the compressed and decompressed body
+before it is rejected with a `413 Payload Too Large`
+error response.
++
+This option can be updated at any time using the
+`set_options` stream handler command.
+
+decompress_enabled (true)::
+
+Whether the handler is enabled by default.
++
+This option can be updated using the `set_options`
+stream handler command. This allows disabling
+decompression for the current stream. Attempts
+to enable or disable decompression after starting
+to read the body will be ignored.
+
+== Events
+
+The decompress stream handler does not produce any event.
+
+== Changelog
+
+* *2.11*: Module introduced.
+
+== See also
+
+link:man:cowboy(7)[cowboy(7)],
+link:man:cowboy_stream(3)[cowboy_stream(3)],
+link:man:cowboy_compress_h(3)[cowboy_compress_h(3)],
+link:man:cowboy_metrics_h(3)[cowboy_metrics_h(3)],
+link:man:cowboy_stream_h(3)[cowboy_stream_h(3)],
+link:man:cowboy_tracer_h(3)[cowboy_tracer_h(3)]
diff --git a/doc/src/manual/cowboy_http.asciidoc b/doc/src/manual/cowboy_http.asciidoc
index 33d2888..58f0435 100644
--- a/doc/src/manual/cowboy_http.asciidoc
+++ b/doc/src/manual/cowboy_http.asciidoc
@@ -17,27 +17,28 @@ as a Ranch protocol.
[source,erlang]
----
opts() :: #{
- active_n => pos_integer(),
- chunked => boolean(),
- connection_type => worker | supervisor,
- http10_keepalive => boolean(),
- idle_timeout => timeout(),
- inactivity_timeout => timeout(),
- initial_stream_flow_size => non_neg_integer(),
- linger_timeout => timeout(),
- logger => module(),
- max_empty_lines => non_neg_integer(),
- max_header_name_length => non_neg_integer(),
- max_header_value_length => non_neg_integer(),
- max_headers => non_neg_integer(),
- max_keepalive => non_neg_integer(),
- max_method_length => non_neg_integer(),
- max_request_line_length => non_neg_integer(),
- max_skip_body_length => non_neg_integer(),
- proxy_header => boolean(),
- request_timeout => timeout(),
- sendfile => boolean(),
- stream_handlers => [module()]
+ active_n => pos_integer(),
+ chunked => boolean(),
+ connection_type => worker | supervisor,
+ http10_keepalive => boolean(),
+ idle_timeout => timeout(),
+ inactivity_timeout => timeout(),
+ initial_stream_flow_size => non_neg_integer(),
+ linger_timeout => timeout(),
+ logger => module(),
+ max_empty_lines => non_neg_integer(),
+ max_header_name_length => non_neg_integer(),
+ max_header_value_length => non_neg_integer(),
+ max_headers => non_neg_integer(),
+ max_keepalive => non_neg_integer(),
+ max_method_length => non_neg_integer(),
+ max_request_line_length => non_neg_integer(),
+ max_skip_body_length => non_neg_integer(),
+ proxy_header => boolean(),
+ request_timeout => timeout(),
+ reset_idle_timeout_on_send => boolean(),
+ sendfile => boolean(),
+ stream_handlers => [module()]
}
----
@@ -148,6 +149,11 @@ request_timeout (5000)::
Time in ms with no requests before Cowboy closes the connection.
+reset_idle_timeout_on_send (false)::
+
+Whether the `idle_timeout` gets reset when sending data
+to the socket.
+
sendfile (true)::
Whether the sendfile syscall may be used. It can be useful to disable
@@ -160,6 +166,7 @@ Ordered list of stream handlers that will handle all stream events.
== Changelog
+* *2.11*: The `reset_idle_timeout_on_send` option was added.
* *2.8*: The `active_n` option was added.
* *2.7*: The `initial_stream_flow_size` and `logger` options were added.
* *2.6*: The `chunked`, `http10_keepalive`, `proxy_header` and `sendfile` options were added.
diff --git a/doc/src/manual/cowboy_http2.asciidoc b/doc/src/manual/cowboy_http2.asciidoc
index 9be1de8..1d2619c 100644
--- a/doc/src/manual/cowboy_http2.asciidoc
+++ b/doc/src/manual/cowboy_http2.asciidoc
@@ -35,14 +35,17 @@ opts() :: #{
max_connection_window_size => 0..16#7fffffff,
max_decode_table_size => non_neg_integer(),
max_encode_table_size => non_neg_integer(),
+ max_fragmented_header_block_size => 16384..16#7fffffff,
max_frame_size_received => 16384..16777215,
max_frame_size_sent => 16384..16777215 | infinity,
max_received_frame_rate => {pos_integer(), timeout()},
max_reset_stream_rate => {pos_integer(), timeout()},
+ max_cancel_stream_rate => {pos_integer(), timeout()},
max_stream_buffer_size => non_neg_integer(),
max_stream_window_size => 0..16#7fffffff,
preface_timeout => timeout(),
proxy_header => boolean(),
+ reset_idle_timeout_on_send => boolean(),
sendfile => boolean(),
settings_timeout => timeout(),
stream_handlers => [module()],
@@ -92,7 +95,10 @@ enable_connect_protocol (false)::
Whether to enable the extended CONNECT method to allow
protocols like Websocket to be used over an HTTP/2 stream.
-This option is experimental and disabled by default.
++
+For backward compatibility reasons, this option is disabled
+by default. It must be enabled to use Websocket over HTTP/2.
+It will be enabled by default in a future release.
goaway_initial_timeout (1000)::
@@ -167,11 +173,25 @@ Maximum header table size in bytes used by the encoder. The server will
compare this value to what the client advertises and choose the smallest
one as the encoder's header table size.
+max_fragmented_header_block_size (32768)::
+
+Maximum header block size when headers are split over multiple HEADERS
+and CONTINUATION frames. Clients that attempt to send header blocks
+larger than this value will receive an ENHANCE_YOUR_CALM connection
+error. Note that this value is not advertised and should be large
+enough for legitimate requests.
+
max_frame_size_received (16384)::
Maximum size in bytes of the frames received by the server. This value is
advertised to the remote endpoint which can then decide to use
any value lower or equal for its frame sizes.
++
+It is highly recommended to increase this value for performance reasons.
+In a future Cowboy version the default will be increased to 1MB (1048576).
+Too low values may result in very large file uploads failing because
+Cowboy will detect the large number of frames as flood and close the
+connection.
max_frame_size_sent (infinity)::
@@ -198,6 +218,14 @@ the number of streams that can be reset over a certain time period.
The rate is expressed as a tuple `{NumResets, TimeMs}`. This is
similar to a supervisor restart intensity/period.
+max_cancel_stream_rate ({500, 10000})::
+
+Maximum cancel stream rate per connection. This can be used to
+protect against misbehaving or malicious peers, by limiting the
+number of streams that the peer can reset over a certain time period.
+The rate is expressed as a tuple `{NumCancels, TimeMs}`. This is
+similar to a supervisor restart intensity/period.
+
max_stream_buffer_size (8000000)::
Maximum stream buffer size in bytes. This is a soft limit used
@@ -220,6 +248,11 @@ Whether incoming connections have a PROXY protocol header. The
proxy information will be passed forward via the `proxy_header`
key of the Req object.
+reset_idle_timeout_on_send (false)::
+
+Whether the `idle_timeout` gets reset when sending data
+to the socket.
+
sendfile (true)::
Whether the sendfile syscall may be used. It can be useful to disable
@@ -256,6 +289,10 @@ too many `WINDOW_UPDATE` frames.
== Changelog
+* *2.11*: Websocket over HTTP/2 is now considered stable.
+* *2.11*: The `reset_idle_timeout_on_send` option was added.
+* *2.11*: Add the option `max_cancel_stream_rate` to protect
+ against another flood scenario.
* *2.9*: The `goaway_initial_timeout` and `goaway_complete_timeout`
options were added.
* *2.8*: The `active_n` option was added.
@@ -283,7 +320,7 @@ too many `WINDOW_UPDATE` frames.
`max_frame_size_received`, `max_frame_size_sent`
and `settings_timeout` to configure HTTP/2 SETTINGS
and related behavior.
-* *2.4*: Add the experimental option `enable_connect_protocol`.
+* *2.4*: Add the option `enable_connect_protocol`.
* *2.0*: Protocol introduced.
== See also
diff --git a/doc/src/manual/cowboy_loop.asciidoc b/doc/src/manual/cowboy_loop.asciidoc
index 000149d..8c9a816 100644
--- a/doc/src/manual/cowboy_loop.asciidoc
+++ b/doc/src/manual/cowboy_loop.asciidoc
@@ -28,11 +28,11 @@ Loop handlers implement the following interface:
----
init(Req, State)
-> {cowboy_loop, Req, State}
- | {cowboy_loop, Req, State, hibernate}
+ | {cowboy_loop, Req, State, hibernate | timeout()}
info(Info, Req, State)
-> {ok, Req, State}
- | {ok, Req, State, hibernate}
+ | {ok, Req, State, hibernate | timeout()}
| {stop, Req, State}
terminate(Reason, Req, State) -> ok %% optional
@@ -69,7 +69,9 @@ stop::
== Changelog
-* *2.0*: Loop handlers no longer need to handle overflow/timeouts.
+* *2.11*: A timeout may be returned instead of `hibernate`.
+ It functions the same way as the `gen_server` timeout.
+* *2.0*: Loop handlers no longer need to handle socket events.
* *1.0*: Behavior introduced.
== See also
diff --git a/doc/src/manual/cowboy_metrics_h.asciidoc b/doc/src/manual/cowboy_metrics_h.asciidoc
index c871d57..801bdbb 100644
--- a/doc/src/manual/cowboy_metrics_h.asciidoc
+++ b/doc/src/manual/cowboy_metrics_h.asciidoc
@@ -160,5 +160,6 @@ The metrics stream handler does not produce any event.
link:man:cowboy(7)[cowboy(7)],
link:man:cowboy_stream(3)[cowboy_stream(3)],
link:man:cowboy_compress_h(3)[cowboy_compress_h(3)],
+link:man:cowboy_decompress_h(3)[cowboy_decompress_h(3)],
link:man:cowboy_stream_h(3)[cowboy_stream_h(3)],
link:man:cowboy_tracer_h(3)[cowboy_tracer_h(3)]
diff --git a/doc/src/manual/cowboy_req.asciidoc b/doc/src/manual/cowboy_req.asciidoc
index 0a1ca1b..0367836 100644
--- a/doc/src/manual/cowboy_req.asciidoc
+++ b/doc/src/manual/cowboy_req.asciidoc
@@ -120,8 +120,8 @@ request's URI.
[source,erlang]
----
read_body_opts() :: #{
- length => non_neg_integer(),
- period => non_neg_integer(),
+ length => non_neg_integer() | auto,
+ period => non_neg_integer() | infinity,
timeout => timeout()
}
----
@@ -130,6 +130,10 @@ Body reading options.
The defaults are function-specific.
+Auto mode can be enabled by setting `length` to `auto`
+and `period` to `infinity`. The period cannot be set
+to `infinity` when auto mode isn't used.
+
=== req()
[source,erlang]
diff --git a/doc/src/manual/cowboy_req.cast.asciidoc b/doc/src/manual/cowboy_req.cast.asciidoc
index d6e018f..b12157f 100644
--- a/doc/src/manual/cowboy_req.cast.asciidoc
+++ b/doc/src/manual/cowboy_req.cast.asciidoc
@@ -36,6 +36,22 @@ The atom `ok` is always returned. It can be safely ignored.
== Examples
+.Read the body using auto mode
+[source,erlang]
+----
+read_body_auto_async(Req) ->
+ read_body_auto_async(Req, make_ref(), <<>>).
+
+read_body_auto_async(Req, Ref, Acc) ->
+ cowboy_req:cast({read_body, self(), Ref, auto, infinity}, Req),
+ receive
+ {request_body, Ref, nofin, Data} ->
+ read_body_auto_async(Req, Ref, <<Acc/binary, Data/binary>>);
+ {request_body, Ref, fin, _BodyLen, Data} ->
+ {ok, <<Acc/binary, Data/binary>>, Req}
+ end.
+----
+
.Increase the HTTP/1.1 idle timeout
[source,erlang]
----
diff --git a/doc/src/manual/cowboy_req.read_body.asciidoc b/doc/src/manual/cowboy_req.read_body.asciidoc
index 2b87405..7da76ef 100644
--- a/doc/src/manual/cowboy_req.read_body.asciidoc
+++ b/doc/src/manual/cowboy_req.read_body.asciidoc
@@ -68,6 +68,13 @@ The `timeout` option is a safeguard in case the connection
process becomes unresponsive. The function will crash if no
message was received in that interval. The timeout should be
larger than the period. It defaults to the period + 1 second.
++
+Auto mode can be enabled by setting the `length` to `auto` and
+the `period` to `infinity`. When auto mode is used, Cowboy will
+send data to the handler as soon as it receives it, regardless
+of its size. It will wait indefinitely until data is available.
+Auto mode's main purpose is asynchronous body reading using
+link:man:cowboy_req:cast(3)[cowboy_req:cast(3)].
== Return value
@@ -86,6 +93,9 @@ body has been read.
== Changelog
+* *2.11*: The `length` option now accepts `auto` and the
+ period now accepts `infinity`. This adds support for
+ reading the body in auto mode.
* *2.0*: Function introduced. Replaces `body/1,2`.
== Examples
diff --git a/doc/src/manual/cowboy_rest.asciidoc b/doc/src/manual/cowboy_rest.asciidoc
index 0bb6d47..fcef799 100644
--- a/doc/src/manual/cowboy_rest.asciidoc
+++ b/doc/src/manual/cowboy_rest.asciidoc
@@ -379,7 +379,7 @@ and that the request shouldn't be repeated.
----
generate_etag(Req, State) -> {Result, Req, State}
-Result :: binary() | {weak | strong, binary()}
+Result :: binary() | {weak | strong, binary()} | undefined
Default - no etag value
----
@@ -389,6 +389,10 @@ When a binary is returned, the value is automatically
parsed to a tuple. The binary must be in the same
format as the etag header, including quotes.
+It is possible to conditionally generate an etag.
+When no etag can be generated, `undefined` should
+be returned.
+
=== is_authorized
[source,erlang]
@@ -601,17 +605,139 @@ The response body can be provided either as the actual data
to be sent or a tuple indicating which file to send.
This function is called for both GET and HEAD requests. For
-the latter the body is not sent, however.
+the latter the body is not sent: it is only used to calculate
+the content length.
// @todo Perhaps we can optimize HEAD requests and just
// allow calculating the length instead of returning the
// whole thing.
-Note that there used to be a way to stream the response body.
-It was temporarily removed and will be added back in a later
-release.
+It is possible to stream the response body either by manually
+sending the response and returning a `stop` value; or by
+switching to a different handler (for example a loop handler)
+and manually sending the response. All headers already set
+by Cowboy will also be included in the response.
+
+== RangeCallback
+
+[source,erlang]
+----
+RangeCallback(Req, State) -> {Result, Req, State}
+
+Result :: [{Range, Body}]
+Range :: {From, To, Total} | binary()
+From :: non_neg_integer()
+To :: non_neg_integer()
+Total :: non_neg_integer() | '*'
+Body :: cowboy_req:resp_body()
+Default - crash
+----
+
+Return a list of ranges for the response body.
+
+The range selected can be found in the key `range`
+in the Req object, as indicated in `range_satisfiable`.
+
+Instead of returning the full response body as would
+be done in the `ProvideCallback`, a list of ranges
+must be returned. There can be one or more range.
+When one range is returned, a normal ranged response
+is sent. When multiple ranges are returned, Cowboy
+will automatically send a multipart/byteranges
+response.
+
+When the total is not known the atom `'*'` can be
+returned.
+
+== ranges_provided
+
+[source,erlang]
+----
+ranges_provided(Req, State) -> {Result, Req, State}
+
+Result :: [Range | Auto]
+Range :: {
+ binary(), %% lowercase; case insensitive
+ RangeCallback :: atom()
+}
+Auto :: {<<"bytes">>, auto}
+Default - skip this step
+----
+
+Return the list of range units the resource provides.
+
+During content negotiation Cowboy will build an accept-ranges
+response header with the list of ranges provided. Cowboy
+does not choose a range at this time; ranges are choosen
+when it comes time to call the `ProvideCallback`.
+
+By default ranged requests will be handled the same as normal
+requests: the `ProvideCallback` will be called and the full
+response body will be sent.
+
+It is possible to let Cowboy handle ranged responses
+automatically when the range unit is bytes and the
+atom returned is `auto` (instead of a callback name).
+In that case Cowboy will call the `ProvideCallback`
+and split the response automatically, including by
+producing a multipart/byteranges response if necessary.
+
+== range_satisfiable
+
+[source,erlang]
+----
+range_satisfiable(Req, State) -> {Result, Req, State}
+
+Result :: boolean() | {false, non_neg_integer() | iodata()}
+Default :: true
+----
+
+Whether the range request is satisfiable.
+
+When the time comes to send the response body, and when
+ranges have been provided via the `ranges_provided`
+callback, Cowboy will process the if-range and the
+range request headers and ensure it is satisfiable.
+
+This callback allows making resource-specific checks
+before sending the ranged response. The default is
+to accept sending a ranged response.
+
+Cowboy adds the requested `range` to the Req object
+just before calling this callback:
+
+[source,erlang]
+----
+req() :: #{
+ range => {
+ binary(), %% lowercase; case insensitive
+ Range
+ }
+}
+
+Range :: ByteRange | binary()
+
+ByteRange :: [{FirstByte, LastByte | infinity} | SuffixLen]
+FirstByte :: non_neg_integer()
+LastByte :: non_neg_integer()
+SuffixLen :: neg_integer()
+----
+
+Only byte ranges are parsed. Other ranges are provided
+as binary. Byte ranges may either be requested from first
+to last bytes (inclusive); from first bytes to the end
+(`infinity` is used to represent the last byte); or
+the last bytes of the representation via a negative
+integer (so -500 means the last 500 bytes).
-// @todo Add a way to switch to loop handler for streaming the body.
+Returning `false` will result in a 416 Range Not Satisfiable
+response being sent. The content-range header will be
+set automatically in the response if a tuple is
+returned. The integer value represents the total
+size (in the choosen unit) of the resource. An
+iodata value may also be returned and will be
+used as-is to build the content range header,
+prepended with the unit choosen.
=== rate_limited
@@ -621,7 +747,7 @@ rate_limited(Req, State) -> {Result, Req, State}
Result :: false | {true, RetryAfter}
RetryAfter :: non_neg_integer() | calendar:datetime()
-Default - false
+Default :: false
----
Return whether the user is rate limited.
@@ -730,6 +856,11 @@ listed here, like the authorization header.
== Changelog
+* *2.11*: The `ranges_provided`, `range_satisfiable` and
+ the `RangeCallback` callbacks have been added.
+* *2.11*: The `generate_etag` callback can now return
+ `undefined` to conditionally avoid generating
+ an etag.
* *2.9*: An `AcceptCallback` can now return `{created, URI}` or
`{see_other, URI}`. The return value `{true, URI}`
is deprecated.
diff --git a/doc/src/manual/cowboy_static.asciidoc b/doc/src/manual/cowboy_static.asciidoc
index 0e131dd..dde3401 100644
--- a/doc/src/manual/cowboy_static.asciidoc
+++ b/doc/src/manual/cowboy_static.asciidoc
@@ -129,6 +129,8 @@ when it fails to detect a file's MIME type.
== Changelog
+* *2.11*: Support for range requests was added in 2.6 and
+ is now considered stable.
* *2.6*: The `charset` extra option was added.
* *1.0*: Handler introduced.
diff --git a/doc/src/manual/cowboy_stream.asciidoc b/doc/src/manual/cowboy_stream.asciidoc
index 65bd06e..25a9cf9 100644
--- a/doc/src/manual/cowboy_stream.asciidoc
+++ b/doc/src/manual/cowboy_stream.asciidoc
@@ -52,11 +52,11 @@ HTTP/1.1 will initialize a stream only when the request-line
and all headers have been received. When errors occur before
that point Cowboy will call the callback `early_error/5`
with a partial request, the error reason and the response
-Cowboy intends to send. All other events go throuh the
+Cowboy intends to send. All other events go through the
stream handler using the normal callbacks.
HTTP/2 will initialize the stream when the `HEADERS` block has
-been fully received and decoded. Any protocol error occuring
+been fully received and decoded. Any protocol error occurring
before that will not result in a response being sent and
will therefore not go through the stream handler. In addition
Cowboy may terminate streams without sending an HTTP response
@@ -84,6 +84,13 @@ the `early_error/5` callback must return a response command.
// @todo The logger option and the {log, Level, Format, Args}
// options need to be documented and tested.
+The order in which the commands are given matters. For example,
+when sending a response and at the same time creating a new child
+process, the first command should be the `spawn` and the second the
+`response`. The reason for that is that the sending of the response
+may result in a socket error which leads to the termination of
+the connection before the rest of the commands are executed.
+
The following commands are defined:
[[inform_command]]
@@ -236,6 +243,8 @@ will end successfully as far as the client is concerned.
To indicate that an error occurred, either use `error_response`
before stopping, or use `internal_error`.
+No other command can be executed after the `stop` command.
+
=== internal_error
Stop the stream with an error.
@@ -278,7 +287,7 @@ This can also be used to override stream handler
options. For example this is supported by
link:man:cowboy_compress_h(3)[cowboy_compress_h(3)].
-Not all options can be overriden. Please consult the
+Not all options can be overridden. Please consult the
relevant option's documentation for details.
== Predefined events
@@ -335,7 +344,7 @@ fin() :: fin | nofin
----
Used in commands and events to indicate that this is
-the end of the stream.
+the end of a direction of a stream.
=== partial_req()
diff --git a/doc/src/manual/cowboy_stream.data.asciidoc b/doc/src/manual/cowboy_stream.data.asciidoc
new file mode 100644
index 0000000..a0328f6
--- /dev/null
+++ b/doc/src/manual/cowboy_stream.data.asciidoc
@@ -0,0 +1,81 @@
+= cowboy_stream:data(3)
+
+== Name
+
+cowboy_stream:data - Handle data for a stream
+
+== Description
+
+[source,erlang]
+----
+data(StreamID, IsFin, Data, State) -> {Commands, State}
+
+StreamID :: cowboy_stream:stream_id()
+IsFin :: cowboy_stream:fin()
+Data :: binary()
+Commands :: cowboy_stream:commands()
+State - opaque
+----
+
+Handle data for a stream.
+
+This function should be called by all stream handlers. It will
+propagate data to the next configured stream handler. Handlers
+do not have to propagate data that has been fully handled.
+
+== Arguments
+
+StreamID::
+
+The stream ID.
+
+IsFin::
+
+Whether this is the end of the request body.
+
+Data::
+
+The data received.
+
+Commands::
+
+The commands to be executed.
+
+State::
+
+The state for the next stream handler.
+
+== Return value
+
+A list of commands and an opaque state is returned.
+
+The list of commands returned should be included in the
+commands returned from the current stream handler. It
+can be modified if necessary.
+
+The state should be stored in the current stream
+handler's state and passed to `cowboy_stream` when
+necessary. The state should be treated as opaque.
+
+== Changelog
+
+* *2.0*: Function introduced.
+
+== Examples
+
+.Propagate data to the next stream handler
+[source,erlang]
+----
+data(StreamID, IsFin, Data, State=#state{next=Next0}) ->
+ MyCommands = my_commands(),
+ {Commands, Next} = cowboy_stream:data(StreamID, IsFin, Data, Next0),
+ {MyCommands ++ Commands, #state{next=Next}}.
+----
+
+== See also
+
+link:man:cowboy_stream(3)[cowboy_stream(3)],
+link:man:cowboy_stream:init(3)[cowboy_stream:init(3)],
+link:man:cowboy_stream:info(3)[cowboy_stream:info(3)],
+link:man:cowboy_stream:terminate(3)[cowboy_stream:terminate(3)],
+link:man:cowboy_stream:early_error(3)[cowboy_stream:early_error(3)]
diff --git a/doc/src/manual/cowboy_stream.early_error.asciidoc b/doc/src/manual/cowboy_stream.early_error.asciidoc
new file mode 100644
index 0000000..ad1d6bf
--- /dev/null
+++ b/doc/src/manual/cowboy_stream.early_error.asciidoc
@@ -0,0 +1,73 @@
+= cowboy_stream:early_error(3)
+
+== Name
+
+cowboy_stream:early_error - Handle an early error for a stream
+
+== Description
+
+[source,erlang]
+----
+early_error(StreamID, Reason, PartialReq, Resp, Opts) -> Resp
+
+StreamID :: cowboy_stream:stream_id()
+Reason :: cowboy_stream:reason()
+PartialReq :: cowboy_stream:partial_req()
+Resp :: cowboy_stream:resp_command()
+Opts :: cowboy:opts()
+----
+
+Handle an early error for a stream.
+
+This function should be called by all stream handlers. It will
+propagate the early error to the next configured stream handler.
+
+== Arguments
+
+StreamID::
+
+The stream ID.
+
+Reason::
+
+Reason for termination.
+
+PartialReq::
+
+The request data that has been received so far.
+
+Resp::
+
+The response that will be sent as a result of the early error.
++
+It may be modified by the stream handler before or after
+being propagated to the next handler.
+
+Opts::
+
+The protocol options.
+
+== Return value
+
+The response to be sent as a result of the early error.
+
+== Changelog
+
+* *2.0*: Function introduced.
+
+== Examples
+
+.Propagate the early error to the next stream handler
+[source,erlang]
+----
+early_error(StreamID, Reason, PartialReq, Resp, Opts) ->
+ cowboy_stream:early_error(StreamID, Reason, PartialReq, Resp, Opts).
+----
+
+== See also
+
+link:man:cowboy_stream(3)[cowboy_stream(3)],
+link:man:cowboy_stream:init(3)[cowboy_stream:init(3)],
+link:man:cowboy_stream:data(3)[cowboy_stream:data(3)],
+link:man:cowboy_stream:info(3)[cowboy_stream:info(3)],
+link:man:cowboy_stream:terminate(3)[cowboy_stream:terminate(3)]
diff --git a/doc/src/manual/cowboy_stream.info.asciidoc b/doc/src/manual/cowboy_stream.info.asciidoc
new file mode 100644
index 0000000..32cbd85
--- /dev/null
+++ b/doc/src/manual/cowboy_stream.info.asciidoc
@@ -0,0 +1,77 @@
+= cowboy_stream:info(3)
+
+== Name
+
+cowboy_stream:info - Handle a message for a stream
+
+== Description
+
+[source,erlang]
+----
+info(StreamID, Info, State) -> {Commands, State}
+
+StreamID :: cowboy_stream:stream_id()
+Info :: any()
+Commands :: cowboy_stream:commands()
+State - opaque
+----
+
+Handle a message for a stream.
+
+This function should be called by all stream handlers. It will
+propagate the event to the next configured stream handler.
+Handlers do not have to propagate events that have been
+fully handled.
+
+== Arguments
+
+StreamID::
+
+The stream ID.
+
+Info::
+
+The event received.
+
+Commands::
+
+The commands to be executed.
+
+State::
+
+The state for the next stream handler.
+
+== Return value
+
+A list of commands and an opaque state is returned.
+
+The list of commands returned should be included in the
+commands returned from the current stream handler. It
+can be modified if necessary.
+
+The state should be stored in the current stream
+handler's state and passed to `cowboy_stream` when
+necessary. The state should be treated as opaque.
+
+== Changelog
+
+* *2.0*: Function introduced.
+
+== Examples
+
+.Propagate an event to the next stream handler
+[source,erlang]
+----
+info(StreamID, Info, State=#state{next=Next0}) ->
+ MyCommands = my_commands(),
+ {Commands, Next} = cowboy_stream:info(StreamID, Info, Next0),
+ {MyCommands ++ Commands, #state{next=Next}}.
+----
+
+== See also
+
+link:man:cowboy_stream(3)[cowboy_stream(3)],
+link:man:cowboy_stream:init(3)[cowboy_stream:init(3)],
+link:man:cowboy_stream:data(3)[cowboy_stream:data(3)],
+link:man:cowboy_stream:terminate(3)[cowboy_stream:terminate(3)],
+link:man:cowboy_stream:early_error(3)[cowboy_stream:early_error(3)]
diff --git a/doc/src/manual/cowboy_stream.init.asciidoc b/doc/src/manual/cowboy_stream.init.asciidoc
new file mode 100644
index 0000000..addf9bc
--- /dev/null
+++ b/doc/src/manual/cowboy_stream.init.asciidoc
@@ -0,0 +1,80 @@
+= cowboy_stream:init(3)
+
+== Name
+
+cowboy_stream:init - Initialize a stream
+
+== Description
+
+[source,erlang]
+----
+init(StreamID, Req, Opts) -> {Commands, State}
+
+StreamID :: cowboy_stream:stream_id()
+Req :: cowboy_req:req()
+Opts :: cowboy:opts()
+Commands :: cowboy_stream:commands()
+State - opaque
+----
+
+Initialize a stream.
+
+This function must be called by all stream handlers. It will
+initialize the next configured stream handler.
+
+== Arguments
+
+StreamID::
+
+The stream ID.
+
+Req::
+
+The Req object.
+
+Opts::
+
+The protocol options.
+
+Commands::
+
+The commands to be executed.
+
+State::
+
+The state for the next stream handler.
+
+== Return value
+
+A list of commands and an opaque state is returned.
+
+The list of commands returned should be included in the
+commands returned from the current stream handler. It
+can be modified if necessary.
+
+The state should be stored in the current stream
+handler's state and passed to `cowboy_stream` when
+necessary. The state should be treated as opaque.
+
+== Changelog
+
+* *2.0*: Function introduced.
+
+== Examples
+
+.Initialize the next stream handler
+[source,erlang]
+----
+init(StreamID, Req, Opts) ->
+ MyCommands = my_commands(),
+ {Commands, Next} = cowboy_stream:init(StreamID, Req, Opts),
+ {MyCommands ++ Commands, #state{next=Next}}.
+----
+
+== See also
+
+link:man:cowboy_stream(3)[cowboy_stream(3)],
+link:man:cowboy_stream:data(3)[cowboy_stream:data(3)],
+link:man:cowboy_stream:info(3)[cowboy_stream:info(3)],
+link:man:cowboy_stream:terminate(3)[cowboy_stream:terminate(3)],
+link:man:cowboy_stream:early_error(3)[cowboy_stream:early_error(3)]
diff --git a/doc/src/manual/cowboy_stream.terminate.asciidoc b/doc/src/manual/cowboy_stream.terminate.asciidoc
new file mode 100644
index 0000000..8393801
--- /dev/null
+++ b/doc/src/manual/cowboy_stream.terminate.asciidoc
@@ -0,0 +1,61 @@
+= cowboy_stream:terminate(3)
+
+== Name
+
+cowboy_stream:terminate - Terminate a stream
+
+== Description
+
+[source,erlang]
+----
+terminate(StreamID, Reason, State) -> ok
+
+StreamID :: cowboy_stream:stream_id()
+Reason :: cowboy_stream:reason()
+State - opaque
+----
+
+Terminate a stream.
+
+This function must be called by all stream handlers. It will
+terminate the next configured stream handler.
+
+== Arguments
+
+StreamID::
+
+The stream ID.
+
+Reason::
+
+Reason for termination.
+
+State::
+
+The state for the next stream handler.
+
+== Return value
+
+The atom `ok` is always returned. It can be safely ignored.
+
+== Changelog
+
+* *2.0*: Function introduced.
+
+== Examples
+
+.Terminate the next stream handler
+[source,erlang]
+----
+terminate(StreamID, Reason, State=#state{next=Next0}) ->
+ my_termination(State),
+ cowboy_stream:terminate(StreamID, Reason, Next0).
+----
+
+== See also
+
+link:man:cowboy_stream(3)[cowboy_stream(3)],
+link:man:cowboy_stream:init(3)[cowboy_stream:init(3)],
+link:man:cowboy_stream:data(3)[cowboy_stream:data(3)],
+link:man:cowboy_stream:info(3)[cowboy_stream:info(3)],
+link:man:cowboy_stream:early_error(3)[cowboy_stream:early_error(3)]
diff --git a/doc/src/manual/cowboy_stream_h.asciidoc b/doc/src/manual/cowboy_stream_h.asciidoc
index c25aa3d..7e0af89 100644
--- a/doc/src/manual/cowboy_stream_h.asciidoc
+++ b/doc/src/manual/cowboy_stream_h.asciidoc
@@ -45,8 +45,49 @@ The default stream handler spawns the request process
and receives its exit signal when it terminates. It
will stop the stream once its receives it.
-// @todo It also implements the read_body mechanism.
-// Note that cowboy_stream_h sends the 100-continue automatically.
+Because this stream handler converts events from the
+request process into commands, other stream handlers
+may not work properly if they are executed after the
+default stream handler. Always be mindful of in which
+order stream handlers will get executed.
+
+=== Request body
+
+The default stream handler implements the `read_body`
+mechanism. In addition to reading the body, the handler
+will automatically handle the `expect: 100-continue`
+header and send a 100 Continue response.
+
+Normally one would use
+link:man:cowboy_req:read_body(3)[cowboy_req:read_body(3)]
+to read the request body. The default stream handler
+will buffer data until the amount gets larger than the
+requested length before sending it. Alternatively, it
+will send whatever data it has when the period timeout
+triggers. Depending on the protocol, the flow control
+window is updated to allow receiving data for the
+requested length.
+
+The default stream handler also comes with an automatic
+mode for reading the request body. This can be used by
+sending the event message `{read_body, Pid, Ref, auto, infinity}`
+using link:man:cowboy_req:cast(3)[cowboy_req:cast(3)].
+The default stream handler will then send data as soon
+as some becomes available using one of these two
+messages depending on whether body reading was completed:
+
+* `{request_body, Ref, nofin, Data}`
+* `{request_body, Ref, fin, BodyLen, Data}`
+
+Depending on the protocol, Cowboy will update the flow
+control window using the size of the data that was read.
+
+Auto mode automatically gets disabled after data has
+been sent to the handler. Therefore in order to continue
+reading data a `read_body` event message must be sent
+after each `request_body` message.
+
+=== Response
In addition it returns a command for any event message
looking like one of the following commands: `inform`,
@@ -54,14 +95,9 @@ looking like one of the following commands: `inform`,
`switch_protocol`. This is what allows the request
process to send a response.
-// @todo Add set_options, which updates options dynamically.
-
-Because this stream handler converts events from the
-request process into commands, other stream handlers
-may not work properly if they are executed
-
== Changelog
+* *2.11*: Introduce body reading using auto mode.
* *2.0*: Module introduced.
== See also
@@ -69,5 +105,7 @@ may not work properly if they are executed
link:man:cowboy(7)[cowboy(7)],
link:man:cowboy_stream(3)[cowboy_stream(3)],
link:man:cowboy_compress_h(3)[cowboy_compress_h(3)],
+link:man:cowboy_decompress_h(3)[cowboy_decompress_h(3)],
link:man:cowboy_metrics_h(3)[cowboy_metrics_h(3)],
-link:man:cowboy_tracer_h(3)[cowboy_tracer_h(3)]
+link:man:cowboy_tracer_h(3)[cowboy_tracer_h(3)],
+link:man:cowboy_req:cast(3)[cowboy_req:cast(3)]
diff --git a/doc/src/manual/cowboy_tracer_h.asciidoc b/doc/src/manual/cowboy_tracer_h.asciidoc
index e3592e4..4f4e9bc 100644
--- a/doc/src/manual/cowboy_tracer_h.asciidoc
+++ b/doc/src/manual/cowboy_tracer_h.asciidoc
@@ -84,5 +84,6 @@ The tracer stream handler does not produce any event.
link:man:cowboy(7)[cowboy(7)],
link:man:cowboy_stream(3)[cowboy_stream(3)],
link:man:cowboy_compress_h(3)[cowboy_compress_h(3)],
+link:man:cowboy_decompress_h(3)[cowboy_decompress_h(3)],
link:man:cowboy_metrics_h(3)[cowboy_metrics_h(3)],
link:man:cowboy_stream_h(3)[cowboy_stream_h(3)]
diff --git a/doc/src/manual/cowboy_websocket.asciidoc b/doc/src/manual/cowboy_websocket.asciidoc
index 5b1558c..6d822d9 100644
--- a/doc/src/manual/cowboy_websocket.asciidoc
+++ b/doc/src/manual/cowboy_websocket.asciidoc
@@ -126,7 +126,7 @@ timeout::
received first.
{error, Reason}::
- A socket error ocurred.
+ A socket error occurred.
== Types
@@ -285,6 +285,8 @@ normal circumstances if necessary.
== Changelog
+* *2.11*: Websocket over HTTP/2 is now considered stable.
+* *2.11*: HTTP/1.1 Websocket no longer traps exits by default.
* *2.8*: The `active_n` option was added.
* *2.7*: The commands based interface has been documented.
The old interface is now deprecated.