summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--_build/Makefile2
-rw-r--r--_build/content/articles/erlang-validate-utf8.asciidoc4
-rw-r--r--_build/content/articles/erlang.mk-and-relx.asciidoc4
-rw-r--r--_build/content/articles/ranch-ftp.asciidoc2
-rw-r--r--_build/data/projects/ranch.toml4
-rw-r--r--articles/cowboy2-qs/index.html2
-rw-r--r--articles/erlang-scalability/index.html2
-rw-r--r--articles/erlang-validate-utf8/index.html6
-rw-r--r--articles/erlang.mk-and-relx/index.html2
-rw-r--r--articles/erlanger-playbook-september-2015-update/index.html2
-rw-r--r--articles/erlanger-playbook/index.html2
-rw-r--r--articles/farwest-funded/index.html2
-rw-r--r--articles/index.html78
-rw-r--r--articles/index.xml10
-rw-r--r--articles/january-2014-status/index.html2
-rw-r--r--articles/ml-archives/index.html2
-rw-r--r--articles/on-open-source/index.html2
-rw-r--r--articles/page/1/index.html2
-rw-r--r--articles/ranch-ftp/index.html4
-rw-r--r--articles/the-story-so-far/index.html2
-rw-r--r--articles/tictactoe/index.html2
-rw-r--r--articles/website-update/index.html2
-rw-r--r--articles/xerl-0.1-empty-modules/index.html2
-rw-r--r--articles/xerl-0.2-two-modules/index.html2
-rw-r--r--articles/xerl-0.3-atomic-expressions/index.html2
-rw-r--r--articles/xerl-0.4-expression-separator/index.html2
-rw-r--r--articles/xerl-0.5-intermediate-module/index.html2
-rw-r--r--categories/index.html2
-rw-r--r--docs/en/cowboy/1.0/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/architecture/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/broken_clients/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/constraints/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/cookies/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/erlang_web/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/flow_diagram/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/getting_started/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/handlers/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/hooks/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/introduction/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/listeners/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/loop_handlers/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/middlewares/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/modern_web/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/multipart/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/overview/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/req/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/req_body/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/resource_design/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/resp/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/rest_flowcharts/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/rest_handlers/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/rest_principles/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/routing/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/static_files/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/sub_protocols/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/ws_handlers/index.html2
-rw-r--r--docs/en/cowboy/2.0/guide/ws_protocol/index.html2
-rw-r--r--docs/en/cowboy/2.0/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy.set_env/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy.start_clear/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy.start_tls/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy.stop_listener/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_app/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_handler/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_loop/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_middleware/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_protocol/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.binding/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.bindings/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.header/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.headers/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.host/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.host_info/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.match_cookies/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.match_qs/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.method/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.parse_cookies/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.parse_header/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.parse_qs/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.path/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.path_info/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.peer/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.port/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.qs/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.scheme/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.uri/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req.version/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_req/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_rest/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_router/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_static/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_sub_protocol/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/cowboy_websocket/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/http_status_codes/index.html2
-rw-r--r--docs/en/cowboy/2.0/manual/index.html2
-rw-r--r--docs/en/cowboy/HEAD/guide/index.html2
-rw-r--r--docs/en/cowboy/HEAD/index.html2
-rw-r--r--docs/en/cowboy/HEAD/manual/index.html2
-rw-r--r--docs/en/cowboy/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/app/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/asciidoc/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/ci/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/common_test.asciidoc6
-rw-r--r--docs/en/erlang.mk/1/guide/common_test/index.html6
-rw-r--r--docs/en/erlang.mk/1/guide/compat/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/contributing/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/coverage/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/deps/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/dialyzer/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/edoc/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/escripts/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/eunit/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/external_plugins/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/external_plugins_list/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/getting_started/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/history/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/installation/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/limitations/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/overview/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/ports/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/releases/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/sfx/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/shell/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/updating/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/why/index.html2
-rw-r--r--docs/en/erlang.mk/1/guide/xref/index.html2
-rw-r--r--docs/en/erlang.mk/1/index.html2
-rw-r--r--docs/en/erlang.mk/index.html2
-rw-r--r--docs/en/gun/1.0/guide/connect/index.html2
-rw-r--r--docs/en/gun/1.0/guide/http/index.html2
-rw-r--r--docs/en/gun/1.0/guide/index.html2
-rw-r--r--docs/en/gun/1.0/guide/introduction.asciidoc4
-rw-r--r--docs/en/gun/1.0/guide/introduction/index.html8
-rw-r--r--docs/en/gun/1.0/guide/protocols/index.html2
-rw-r--r--docs/en/gun/1.0/guide/start/index.html2
-rw-r--r--docs/en/gun/1.0/guide/websocket/index.html2
-rw-r--r--docs/en/gun/1.0/index.html2
-rw-r--r--docs/en/gun/1.0/manual/gun/index.html2
-rw-r--r--docs/en/gun/1.0/manual/gun_app/index.html2
-rw-r--r--docs/en/gun/1.0/manual/index.html2
-rw-r--r--docs/en/gun/index.html2
-rw-r--r--docs/en/index.html2
-rw-r--r--docs/en/ranch/1.2/guide/embedded/index.html4
-rw-r--r--docs/en/ranch/1.2/guide/index.html4
-rw-r--r--docs/en/ranch/1.2/guide/internals/index.html4
-rw-r--r--docs/en/ranch/1.2/guide/introduction/index.html4
-rw-r--r--docs/en/ranch/1.2/guide/listeners.asciidoc20
-rw-r--r--docs/en/ranch/1.2/guide/listeners/index.html25
-rw-r--r--docs/en/ranch/1.2/guide/parsers/index.html4
-rw-r--r--docs/en/ranch/1.2/guide/protocols/index.html4
-rw-r--r--docs/en/ranch/1.2/guide/ssl_auth.asciidoc2
-rw-r--r--docs/en/ranch/1.2/guide/ssl_auth/index.html6
-rw-r--r--docs/en/ranch/1.2/guide/transports/index.html4
-rw-r--r--docs/en/ranch/1.2/index.html2
-rw-r--r--docs/en/ranch/1.2/manual/index.html4
-rw-r--r--docs/en/ranch/1.2/manual/ranch/index.html12
-rw-r--r--docs/en/ranch/1.2/manual/ranch_app/index.html4
-rw-r--r--docs/en/ranch/1.2/manual/ranch_protocol/index.html4
-rw-r--r--docs/en/ranch/1.2/manual/ranch_ssl/index.html40
-rw-r--r--docs/en/ranch/1.2/manual/ranch_tcp/index.html13
-rw-r--r--docs/en/ranch/1.2/manual/ranch_transport/index.html4
-rw-r--r--docs/en/ranch/1.3/guide/embedded.asciidoc48
-rw-r--r--docs/en/ranch/1.3/guide/embedded/index.html205
-rw-r--r--docs/en/ranch/1.3/guide/index.html186
-rw-r--r--docs/en/ranch/1.3/guide/internals.asciidoc94
-rw-r--r--docs/en/ranch/1.3/guide/internals/index.html246
-rw-r--r--docs/en/ranch/1.3/guide/introduction.asciidoc28
-rw-r--r--docs/en/ranch/1.3/guide/introduction/index.html187
-rw-r--r--docs/en/ranch/1.3/guide/listeners.asciidoc302
-rw-r--r--docs/en/ranch/1.3/guide/listeners/index.html503
-rw-r--r--docs/en/ranch/1.3/guide/parsers.asciidoc92
-rw-r--r--docs/en/ranch/1.3/guide/parsers/index.html266
-rw-r--r--docs/en/ranch/1.3/guide/protocols.asciidoc99
-rw-r--r--docs/en/ranch/1.3/guide/protocols/index.html261
-rw-r--r--docs/en/ranch/1.3/guide/ssl_auth.asciidoc120
-rw-r--r--docs/en/ranch/1.3/guide/ssl_auth/index.html315
-rw-r--r--docs/en/ranch/1.3/guide/transports.asciidoc161
-rw-r--r--docs/en/ranch/1.3/guide/transports/index.html336
-rw-r--r--docs/en/ranch/1.3/manual/index.html176
-rw-r--r--docs/en/ranch/1.3/manual/ranch/index.html696
-rw-r--r--docs/en/ranch/1.3/manual/ranch_app/index.html179
-rw-r--r--docs/en/ranch/1.3/manual/ranch_protocol/index.html221
-rw-r--r--docs/en/ranch/1.3/manual/ranch_ssl/index.html523
-rw-r--r--docs/en/ranch/1.3/manual/ranch_tcp/index.html421
-rw-r--r--docs/en/ranch/1.3/manual/ranch_transport/index.html632
-rw-r--r--docs/en/ranch/index.html2
-rw-r--r--docs/index.html9
-rw-r--r--docs/index.xml366
-rw-r--r--donate/index.html1144
-rw-r--r--index.html40
-rw-r--r--index.xml6
-rw-r--r--services/index.html803
-rw-r--r--sitemap.xml68
-rw-r--r--slogan/index.html2
-rw-r--r--support/index.html2
-rw-r--r--tags/index.html2
-rw-r--r--talks/index.html2
-rw-r--r--training/index.html2
201 files changed, 8334 insertions, 977 deletions
diff --git a/_build/Makefile b/_build/Makefile
index dc3cf23a..35b0148d 100644
--- a/_build/Makefile
+++ b/_build/Makefile
@@ -26,7 +26,7 @@ define docs-version-target
.PHONY: docs-$1-$2
docs-$1-$2: tmp/$1
- cd tmp/$1 && git checkout $4
+ cd tmp/$1 && git checkout $4 && git reset --hard $4
if [ -f tmp/$1/doc/src/guide/book.asciidoc ]; then \
mkdir -p content/docs/en/$1/$3/guide/; \
echo "+++" > content/docs/en/$1/$3/guide.asciidoc; \
diff --git a/_build/content/articles/erlang-validate-utf8.asciidoc b/_build/content/articles/erlang-validate-utf8.asciidoc
index 383afcc6..dd0c1e10 100644
--- a/_build/content/articles/erlang-validate-utf8.asciidoc
+++ b/_build/content/articles/erlang-validate-utf8.asciidoc
@@ -13,8 +13,8 @@ change in the way the code validates UTF-8 data]
When looking into why the permessage-deflate tests
in autobahntestsuite were taking such a long time, I
found that autobahn is using an adaptation of the
-algorithm named <a href="http://bjoern.hoehrmann.de/utf-8/decoder/dfa/">Flexible
-and Economical UTF-8 Decoder</a>. This is the C99
+algorithm named http://bjoern.hoehrmann.de/utf-8/decoder/dfa/[Flexible
+and Economical UTF-8 Decoder]. This is the C99
implementation:
[source,c]
diff --git a/_build/content/articles/erlang.mk-and-relx.asciidoc b/_build/content/articles/erlang.mk-and-relx.asciidoc
index e8a667a8..b6f3b25f 100644
--- a/_build/content/articles/erlang.mk-and-relx.asciidoc
+++ b/_build/content/articles/erlang.mk-and-relx.asciidoc
@@ -50,8 +50,8 @@ this website. I only removed a few targets that were off-topic.
PROJECT = ninenines
DEPS = cowboy erlydtl
-dep_cowboy = https://github.com/extend/cowboy.git 0.8.5
-dep_erlydtl = https://github.com/evanmiller/erlydtl.git 4d0dc8fb
+dep_cowboy_commit = 0.8.5
+dep_erlydtl_commit = 4d0dc8fb
.PHONY: release clean-release
diff --git a/_build/content/articles/ranch-ftp.asciidoc b/_build/content/articles/ranch-ftp.asciidoc
index 19209ccc..056e3102 100644
--- a/_build/content/articles/ranch-ftp.asciidoc
+++ b/_build/content/articles/ranch-ftp.asciidoc
@@ -197,7 +197,7 @@ loop(Socket, Transport, Buffer) ->
Buffer2 = << Buffer/binary, Data/binary >>,
{Commands, Rest} = split(Buffer2),
[handle(Socket, Transport, C) || C <- Commands],
- loop(Socket, Transport);
+ loop(Socket, Transport, Rest);
{error, _} ->
io:format("The client disconnected~n")
end.
diff --git a/_build/data/projects/ranch.toml b/_build/data/projects/ranch.toml
index 1f3cb624..fccaed4a 100644
--- a/_build/data/projects/ranch.toml
+++ b/_build/data/projects/ranch.toml
@@ -3,8 +3,8 @@ catchphrase = "The holy cow of servers."
description = "Ranch is a socket acceptor pool for building awesome TCP and TLS servers."
name = "ranch"
repository = "https://github.com/ninenines/ranch"
-versions = ["1.2"]
-branches = ["master"]
+versions = ["1.3", "1.2"]
+branches = ["master", "1.2.1"]
has_source = true
has_guide = true
has_manual = true
diff --git a/articles/cowboy2-qs/index.html b/articles/cowboy2-qs/index.html
index b9dcdbe4..435cd076 100644
--- a/articles/cowboy2-qs/index.html
+++ b/articles/cowboy2-qs/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Cowboy 2.0 and query strings</title>
diff --git a/articles/erlang-scalability/index.html b/articles/erlang-scalability/index.html
index 836e2a99..b970dd20 100644
--- a/articles/erlang-scalability/index.html
+++ b/articles/erlang-scalability/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Erlang Scalability</title>
diff --git a/articles/erlang-validate-utf8/index.html b/articles/erlang-validate-utf8/index.html
index 44e0f42f..9e6ad29a 100644
--- a/articles/erlang-validate-utf8/index.html
+++ b/articles/erlang-validate-utf8/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Validating UTF-8 binaries with Erlang</title>
@@ -84,8 +84,8 @@ change in the way the code validates UTF-8 data</a>
<div class="paragraph"><p>When looking into why the permessage-deflate tests
in autobahntestsuite were taking such a long time, I
found that autobahn is using an adaptation of the
-algorithm named &lt;a href="http://bjoern.hoehrmann.de/utf-8/decoder/dfa/"&gt;Flexible
-and Economical UTF-8 Decoder&lt;/a&gt;. This is the C99
+algorithm named <a href="http://bjoern.hoehrmann.de/utf-8/decoder/dfa/">Flexible
+and Economical UTF-8 Decoder</a>. This is the C99
implementation:</p></div>
<div class="listingblock">
<div class="content"><!-- Generator: GNU source-highlight 3.1.8
diff --git a/articles/erlang.mk-and-relx/index.html b/articles/erlang.mk-and-relx/index.html
index b37be0bd..b83e3205 100644
--- a/articles/erlang.mk-and-relx/index.html
+++ b/articles/erlang.mk-and-relx/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Build Erlang releases with Erlang.mk and Relx</title>
diff --git a/articles/erlanger-playbook-september-2015-update/index.html b/articles/erlanger-playbook-september-2015-update/index.html
index 8b2c0245..f79d285e 100644
--- a/articles/erlanger-playbook-september-2015-update/index.html
+++ b/articles/erlanger-playbook-september-2015-update/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: The Erlanger Playbook September 2015 Update</title>
diff --git a/articles/erlanger-playbook/index.html b/articles/erlanger-playbook/index.html
index 7a5888ae..672fd232 100644
--- a/articles/erlanger-playbook/index.html
+++ b/articles/erlanger-playbook/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: The Erlanger Playbook</title>
diff --git a/articles/farwest-funded/index.html b/articles/farwest-funded/index.html
index 597844a1..21b8a687 100644
--- a/articles/farwest-funded/index.html
+++ b/articles/farwest-funded/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Farwest got funded!</title>
diff --git a/articles/index.html b/articles/index.html
index c7e525cd..d8077213 100644
--- a/articles/index.html
+++ b/articles/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Articles</title>
@@ -81,7 +81,10 @@
</p>
</header>
- <p>The old mailing list archives have been added to the site, mainly for referencing purposes. The mailing list has been shut down and all personal information has been deleted. If you need help with a project, consider either opening a ticket on that project&#8217;s issues tracker or going through the community channels (erlang-questions, #ninenines or #erlang on Freenode). Prefer tickets; often when people have issues it highlights an underlying problem in the project or its documentation.</p>
+ <p>The old mailing list archives have been added to the site, mainly for referencing purposes.
+ The mailing list has been shut down and all personal information has been deleted.
+ If you need help with a project, consider either opening a ticket on that project&#8217;s issues tracker or going through the community channels (erlang-questions, #ninenines or #erlang on Freenode).
+ Prefer tickets; often when people have issues it highlights an underlying problem in the project or its documentation.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/ml-archives/">Read More</a>
@@ -97,7 +100,9 @@
</p>
</header>
- <p>Last week-end I updated the Nine Nines website. I switched to Hugo. The site is now built from Asciidoc documents. You probably saw me switch to Asciidoc for documentation this past year. This is the natural conclusion to that story. The great thing is that with a little bit of Makefile magic I can just copy the documentation files into Hugo and poof, they appear on the website. I am very happy with that new setup.</p>
+ <p>Last week-end I updated the Nine Nines website.
+ I switched to Hugo. The site is now built from Asciidoc documents. You probably saw me switch to Asciidoc for documentation this past year. This is the natural conclusion to that story. The great thing is that with a little bit of Makefile magic I can just copy the documentation files into Hugo and poof, they appear on the website.
+ I am very happy with that new setup.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/website-update/">Read More</a>
@@ -113,7 +118,10 @@
</p>
</header>
- <p>An update to The Erlanger Playbook is now available! The Erlanger Playbook is a book about software development using Erlang. It currently covers all areas from the conception, design, the writing of code, documentation and tests. The book is still a work in progress. Future topics will include refactoring, debugging and tracing, benchmarking, releases, community management (for open source projects). This update fixes a number of things and adds two chapters: IOlists and Erlang building blocks.</p>
+ <p>An update to The Erlanger Playbook is now available!
+ The Erlanger Playbook is a book about software development using Erlang. It currently covers all areas from the conception, design, the writing of code, documentation and tests.
+ The book is still a work in progress. Future topics will include refactoring, debugging and tracing, benchmarking, releases, community management (for open source projects).
+ This update fixes a number of things and adds two chapters: IOlists and Erlang building blocks.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/erlanger-playbook-september-2015-update/">Read More</a>
@@ -129,7 +137,10 @@
</p>
</header>
- <p>I am proud to announce the pre-release of The Erlanger Playbook. The Erlanger Playbook is a book about software development using Erlang. It currently covers all areas from the conception, design, the writing of code, documentation and tests. The book is still a work in progress. Future topics will include refactoring, debugging and tracing, benchmarking, releases, community management (for open source projects). The following sections are currently available: About this book; Future additions Workflow: Think; Write; Stay productive Documentation: On documentation; Tutorials; User guide; Manual Code: Starting a project; Version control; Project structure; Code style; Best practices; Special processes Tests: On testing; Success typing analysis; Manual testing; Unit testing; Functional testing Read a preview: Special processes The book is currently just shy of 100 pages.</p>
+ <p>I am proud to announce the pre-release of The Erlanger Playbook.
+ The Erlanger Playbook is a book about software development using Erlang. It currently covers all areas from the conception, design, the writing of code, documentation and tests.
+ The book is still a work in progress. Future topics will include refactoring, debugging and tracing, benchmarking, releases, community management (for open source projects).
+ The following sections are currently available:</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/erlanger-playbook/">Read More</a>
@@ -145,7 +156,9 @@
</p>
</header>
- <p>Yesterday I pushed Websocket permessage-deflate to Cowboy master. I also pushed a change in the way the code validates UTF-8 data (required for text and close frames as per the spec). When looking into why the permessage-deflate tests in autobahntestsuite were taking such a long time, I found that autobahn is using an adaptation of the algorithm named &lt;a href="http://bjoern.hoehrmann.de/utf-8/decoder/dfa/"&gt;Flexible and Economical UTF-8 Decoder&lt;/a&gt;. This is the C99 implementation: // Copyright (c) 2008-2009 Bjoern Hoehrmann &lt;[email protected]&gt; // See http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ for details.</p>
+ <p>Yesterday I pushed Websocket permessage-deflate to Cowboy master. I also pushed a change in the way the code validates UTF-8 data (required for text and close frames as per the spec).
+ When looking into why the permessage-deflate tests in autobahntestsuite were taking such a long time, I found that autobahn is using an adaptation of the algorithm named Flexible and Economical UTF-8 Decoder. This is the C99 implementation:
+ // Copyright (c) 2008-2009 Bjoern Hoehrmann &lt;bjoern@hoehrmann.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/erlang-validate-utf8/">Read More</a>
@@ -161,7 +174,7 @@
</p>
</header>
- <p>Last week I read a great article on contributing to open source by Alvaro Videla. He makes many great points and I am in agreement with most of it. This made me want to properly explain my point of view with regard to open source and contributions. Unlike most open source evangelism articles I will not talk about ideals or any of that crap, but rather my personal feelings and experience.</p>
+ <p>Last week I read a great article on contributing to open source by Alvaro Videla. He makes many great points and I am in agreement with most of it. This made me want to properly explain my point of view with regard to open source and contributions. Unlike most open source evangelism articles I will not talk about ideals or any of that crap, but rather my personal feelings and experience.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/on-open-source/">Read More</a>
@@ -177,7 +190,7 @@
</p>
</header>
- <p>As I am away from home with little to do (some call this a vacation) I wanted to reflect a little on the story so far, or how I arrived to Erlang and got to where I am now. The raw personal experience. It&#8217;ll be an article that&#8217;s more about social aspect, communities and marketing a project than technical considerations. As a period piece, it will also allow me to reflect on the evolution of Erlang in recent years.</p>
+ <p>As I am away from home with little to do (some call this a vacation) I wanted to reflect a little on the story so far, or how I arrived to Erlang and got to where I am now. The raw personal experience. It&#8217;ll be an article that&#8217;s more about social aspect, communities and marketing a project than technical considerations. As a period piece, it will also allow me to reflect on the evolution of Erlang in recent years.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/the-story-so-far/">Read More</a>
@@ -193,7 +206,8 @@
</p>
</header>
- <p>Now that Cowboy 1.0 is out, I can spend some of my time thinking about Cowboy 2.0 that will be released soon after Erlang/OTP 18.0. This entry discusses the proposed changes to query string handling in Cowboy. Cowboy 2.0 will respond to user wishes by simplifying the interface of the cowboy_req module. Users want two things: less juggling with the Req variable, and more maps. Maps is the only dynamic key/value data structure in Erlang that we can match directly to extract values, allowing users to greatly simplify their code as they don&#8217;t need to call functions to do everything anymore.</p>
+ <p>Now that Cowboy 1.0 is out, I can spend some of my time thinking about Cowboy 2.0 that will be released soon after Erlang/OTP 18.0. This entry discusses the proposed changes to query string handling in Cowboy.
+ Cowboy 2.0 will respond to user wishes by simplifying the interface of the cowboy_req module. Users want two things: less juggling with the Req variable, and more maps. Maps is the only dynamic key/value data structure in Erlang that we can match directly to extract values, allowing users to greatly simplify their code as they don&#8217;t need to call functions to do everything anymore.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/cowboy2-qs/">Read More</a>
@@ -209,7 +223,9 @@
</p>
</header>
- <p>I will now be regularly writing posts about project status, plans and hopes for the future. Before that though, there&#8217;s one important news to share. Until a year ago all development was financed through consulting and development services. This worked alright but too much time was spent doing things that didn&#8217;t benefit the open source projects. And that didn&#8217;t make me happy at all. Because I like being happy I stopped that for the most part and spent the year figuring things out, experimenting and discussing with people about it.</p>
+ <p>I will now be regularly writing posts about project status, plans and hopes for the future.
+ Before that though, there&#8217;s one important news to share.
+ Until a year ago all development was financed through consulting and development services. This worked alright but too much time was spent doing things that didn&#8217;t benefit the open source projects. And that didn&#8217;t make me happy at all. Because I like being happy I stopped that for the most part and spent the year figuring things out, experimenting and discussing with people about it.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/january-2014-status/">Read More</a>
@@ -225,7 +241,10 @@
</p>
</header>
- <p>This was a triumph! I&#8217;m making a note here: HUGE SUCCESS!! It&#8217;s hard to overstate my satisfaction. Thanks to everyone who made this possible. If you have backed this fundraiser, and haven&#8217;t provided your personal details yet, please do so quickly so that your rewards can be sent! I am hoping that we will be able to make good use of all that money. The details of the expenses will be published regularly on the 2013 Fundraiser wiki page, giving you full disclosure as to how your money is used.</p>
+ <p>This was a triumph! I&#8217;m making a note here: HUGE SUCCESS!!
+ It&#8217;s hard to overstate my satisfaction. Thanks to everyone who made this possible.
+ If you have backed this fundraiser, and haven&#8217;t provided your personal details yet, please do so quickly so that your rewards can be sent!
+ I am hoping that we will be able to make good use of all that money. The details of the expenses will be published regularly on the 2013 Fundraiser wiki page, giving you full disclosure as to how your money is used.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/farwest-funded/">Read More</a>
@@ -241,7 +260,8 @@
</p>
</header>
- <p>Building OTP releases has always been a difficult task. Tools like Reltool or Rebar have made this simpler, but it&#8217;s no panacea. This article will show you an alternative and hopefully much simpler solution. There is two steps to building a release. First you need to build the various OTP applications you want to include in the release. Once done, you need to create the release itself, by including the Erlang runtime system alongside the applications, a boot script to start the node and all its applications, and some configuration files.</p>
+ <p>Building OTP releases has always been a difficult task. Tools like Reltool or Rebar have made this simpler, but it&#8217;s no panacea. This article will show you an alternative and hopefully much simpler solution.
+ There is two steps to building a release. First you need to build the various OTP applications you want to include in the release. Once done, you need to create the release itself, by including the Erlang runtime system alongside the applications, a boot script to start the node and all its applications, and some configuration files.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/erlang.mk-and-relx/">Read More</a>
@@ -257,7 +277,9 @@
</p>
</header>
- <p>Today we will start the work on the intermediate module that will be used to run the code for the expressions found in our file&#8217;s body, replacing our interpreter. This is what we want to have when all the work is done: xerl -&gt; tokens -&gt; AST -&gt; intermediate -&gt; cerl Today we will perform this work only on the atomic integer expression however, so we will not build any module at the end.</p>
+ <p>Today we will start the work on the intermediate module that will be used to run the code for the expressions found in our file&#8217;s body, replacing our interpreter.
+ This is what we want to have when all the work is done:
+ xerl -&gt; tokens -&gt; AST -&gt; intermediate -&gt; cerl Today we will perform this work only on the atomic integer expression however, so we will not build any module at the end.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/xerl-0.5-intermediate-module/">Read More</a>
@@ -273,7 +295,10 @@
</p>
</header>
- <p>As promised we are adding an expression separator this time. This will be short and easy. In the tokenizer we only need to add a line recognizing the comma as a valid token. , : {token, {',', TokenLine}}. Then we need to change the following lines in the parser: exprs -&gt; expr : ['$1']. exprs -&gt; expr exprs : ['$1' | '$2']. And add a comma between the expressions on the second line: exprs -&gt; expr : ['$1'].</p>
+ <p>As promised we are adding an expression separator this time. This will be short and easy.
+ In the tokenizer we only need to add a line recognizing the comma as a valid token.
+ , : {token, {',', TokenLine}}. Then we need to change the following lines in the parser:
+ exprs -&gt; expr : ['$1']. exprs -&gt; expr exprs : ['$1' | '$2']. And add a comma between the expressions on the second line:</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/xerl-0.4-expression-separator/">Read More</a>
@@ -289,7 +314,8 @@
</p>
</header>
- <p>I would like to share some experience and theories on Erlang scalability. This will be in the form of a series of hints, which may or may not be accompanied with explanations as to why things are this way, or how they improve or reduce the scalability of a system. I will try to do my best to avoid giving falsehoods, even if that means a few things won&#8217;t be explained.</p>
+ <p>I would like to share some experience and theories on Erlang scalability.
+ This will be in the form of a series of hints, which may or may not be accompanied with explanations as to why things are this way, or how they improve or reduce the scalability of a system. I will try to do my best to avoid giving falsehoods, even if that means a few things won&#8217;t be explained.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/erlang-scalability/">Read More</a>
@@ -305,7 +331,9 @@
</p>
</header>
- <p>We will be adding atomic integer expressions to our language. These look as follow in Erlang: 42. And the result of this expression is of course 42. We will be running this expression at compile time, since we don&#8217;t have the means to run code at runtime yet. This will of course result in no module being compiled, but that&#8217;s OK, it will allow us to discuss a few important things we&#8217;ll have to plan for later on.</p>
+ <p>We will be adding atomic integer expressions to our language. These look as follow in Erlang:
+ 42. And the result of this expression is of course 42.
+ We will be running this expression at compile time, since we don&#8217;t have the means to run code at runtime yet. This will of course result in no module being compiled, but that&#8217;s OK, it will allow us to discuss a few important things we&#8217;ll have to plan for later on.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/xerl-0.3-atomic-expressions/">Read More</a>
@@ -321,7 +349,11 @@
</p>
</header>
- <p>Everything is an expression. This sentence carries profound meaning. We will invoke it many times over the course of these articles. If everything is an expression, then the language shouldn&#8217;t have any problem with me defining two modules in the same source file. mod first_module begin end mod second_module begin end Likewise, it shouldn&#8217;t have any problem with me defining a module inside another module. mod out_module begin mod in_module begin end end Of course, in the context of the Erlang VM, these two snippets are equivalent; there is nothing preventing you from calling the in_module module from any other module.</p>
+ <p>Everything is an expression.
+ This sentence carries profound meaning. We will invoke it many times over the course of these articles.
+ If everything is an expression, then the language shouldn&#8217;t have any problem with me defining two modules in the same source file.
+ mod first_module begin end mod second_module begin end Likewise, it shouldn&#8217;t have any problem with me defining a module inside another module.
+ mod out_module begin mod in_module begin end end Of course, in the context of the Erlang VM, these two snippets are equivalent; there is nothing preventing you from calling the in_module module from any other module.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/xerl-0.2-two-modules/">Read More</a>
@@ -337,7 +369,9 @@
</p>
</header>
- <p>Let&#8217;s build a programming language. I call it Xerl: eXtended ERLang. It&#8217;ll be an occasion for us to learn a few things, especially me. Unlike in Erlang, in this language, everything is an expression. This means that modules and functions are expression, and indeed that you can have more than one module per file. We are just starting, so let&#8217;s no go ahead of ourselves here. We&#8217;ll begin with writing the code allowing us to compile an empty module.</p>
+ <p>Let&#8217;s build a programming language. I call it Xerl: eXtended ERLang. It&#8217;ll be an occasion for us to learn a few things, especially me.
+ Unlike in Erlang, in this language, everything is an expression. This means that modules and functions are expression, and indeed that you can have more than one module per file.
+ We are just starting, so let&#8217;s no go ahead of ourselves here. We&#8217;ll begin with writing the code allowing us to compile an empty module.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/xerl-0.1-empty-modules/">Read More</a>
@@ -353,7 +387,8 @@
</p>
</header>
- <p>Last week I was speaking at the London Erlang Factory Lite where I presented a live demonstration of building an FTP server using Ranch. As there was no slide, you should use this article as a reference instead. The goal of this article is to showcase how to use Ranch for writing a network protocol implementation, how Ranch gets out of the way to let you write the code that matters, and the common techniques used when writing servers.</p>
+ <p>Last week I was speaking at the London Erlang Factory Lite where I presented a live demonstration of building an FTP server using Ranch. As there was no slide, you should use this article as a reference instead.
+ The goal of this article is to showcase how to use Ranch for writing a network protocol implementation, how Ranch gets out of the way to let you write the code that matters, and the common techniques used when writing servers.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/ranch-ftp/">Read More</a>
@@ -369,7 +404,10 @@
</p>
</header>
- <p>Everyone knows Tic Tac Toe, right? Players choose either to be the Xs or the Os, then place their symbol on a 3x3 board one after another, trying to create a line of 3 of them. Writing an algorithm to check for victory sounds easy, right? It&#8217;s easily tested, considering there&#8217;s only 8 possible winning rows (3 horizontal, 3 vertical and 2 diagonal). In Erlang though, you probably wouldn&#8217;t want an algorithm.</p>
+ <p>Everyone knows Tic Tac Toe, right?
+ Players choose either to be the Xs or the Os, then place their symbol on a 3x3 board one after another, trying to create a line of 3 of them.
+ Writing an algorithm to check for victory sounds easy, right? It&#8217;s easily tested, considering there&#8217;s only 8 possible winning rows (3 horizontal, 3 vertical and 2 diagonal).
+ In Erlang though, you probably wouldn&#8217;t want an algorithm.</p>
<p style="text-align:right">
<a class="read_more" href="https://ninenines.eu/articles/tictactoe/">Read More</a>
diff --git a/articles/index.xml b/articles/index.xml
index 62988455..794de53c 100644
--- a/articles/index.xml
+++ b/articles/index.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
- <title>Articles on Nine Nines</title>
- <link>https://ninenines.eu/articles/</link>
- <description>Recent content in Articles on Nine Nines</description>
+ <title>Articles-rsses on Nine Nines</title>
+ <link>https://ninenines.eu/articles/index.xml</link>
+ <description>Recent content in Articles-rsses on Nine Nines</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<lastBuildDate>Mon, 29 Aug 2016 00:00:00 +0100</lastBuildDate>
@@ -205,8 +205,8 @@ change in the way the code validates UTF-8 data&lt;/a&gt;
&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;When looking into why the permessage-deflate tests
in autobahntestsuite were taking such a long time, I
found that autobahn is using an adaptation of the
-algorithm named &amp;lt;a href=&#34;http://bjoern.hoehrmann.de/utf-8/decoder/dfa/&#34;&amp;gt;Flexible
-and Economical UTF-8 Decoder&amp;lt;/a&amp;gt;. This is the C99
+algorithm named &lt;a href=&#34;http://bjoern.hoehrmann.de/utf-8/decoder/dfa/&#34;&gt;Flexible
+and Economical UTF-8 Decoder&lt;/a&gt;. This is the C99
implementation:&lt;/p&gt;&lt;/div&gt;
&lt;div class=&#34;listingblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
diff --git a/articles/january-2014-status/index.html b/articles/january-2014-status/index.html
index 4dadce99..c4cc9ec8 100644
--- a/articles/january-2014-status/index.html
+++ b/articles/january-2014-status/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: January 2014 status</title>
diff --git a/articles/ml-archives/index.html b/articles/ml-archives/index.html
index c8203771..9023fb6b 100644
--- a/articles/ml-archives/index.html
+++ b/articles/ml-archives/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Mailing list archived</title>
diff --git a/articles/on-open-source/index.html b/articles/on-open-source/index.html
index 86ed11d7..80e436cf 100644
--- a/articles/on-open-source/index.html
+++ b/articles/on-open-source/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: On open source</title>
diff --git a/articles/page/1/index.html b/articles/page/1/index.html
index a8708041..0e547dc4 100644
--- a/articles/page/1/index.html
+++ b/articles/page/1/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/articles/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/articles/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/articles/</title><link rel="canonical" href="https://ninenines.eu/articles/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/articles/" /></head></html> \ No newline at end of file
diff --git a/articles/ranch-ftp/index.html b/articles/ranch-ftp/index.html
index 226e07e4..669c9e65 100644
--- a/articles/ranch-ftp/index.html
+++ b/articles/ranch-ftp/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Build an FTP Server with Ranch in 30 Minutes</title>
@@ -264,7 +264,7 @@ http://www.gnu.org/software/src-highlite -->
<span style="color: #009900">Buffer2</span> <span style="color: #990000">=</span> <span style="color: #990000">&lt;&lt;</span> <span style="color: #009900">Buffer</span><span style="color: #990000">/</span><span style="font-weight: bold"><span style="color: #000080">binary</span></span>, <span style="color: #009900">Data</span><span style="color: #990000">/</span><span style="font-weight: bold"><span style="color: #000080">binary</span></span> <span style="color: #990000">&gt;&gt;</span>,
{<span style="color: #009900">Commands</span>, <span style="color: #009900">Rest</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">split</span></span>(<span style="color: #009900">Buffer2</span>),
[<span style="font-weight: bold"><span style="color: #000000">handle</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>, <span style="color: #009900">C</span>) || <span style="color: #009900">C</span> <span style="color: #990000">&lt;-</span> <span style="color: #009900">Commands</span>],
- <span style="font-weight: bold"><span style="color: #000000">loop</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>);
+ <span style="font-weight: bold"><span style="color: #000000">loop</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>, <span style="color: #009900">Rest</span>);
{<span style="color: #FF6600">error</span>, <span style="color: #990000">_</span>} <span style="color: #990000">-&gt;</span>
<span style="font-weight: bold"><span style="color: #000000">io:format</span></span>(<span style="color: #FF0000">"The client disconnected~n"</span>)
<span style="font-weight: bold"><span style="color: #0000FF">end</span></span><span style="color: #990000">.</span></tt></pre></div></div>
diff --git a/articles/the-story-so-far/index.html b/articles/the-story-so-far/index.html
index 7b3a2451..1a3f8d83 100644
--- a/articles/the-story-so-far/index.html
+++ b/articles/the-story-so-far/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: The story so far</title>
diff --git a/articles/tictactoe/index.html b/articles/tictactoe/index.html
index 416050b0..c03838b1 100644
--- a/articles/tictactoe/index.html
+++ b/articles/tictactoe/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Erlang Tic Tac Toe</title>
diff --git a/articles/website-update/index.html b/articles/website-update/index.html
index 486a2b8f..8662b475 100644
--- a/articles/website-update/index.html
+++ b/articles/website-update/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Website update</title>
diff --git a/articles/xerl-0.1-empty-modules/index.html b/articles/xerl-0.1-empty-modules/index.html
index 0fac4a40..9a88a351 100644
--- a/articles/xerl-0.1-empty-modules/index.html
+++ b/articles/xerl-0.1-empty-modules/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Xerl: empty modules</title>
diff --git a/articles/xerl-0.2-two-modules/index.html b/articles/xerl-0.2-two-modules/index.html
index 44d60915..9f754929 100644
--- a/articles/xerl-0.2-two-modules/index.html
+++ b/articles/xerl-0.2-two-modules/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Xerl: two modules</title>
diff --git a/articles/xerl-0.3-atomic-expressions/index.html b/articles/xerl-0.3-atomic-expressions/index.html
index 40f3250e..456b34ad 100644
--- a/articles/xerl-0.3-atomic-expressions/index.html
+++ b/articles/xerl-0.3-atomic-expressions/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Xerl: atomic expressions</title>
diff --git a/articles/xerl-0.4-expression-separator/index.html b/articles/xerl-0.4-expression-separator/index.html
index 19eae3f2..404c8d70 100644
--- a/articles/xerl-0.4-expression-separator/index.html
+++ b/articles/xerl-0.4-expression-separator/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Xerl: expression separator</title>
diff --git a/articles/xerl-0.5-intermediate-module/index.html b/articles/xerl-0.5-intermediate-module/index.html
index d35d333a..9381796f 100644
--- a/articles/xerl-0.5-intermediate-module/index.html
+++ b/articles/xerl-0.5-intermediate-module/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Xerl: intermediate module</title>
diff --git a/categories/index.html b/categories/index.html
index f6690448..b5bb69f9 100644
--- a/categories/index.html
+++ b/categories/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Categories</title>
diff --git a/docs/en/cowboy/1.0/index.html b/docs/en/cowboy/1.0/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/cowboy/1.0/index.html
+++ b/docs/en/cowboy/1.0/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/cowboy/2.0/guide/architecture/index.html b/docs/en/cowboy/2.0/guide/architecture/index.html
index 0b3f8cb7..67a10e88 100644
--- a/docs/en/cowboy/2.0/guide/architecture/index.html
+++ b/docs/en/cowboy/2.0/guide/architecture/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Architecture</title>
diff --git a/docs/en/cowboy/2.0/guide/broken_clients/index.html b/docs/en/cowboy/2.0/guide/broken_clients/index.html
index 3860e51e..331dc36c 100644
--- a/docs/en/cowboy/2.0/guide/broken_clients/index.html
+++ b/docs/en/cowboy/2.0/guide/broken_clients/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Dealing with broken clients</title>
diff --git a/docs/en/cowboy/2.0/guide/constraints/index.html b/docs/en/cowboy/2.0/guide/constraints/index.html
index 10a80953..edfc51c9 100644
--- a/docs/en/cowboy/2.0/guide/constraints/index.html
+++ b/docs/en/cowboy/2.0/guide/constraints/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Constraints</title>
diff --git a/docs/en/cowboy/2.0/guide/cookies/index.html b/docs/en/cowboy/2.0/guide/cookies/index.html
index 2ea3e430..bac2c244 100644
--- a/docs/en/cowboy/2.0/guide/cookies/index.html
+++ b/docs/en/cowboy/2.0/guide/cookies/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Using cookies</title>
diff --git a/docs/en/cowboy/2.0/guide/erlang_web/index.html b/docs/en/cowboy/2.0/guide/erlang_web/index.html
index bd578340..b7f926c1 100644
--- a/docs/en/cowboy/2.0/guide/erlang_web/index.html
+++ b/docs/en/cowboy/2.0/guide/erlang_web/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Erlang and the Web</title>
diff --git a/docs/en/cowboy/2.0/guide/flow_diagram/index.html b/docs/en/cowboy/2.0/guide/flow_diagram/index.html
index 7ec5684f..25f2b799 100644
--- a/docs/en/cowboy/2.0/guide/flow_diagram/index.html
+++ b/docs/en/cowboy/2.0/guide/flow_diagram/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Flow diagram</title>
diff --git a/docs/en/cowboy/2.0/guide/getting_started/index.html b/docs/en/cowboy/2.0/guide/getting_started/index.html
index 03e1dea7..cbfd7b58 100644
--- a/docs/en/cowboy/2.0/guide/getting_started/index.html
+++ b/docs/en/cowboy/2.0/guide/getting_started/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Getting started</title>
diff --git a/docs/en/cowboy/2.0/guide/handlers/index.html b/docs/en/cowboy/2.0/guide/handlers/index.html
index b68527d9..a9d21a16 100644
--- a/docs/en/cowboy/2.0/guide/handlers/index.html
+++ b/docs/en/cowboy/2.0/guide/handlers/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Handlers</title>
diff --git a/docs/en/cowboy/2.0/guide/hooks/index.html b/docs/en/cowboy/2.0/guide/hooks/index.html
index 00cf2d9e..7f3252a2 100644
--- a/docs/en/cowboy/2.0/guide/hooks/index.html
+++ b/docs/en/cowboy/2.0/guide/hooks/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Hooks</title>
diff --git a/docs/en/cowboy/2.0/guide/index.html b/docs/en/cowboy/2.0/guide/index.html
index 0d0a92e5..d07f9ba6 100644
--- a/docs/en/cowboy/2.0/guide/index.html
+++ b/docs/en/cowboy/2.0/guide/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Cowboy User Guide</title>
diff --git a/docs/en/cowboy/2.0/guide/introduction/index.html b/docs/en/cowboy/2.0/guide/introduction/index.html
index 8aff6c8c..5ab7823f 100644
--- a/docs/en/cowboy/2.0/guide/introduction/index.html
+++ b/docs/en/cowboy/2.0/guide/introduction/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Introduction</title>
diff --git a/docs/en/cowboy/2.0/guide/listeners/index.html b/docs/en/cowboy/2.0/guide/listeners/index.html
index 40f1f1a3..8dc05c30 100644
--- a/docs/en/cowboy/2.0/guide/listeners/index.html
+++ b/docs/en/cowboy/2.0/guide/listeners/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Listeners</title>
diff --git a/docs/en/cowboy/2.0/guide/loop_handlers/index.html b/docs/en/cowboy/2.0/guide/loop_handlers/index.html
index 5445f1cf..64dc4b31 100644
--- a/docs/en/cowboy/2.0/guide/loop_handlers/index.html
+++ b/docs/en/cowboy/2.0/guide/loop_handlers/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Loop handlers</title>
diff --git a/docs/en/cowboy/2.0/guide/middlewares/index.html b/docs/en/cowboy/2.0/guide/middlewares/index.html
index 0bf012b3..53a751d1 100644
--- a/docs/en/cowboy/2.0/guide/middlewares/index.html
+++ b/docs/en/cowboy/2.0/guide/middlewares/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Middlewares</title>
diff --git a/docs/en/cowboy/2.0/guide/modern_web/index.html b/docs/en/cowboy/2.0/guide/modern_web/index.html
index 7067288b..8fd8163a 100644
--- a/docs/en/cowboy/2.0/guide/modern_web/index.html
+++ b/docs/en/cowboy/2.0/guide/modern_web/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: The modern Web</title>
diff --git a/docs/en/cowboy/2.0/guide/multipart/index.html b/docs/en/cowboy/2.0/guide/multipart/index.html
index 76ab89c1..e16dc5a9 100644
--- a/docs/en/cowboy/2.0/guide/multipart/index.html
+++ b/docs/en/cowboy/2.0/guide/multipart/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Multipart requests</title>
diff --git a/docs/en/cowboy/2.0/guide/overview/index.html b/docs/en/cowboy/2.0/guide/overview/index.html
index 3d40ee48..365bd2e8 100644
--- a/docs/en/cowboy/2.0/guide/overview/index.html
+++ b/docs/en/cowboy/2.0/guide/overview/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Request overview</title>
diff --git a/docs/en/cowboy/2.0/guide/req/index.html b/docs/en/cowboy/2.0/guide/req/index.html
index 5ba6b035..80960092 100644
--- a/docs/en/cowboy/2.0/guide/req/index.html
+++ b/docs/en/cowboy/2.0/guide/req/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: The Req object</title>
diff --git a/docs/en/cowboy/2.0/guide/req_body/index.html b/docs/en/cowboy/2.0/guide/req_body/index.html
index 139712a1..33502cae 100644
--- a/docs/en/cowboy/2.0/guide/req_body/index.html
+++ b/docs/en/cowboy/2.0/guide/req_body/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Reading the request body</title>
diff --git a/docs/en/cowboy/2.0/guide/resource_design/index.html b/docs/en/cowboy/2.0/guide/resource_design/index.html
index bc37e2a4..895f22b3 100644
--- a/docs/en/cowboy/2.0/guide/resource_design/index.html
+++ b/docs/en/cowboy/2.0/guide/resource_design/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Designing a resource handler</title>
diff --git a/docs/en/cowboy/2.0/guide/resp/index.html b/docs/en/cowboy/2.0/guide/resp/index.html
index 6bf3cd8e..b2dbb622 100644
--- a/docs/en/cowboy/2.0/guide/resp/index.html
+++ b/docs/en/cowboy/2.0/guide/resp/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Sending a response</title>
diff --git a/docs/en/cowboy/2.0/guide/rest_flowcharts/index.html b/docs/en/cowboy/2.0/guide/rest_flowcharts/index.html
index 77af893e..8e737143 100644
--- a/docs/en/cowboy/2.0/guide/rest_flowcharts/index.html
+++ b/docs/en/cowboy/2.0/guide/rest_flowcharts/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: REST flowcharts</title>
diff --git a/docs/en/cowboy/2.0/guide/rest_handlers/index.html b/docs/en/cowboy/2.0/guide/rest_handlers/index.html
index 2f656c70..a0691398 100644
--- a/docs/en/cowboy/2.0/guide/rest_handlers/index.html
+++ b/docs/en/cowboy/2.0/guide/rest_handlers/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: REST handlers</title>
diff --git a/docs/en/cowboy/2.0/guide/rest_principles/index.html b/docs/en/cowboy/2.0/guide/rest_principles/index.html
index a78b08ef..070ee688 100644
--- a/docs/en/cowboy/2.0/guide/rest_principles/index.html
+++ b/docs/en/cowboy/2.0/guide/rest_principles/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: REST principles</title>
diff --git a/docs/en/cowboy/2.0/guide/routing/index.html b/docs/en/cowboy/2.0/guide/routing/index.html
index ab7fe6a7..87bb766f 100644
--- a/docs/en/cowboy/2.0/guide/routing/index.html
+++ b/docs/en/cowboy/2.0/guide/routing/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Routing</title>
diff --git a/docs/en/cowboy/2.0/guide/static_files/index.html b/docs/en/cowboy/2.0/guide/static_files/index.html
index 49a93eff..5b924da7 100644
--- a/docs/en/cowboy/2.0/guide/static_files/index.html
+++ b/docs/en/cowboy/2.0/guide/static_files/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Static files</title>
diff --git a/docs/en/cowboy/2.0/guide/sub_protocols/index.html b/docs/en/cowboy/2.0/guide/sub_protocols/index.html
index d2437876..6293bc08 100644
--- a/docs/en/cowboy/2.0/guide/sub_protocols/index.html
+++ b/docs/en/cowboy/2.0/guide/sub_protocols/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Sub protocols</title>
diff --git a/docs/en/cowboy/2.0/guide/ws_handlers/index.html b/docs/en/cowboy/2.0/guide/ws_handlers/index.html
index b8bf8d33..5e484272 100644
--- a/docs/en/cowboy/2.0/guide/ws_handlers/index.html
+++ b/docs/en/cowboy/2.0/guide/ws_handlers/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Websocket handlers</title>
diff --git a/docs/en/cowboy/2.0/guide/ws_protocol/index.html b/docs/en/cowboy/2.0/guide/ws_protocol/index.html
index 8d4d35e9..3525de69 100644
--- a/docs/en/cowboy/2.0/guide/ws_protocol/index.html
+++ b/docs/en/cowboy/2.0/guide/ws_protocol/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: The Websocket protocol</title>
diff --git a/docs/en/cowboy/2.0/index.html b/docs/en/cowboy/2.0/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/cowboy/2.0/index.html
+++ b/docs/en/cowboy/2.0/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/cowboy/2.0/manual/cowboy.set_env/index.html b/docs/en/cowboy/2.0/manual/cowboy.set_env/index.html
index ea6c5a1c..d1302c35 100644
--- a/docs/en/cowboy/2.0/manual/cowboy.set_env/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy.set_env/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy:set_env(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy.start_clear/index.html b/docs/en/cowboy/2.0/manual/cowboy.start_clear/index.html
index 239b36c0..0d01dce8 100644
--- a/docs/en/cowboy/2.0/manual/cowboy.start_clear/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy.start_clear/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy:start_clear(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy.start_tls/index.html b/docs/en/cowboy/2.0/manual/cowboy.start_tls/index.html
index c31bbcc6..888895d7 100644
--- a/docs/en/cowboy/2.0/manual/cowboy.start_tls/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy.start_tls/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy:start_tls(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy.stop_listener/index.html b/docs/en/cowboy/2.0/manual/cowboy.stop_listener/index.html
index 832f9362..5da3b2be 100644
--- a/docs/en/cowboy/2.0/manual/cowboy.stop_listener/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy.stop_listener/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy:stop_listener(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy/index.html b/docs/en/cowboy/2.0/manual/cowboy/index.html
index 2d8b5978..0bb23f2b 100644
--- a/docs/en/cowboy/2.0/manual/cowboy/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_app/index.html b/docs/en/cowboy/2.0/manual/cowboy_app/index.html
index a251adc8..a0d35316 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_app/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_app/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy(7)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_handler/index.html b/docs/en/cowboy/2.0/manual/cowboy_handler/index.html
index ba64c876..73b7738e 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_handler/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_handler/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_handler(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_loop/index.html b/docs/en/cowboy/2.0/manual/cowboy_loop/index.html
index df16397a..e5d69511 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_loop/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_loop/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_loop(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_middleware/index.html b/docs/en/cowboy/2.0/manual/cowboy_middleware/index.html
index 20e6731c..ebc7ba07 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_middleware/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_middleware/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_middleware(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_protocol/index.html b/docs/en/cowboy/2.0/manual/cowboy_protocol/index.html
index bfe03a1f..e934d308 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_protocol/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_protocol/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_protocol(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.binding/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.binding/index.html
index 97c35cca..948f8133 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.binding/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.binding/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:binding(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.bindings/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.bindings/index.html
index 04d058a3..65c3435a 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.bindings/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.bindings/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:bindings(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.header/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.header/index.html
index 06a441a5..241f4172 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.header/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.header/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:header(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.headers/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.headers/index.html
index f601d1ef..72edc169 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.headers/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.headers/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:headers(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.host/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.host/index.html
index 8a0f4bd8..f9536bab 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.host/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.host/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:host(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.host_info/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.host_info/index.html
index 995831fa..3b4ceb51 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.host_info/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.host_info/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:host_info(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.match_cookies/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.match_cookies/index.html
index f0b3fb86..5c6f5ce8 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.match_cookies/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.match_cookies/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:match_cookies(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.match_qs/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.match_qs/index.html
index 592d69df..885859b7 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.match_qs/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.match_qs/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:match_qs(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.method/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.method/index.html
index 0d9b2b5f..e95aa546 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.method/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.method/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:method(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.parse_cookies/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.parse_cookies/index.html
index 1b34f7f6..10154a52 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.parse_cookies/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.parse_cookies/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:parse_cookies(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.parse_header/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.parse_header/index.html
index f2973e68..a49eda43 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.parse_header/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.parse_header/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:parse_header(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.parse_qs/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.parse_qs/index.html
index 7e091405..6608047c 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.parse_qs/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.parse_qs/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:parse_qs(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.path/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.path/index.html
index bedb39cc..b5969bdf 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.path/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.path/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:path(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.path_info/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.path_info/index.html
index 9cb02a02..d136a852 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.path_info/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.path_info/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:path_info(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.peer/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.peer/index.html
index 79ace331..a225ea10 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.peer/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.peer/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:peer(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.port/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.port/index.html
index 0457d82b..75d4d52a 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.port/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.port/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:port(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.qs/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.qs/index.html
index 5ac89c60..ab58d986 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.qs/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.qs/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:qs(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.scheme/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.scheme/index.html
index 3f38c9c1..3d84e0b7 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.scheme/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.scheme/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:scheme(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.uri/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.uri/index.html
index ae15f9b1..02eb12ec 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.uri/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.uri/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:uri(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req.version/index.html b/docs/en/cowboy/2.0/manual/cowboy_req.version/index.html
index d44ed468..2a1705bf 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req.version/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req.version/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req:version(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_req/index.html b/docs/en/cowboy/2.0/manual/cowboy_req/index.html
index cc425f2b..514a6179 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_req/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_req/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_req(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_rest/index.html b/docs/en/cowboy/2.0/manual/cowboy_rest/index.html
index 12ed4c05..48fcec78 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_rest/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_rest/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_rest(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_router/index.html b/docs/en/cowboy/2.0/manual/cowboy_router/index.html
index 850d81a0..2f4186f3 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_router/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_router/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_router(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_static/index.html b/docs/en/cowboy/2.0/manual/cowboy_static/index.html
index 0b4ad099..90d20fdb 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_static/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_static/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_static(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_sub_protocol/index.html b/docs/en/cowboy/2.0/manual/cowboy_sub_protocol/index.html
index b897cac4..8a76b50d 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_sub_protocol/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_sub_protocol/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_sub_protocol(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/cowboy_websocket/index.html b/docs/en/cowboy/2.0/manual/cowboy_websocket/index.html
index 5802a5d8..8274fbf8 100644
--- a/docs/en/cowboy/2.0/manual/cowboy_websocket/index.html
+++ b/docs/en/cowboy/2.0/manual/cowboy_websocket/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: cowboy_websocket(3)</title>
diff --git a/docs/en/cowboy/2.0/manual/http_status_codes/index.html b/docs/en/cowboy/2.0/manual/http_status_codes/index.html
index d2f7ac55..c07963e8 100644
--- a/docs/en/cowboy/2.0/manual/http_status_codes/index.html
+++ b/docs/en/cowboy/2.0/manual/http_status_codes/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: HTTP status codes(7)</title>
diff --git a/docs/en/cowboy/2.0/manual/index.html b/docs/en/cowboy/2.0/manual/index.html
index 4d74dfa5..ec5c63e0 100644
--- a/docs/en/cowboy/2.0/manual/index.html
+++ b/docs/en/cowboy/2.0/manual/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Cowboy Function Reference</title>
diff --git a/docs/en/cowboy/HEAD/guide/index.html b/docs/en/cowboy/HEAD/guide/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/cowboy/HEAD/guide/index.html
+++ b/docs/en/cowboy/HEAD/guide/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/cowboy/HEAD/index.html b/docs/en/cowboy/HEAD/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/cowboy/HEAD/index.html
+++ b/docs/en/cowboy/HEAD/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/cowboy/HEAD/manual/index.html b/docs/en/cowboy/HEAD/manual/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/cowboy/HEAD/manual/index.html
+++ b/docs/en/cowboy/HEAD/manual/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/cowboy/index.html b/docs/en/cowboy/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/cowboy/index.html
+++ b/docs/en/cowboy/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/erlang.mk/1/guide/app/index.html b/docs/en/erlang.mk/1/guide/app/index.html
index 6131b394..b6fbf4f7 100644
--- a/docs/en/erlang.mk/1/guide/app/index.html
+++ b/docs/en/erlang.mk/1/guide/app/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Building</title>
diff --git a/docs/en/erlang.mk/1/guide/asciidoc/index.html b/docs/en/erlang.mk/1/guide/asciidoc/index.html
index 98f19d51..9cb17dba 100644
--- a/docs/en/erlang.mk/1/guide/asciidoc/index.html
+++ b/docs/en/erlang.mk/1/guide/asciidoc/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: AsciiDoc documentation</title>
diff --git a/docs/en/erlang.mk/1/guide/ci/index.html b/docs/en/erlang.mk/1/guide/ci/index.html
index 5f1fc30c..a7050ae7 100644
--- a/docs/en/erlang.mk/1/guide/ci/index.html
+++ b/docs/en/erlang.mk/1/guide/ci/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Continuous integration</title>
diff --git a/docs/en/erlang.mk/1/guide/common_test.asciidoc b/docs/en/erlang.mk/1/guide/common_test.asciidoc
index aec8747e..f8f0de3d 100644
--- a/docs/en/erlang.mk/1/guide/common_test.asciidoc
+++ b/docs/en/erlang.mk/1/guide/common_test.asciidoc
@@ -35,6 +35,12 @@ is `http`:
[source,make]
CT_SUITES = http ws
+The `CT_LOGS_DIR` variable can be used to set where HTML
+log files are to be written. This defaults to 'logs/'.
+
+[source,make]
+CT_LOGS_DIR = ct_output_log_dir
+
=== Usage
To run all tests (including Common Test):
diff --git a/docs/en/erlang.mk/1/guide/common_test/index.html b/docs/en/erlang.mk/1/guide/common_test/index.html
index 56de0f4c..a1b12f81 100644
--- a/docs/en/erlang.mk/1/guide/common_test/index.html
+++ b/docs/en/erlang.mk/1/guide/common_test/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Common Test</title>
@@ -100,6 +100,10 @@ If the file is named <em>http_SUITE.erl</em>, the test suite
is <code>http</code>:</p></div>
<div class="listingblock">
<div class="content"></div></div>
+<div class="paragraph"><p>The <code>CT_LOGS_DIR</code> variable can be used to set where HTML
+log files are to be written. This defaults to <em>logs/</em>.</p></div>
+<div class="listingblock">
+<div class="content"></div></div>
</div>
</div>
<div class="sect1">
diff --git a/docs/en/erlang.mk/1/guide/compat/index.html b/docs/en/erlang.mk/1/guide/compat/index.html
index c46daeff..a84bd3cc 100644
--- a/docs/en/erlang.mk/1/guide/compat/index.html
+++ b/docs/en/erlang.mk/1/guide/compat/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Compatibility with other build tools</title>
diff --git a/docs/en/erlang.mk/1/guide/contributing/index.html b/docs/en/erlang.mk/1/guide/contributing/index.html
index f735cbc6..3175a7c9 100644
--- a/docs/en/erlang.mk/1/guide/contributing/index.html
+++ b/docs/en/erlang.mk/1/guide/contributing/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Contributing</title>
diff --git a/docs/en/erlang.mk/1/guide/coverage/index.html b/docs/en/erlang.mk/1/guide/coverage/index.html
index 440f7abf..8e07138b 100644
--- a/docs/en/erlang.mk/1/guide/coverage/index.html
+++ b/docs/en/erlang.mk/1/guide/coverage/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Code coverage</title>
diff --git a/docs/en/erlang.mk/1/guide/deps/index.html b/docs/en/erlang.mk/1/guide/deps/index.html
index cc8d737d..e551a607 100644
--- a/docs/en/erlang.mk/1/guide/deps/index.html
+++ b/docs/en/erlang.mk/1/guide/deps/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Packages and dependencies</title>
diff --git a/docs/en/erlang.mk/1/guide/dialyzer/index.html b/docs/en/erlang.mk/1/guide/dialyzer/index.html
index 454d176e..3fb9d47d 100644
--- a/docs/en/erlang.mk/1/guide/dialyzer/index.html
+++ b/docs/en/erlang.mk/1/guide/dialyzer/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Dialyzer</title>
diff --git a/docs/en/erlang.mk/1/guide/edoc/index.html b/docs/en/erlang.mk/1/guide/edoc/index.html
index 6e8ed6f8..52eb84ef 100644
--- a/docs/en/erlang.mk/1/guide/edoc/index.html
+++ b/docs/en/erlang.mk/1/guide/edoc/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: EDoc comments</title>
diff --git a/docs/en/erlang.mk/1/guide/escripts/index.html b/docs/en/erlang.mk/1/guide/escripts/index.html
index f3ba738f..88e0320e 100644
--- a/docs/en/erlang.mk/1/guide/escripts/index.html
+++ b/docs/en/erlang.mk/1/guide/escripts/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Escripts</title>
diff --git a/docs/en/erlang.mk/1/guide/eunit/index.html b/docs/en/erlang.mk/1/guide/eunit/index.html
index f0a9f4d4..f53290fe 100644
--- a/docs/en/erlang.mk/1/guide/eunit/index.html
+++ b/docs/en/erlang.mk/1/guide/eunit/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: EUnit</title>
diff --git a/docs/en/erlang.mk/1/guide/external_plugins/index.html b/docs/en/erlang.mk/1/guide/external_plugins/index.html
index 735e4820..c91f5198 100644
--- a/docs/en/erlang.mk/1/guide/external_plugins/index.html
+++ b/docs/en/erlang.mk/1/guide/external_plugins/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: External plugins</title>
diff --git a/docs/en/erlang.mk/1/guide/external_plugins_list/index.html b/docs/en/erlang.mk/1/guide/external_plugins_list/index.html
index 9b26460d..0aa40b1e 100644
--- a/docs/en/erlang.mk/1/guide/external_plugins_list/index.html
+++ b/docs/en/erlang.mk/1/guide/external_plugins_list/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: List of plugins</title>
diff --git a/docs/en/erlang.mk/1/guide/getting_started/index.html b/docs/en/erlang.mk/1/guide/getting_started/index.html
index 10bc1ab3..fc30a227 100644
--- a/docs/en/erlang.mk/1/guide/getting_started/index.html
+++ b/docs/en/erlang.mk/1/guide/getting_started/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Getting started</title>
diff --git a/docs/en/erlang.mk/1/guide/history/index.html b/docs/en/erlang.mk/1/guide/history/index.html
index 37125ee4..54c3e9da 100644
--- a/docs/en/erlang.mk/1/guide/history/index.html
+++ b/docs/en/erlang.mk/1/guide/history/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Short history</title>
diff --git a/docs/en/erlang.mk/1/guide/index.html b/docs/en/erlang.mk/1/guide/index.html
index dd2d6927..59ada5e4 100644
--- a/docs/en/erlang.mk/1/guide/index.html
+++ b/docs/en/erlang.mk/1/guide/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Erlang.mk User Guide</title>
diff --git a/docs/en/erlang.mk/1/guide/installation/index.html b/docs/en/erlang.mk/1/guide/installation/index.html
index 2d711d0f..f9e33c18 100644
--- a/docs/en/erlang.mk/1/guide/installation/index.html
+++ b/docs/en/erlang.mk/1/guide/installation/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Installation</title>
diff --git a/docs/en/erlang.mk/1/guide/limitations/index.html b/docs/en/erlang.mk/1/guide/limitations/index.html
index 8b88d8ae..27f69b3b 100644
--- a/docs/en/erlang.mk/1/guide/limitations/index.html
+++ b/docs/en/erlang.mk/1/guide/limitations/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Limitations</title>
diff --git a/docs/en/erlang.mk/1/guide/overview/index.html b/docs/en/erlang.mk/1/guide/overview/index.html
index 8c838898..95bcb794 100644
--- a/docs/en/erlang.mk/1/guide/overview/index.html
+++ b/docs/en/erlang.mk/1/guide/overview/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Overview</title>
diff --git a/docs/en/erlang.mk/1/guide/ports/index.html b/docs/en/erlang.mk/1/guide/ports/index.html
index 83ad5dd4..f6e71a7a 100644
--- a/docs/en/erlang.mk/1/guide/ports/index.html
+++ b/docs/en/erlang.mk/1/guide/ports/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: NIFs and port drivers</title>
diff --git a/docs/en/erlang.mk/1/guide/releases/index.html b/docs/en/erlang.mk/1/guide/releases/index.html
index fc98819e..923a0d4e 100644
--- a/docs/en/erlang.mk/1/guide/releases/index.html
+++ b/docs/en/erlang.mk/1/guide/releases/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Releases</title>
diff --git a/docs/en/erlang.mk/1/guide/sfx/index.html b/docs/en/erlang.mk/1/guide/sfx/index.html
index 8433ab9c..d90cc8bf 100644
--- a/docs/en/erlang.mk/1/guide/sfx/index.html
+++ b/docs/en/erlang.mk/1/guide/sfx/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Self-extracting releases</title>
diff --git a/docs/en/erlang.mk/1/guide/shell/index.html b/docs/en/erlang.mk/1/guide/shell/index.html
index 2581a699..295caf48 100644
--- a/docs/en/erlang.mk/1/guide/shell/index.html
+++ b/docs/en/erlang.mk/1/guide/shell/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Erlang shell</title>
diff --git a/docs/en/erlang.mk/1/guide/updating/index.html b/docs/en/erlang.mk/1/guide/updating/index.html
index bf039a6d..fbb3fffc 100644
--- a/docs/en/erlang.mk/1/guide/updating/index.html
+++ b/docs/en/erlang.mk/1/guide/updating/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Updating Erlang.mk</title>
diff --git a/docs/en/erlang.mk/1/guide/why/index.html b/docs/en/erlang.mk/1/guide/why/index.html
index 8619e04a..02c57035 100644
--- a/docs/en/erlang.mk/1/guide/why/index.html
+++ b/docs/en/erlang.mk/1/guide/why/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Why Erlang.mk</title>
diff --git a/docs/en/erlang.mk/1/guide/xref/index.html b/docs/en/erlang.mk/1/guide/xref/index.html
index a65124a1..45e89ff7 100644
--- a/docs/en/erlang.mk/1/guide/xref/index.html
+++ b/docs/en/erlang.mk/1/guide/xref/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Xref</title>
diff --git a/docs/en/erlang.mk/1/index.html b/docs/en/erlang.mk/1/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/erlang.mk/1/index.html
+++ b/docs/en/erlang.mk/1/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/erlang.mk/index.html b/docs/en/erlang.mk/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/erlang.mk/index.html
+++ b/docs/en/erlang.mk/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/gun/1.0/guide/connect/index.html b/docs/en/gun/1.0/guide/connect/index.html
index aeebd80e..4ace37e6 100644
--- a/docs/en/gun/1.0/guide/connect/index.html
+++ b/docs/en/gun/1.0/guide/connect/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Connection</title>
diff --git a/docs/en/gun/1.0/guide/http/index.html b/docs/en/gun/1.0/guide/http/index.html
index fa12b51c..9b345ae1 100644
--- a/docs/en/gun/1.0/guide/http/index.html
+++ b/docs/en/gun/1.0/guide/http/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: HTTP</title>
diff --git a/docs/en/gun/1.0/guide/index.html b/docs/en/gun/1.0/guide/index.html
index 127591f6..9348953a 100644
--- a/docs/en/gun/1.0/guide/index.html
+++ b/docs/en/gun/1.0/guide/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Gun User Guide</title>
diff --git a/docs/en/gun/1.0/guide/introduction.asciidoc b/docs/en/gun/1.0/guide/introduction.asciidoc
index 81a7c7f4..2914ef62 100644
--- a/docs/en/gun/1.0/guide/introduction.asciidoc
+++ b/docs/en/gun/1.0/guide/introduction.asciidoc
@@ -26,3 +26,7 @@ to lowercase, and expects your application to provide lowercase header
names.
The same applies to any other case insensitive value.
+
+=== Versioning
+
+Gun uses [Semantic Versioning 2.0.0](http://semver.org/).
diff --git a/docs/en/gun/1.0/guide/introduction/index.html b/docs/en/gun/1.0/guide/introduction/index.html
index 010f7aef..5dfc3d5f 100644
--- a/docs/en/gun/1.0/guide/introduction/index.html
+++ b/docs/en/gun/1.0/guide/introduction/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Introduction</title>
@@ -97,6 +97,12 @@ names.</p></div>
<div class="paragraph"><p>The same applies to any other case insensitive value.</p></div>
</div>
</div>
+<div class="sect1">
+<h2 id="_versioning">Versioning</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Gun uses [Semantic Versioning 2.0.0](<a href="http://semver.org/">http://semver.org/</a>).</p></div>
+</div>
+</div>
diff --git a/docs/en/gun/1.0/guide/protocols/index.html b/docs/en/gun/1.0/guide/protocols/index.html
index d8d48a5d..f2ac3780 100644
--- a/docs/en/gun/1.0/guide/protocols/index.html
+++ b/docs/en/gun/1.0/guide/protocols/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Supported protocols</title>
diff --git a/docs/en/gun/1.0/guide/start/index.html b/docs/en/gun/1.0/guide/start/index.html
index 39992b50..2f84cfe9 100644
--- a/docs/en/gun/1.0/guide/start/index.html
+++ b/docs/en/gun/1.0/guide/start/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Starting and stopping</title>
diff --git a/docs/en/gun/1.0/guide/websocket/index.html b/docs/en/gun/1.0/guide/websocket/index.html
index bec8fb19..44ec4277 100644
--- a/docs/en/gun/1.0/guide/websocket/index.html
+++ b/docs/en/gun/1.0/guide/websocket/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Websocket</title>
diff --git a/docs/en/gun/1.0/index.html b/docs/en/gun/1.0/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/gun/1.0/index.html
+++ b/docs/en/gun/1.0/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/gun/1.0/manual/gun/index.html b/docs/en/gun/1.0/manual/gun/index.html
index 5c92823c..332b3b30 100644
--- a/docs/en/gun/1.0/manual/gun/index.html
+++ b/docs/en/gun/1.0/manual/gun/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: gun(3)</title>
diff --git a/docs/en/gun/1.0/manual/gun_app/index.html b/docs/en/gun/1.0/manual/gun_app/index.html
index ae3b83c8..6adca335 100644
--- a/docs/en/gun/1.0/manual/gun_app/index.html
+++ b/docs/en/gun/1.0/manual/gun_app/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: gun(7)</title>
diff --git a/docs/en/gun/1.0/manual/index.html b/docs/en/gun/1.0/manual/index.html
index a5789a95..8629cdb2 100644
--- a/docs/en/gun/1.0/manual/index.html
+++ b/docs/en/gun/1.0/manual/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Gun Function Reference</title>
diff --git a/docs/en/gun/index.html b/docs/en/gun/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/gun/index.html
+++ b/docs/en/gun/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/index.html b/docs/en/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/index.html
+++ b/docs/en/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/ranch/1.2/guide/embedded/index.html b/docs/en/ranch/1.2/guide/embedded/index.html
index 13418002..adb1bc81 100644
--- a/docs/en/ranch/1.2/guide/embedded/index.html
+++ b/docs/en/ranch/1.2/guide/embedded/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Embedded mode</title>
@@ -164,6 +164,8 @@ more details on how Ranch does it.</p></div>
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/guide/index.html b/docs/en/ranch/1.2/guide/index.html
index 08552458..f5b25985 100644
--- a/docs/en/ranch/1.2/guide/index.html
+++ b/docs/en/ranch/1.2/guide/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Ranch User Guide</title>
@@ -145,6 +145,8 @@
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/guide/internals/index.html b/docs/en/ranch/1.2/guide/internals/index.html
index b43eed8f..b7e0b850 100644
--- a/docs/en/ranch/1.2/guide/internals/index.html
+++ b/docs/en/ranch/1.2/guide/internals/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Internals</title>
@@ -205,6 +205,8 @@ http://www.gnu.org/software/src-highlite -->
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/guide/introduction/index.html b/docs/en/ranch/1.2/guide/introduction/index.html
index 4afe8227..6c5ae67c 100644
--- a/docs/en/ranch/1.2/guide/introduction/index.html
+++ b/docs/en/ranch/1.2/guide/introduction/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Introduction</title>
@@ -144,6 +144,8 @@ modifications but there is no guarantee that it will work as expected.</p></div>
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/guide/listeners.asciidoc b/docs/en/ranch/1.2/guide/listeners.asciidoc
index a776a584..ef2d49c7 100644
--- a/docs/en/ranch/1.2/guide/listeners.asciidoc
+++ b/docs/en/ranch/1.2/guide/listeners.asciidoc
@@ -4,7 +4,7 @@ A listener is a set of processes whose role is to listen on a port
for new connections. It manages a pool of acceptor processes, each
of them indefinitely accepting connections. When it does, it starts
a new process executing the protocol handler code. All the socket
-programming is abstracted through the use of transport handlers.
+programming is abstracted through the user of transport handlers.
The listener takes care of supervising all the acceptor and connection
processes, allowing developers to focus on building their application.
@@ -203,24 +203,6 @@ ranch:set_max_connections(tcp_echo, MaxConns).
The change will occur immediately.
-=== When running out of file descriptors
-
-Operating systems have limits on the number of sockets
-which can be opened by applications. When this maximum is
-reached the listener can no longer accept new connections. The
-accept rate of the listener will be automatically reduced, and a
-warning message will be logged.
-
-----
-=ERROR REPORT==== 13-Jan-2016::12:24:38 ===
-Ranch acceptor reducing accept rate: out of file descriptors
-----
-
-If you notice messages like this you should increase the number
-of file-descriptors which can be opened by your application. How
-this should be done is operating-system dependent. Please consult
-the documentation of your operating system.
-
=== Using a supervisor for connection processes
Ranch allows you to define the type of process that will be used
diff --git a/docs/en/ranch/1.2/guide/listeners/index.html b/docs/en/ranch/1.2/guide/listeners/index.html
index ead3c4b8..4d6ccbc0 100644
--- a/docs/en/ranch/1.2/guide/listeners/index.html
+++ b/docs/en/ranch/1.2/guide/listeners/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Listeners</title>
@@ -73,7 +73,7 @@
for new connections. It manages a pool of acceptor processes, each
of them indefinitely accepting connections. When it does, it starts
a new process executing the protocol handler code. All the socket
-programming is abstracted through the use of transport handlers.</p></div>
+programming is abstracted through the user of transport handlers.</p></div>
<div class="paragraph"><p>The listener takes care of supervising all the acceptor and connection
processes, allowing developers to focus on building their application.</p></div>
<div class="sect1">
@@ -302,25 +302,6 @@ http://www.gnu.org/software/src-highlite -->
</div>
</div>
<div class="sect1">
-<h2 id="_when_running_out_of_file_descriptors">When running out of file descriptors</h2>
-<div class="sectionbody">
-<div class="paragraph"><p>Operating systems have limits on the number of sockets
-which can be opened by applications. When this maximum is
-reached the listener can no longer accept new connections. The
-accept rate of the listener will be automatically reduced, and a
-warning message will be logged.</p></div>
-<div class="listingblock">
-<div class="content">
-<pre><code>=ERROR REPORT==== 13-Jan-2016::12:24:38 ===
-Ranch acceptor reducing accept rate: out of file descriptors</code></pre>
-</div></div>
-<div class="paragraph"><p>If you notice messages like this you should increase the number
-of file-descriptors which can be opened by your application. How
-this should be done is operating-system dependent. Please consult
-the documentation of your operating system.</p></div>
-</div>
-</div>
-<div class="sect1">
<h2 id="_using_a_supervisor_for_connection_processes">Using a supervisor for connection processes</h2>
<div class="sectionbody">
<div class="paragraph"><p>Ranch allows you to define the type of process that will be used
@@ -422,6 +403,8 @@ http://www.gnu.org/software/src-highlite -->
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/guide/parsers/index.html b/docs/en/ranch/1.2/guide/parsers/index.html
index c6a2ddab..d7849c7f 100644
--- a/docs/en/ranch/1.2/guide/parsers/index.html
+++ b/docs/en/ranch/1.2/guide/parsers/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Writing parsers</title>
@@ -225,6 +225,8 @@ immediately if any. Otherwise wait for more data.</p></div>
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/guide/protocols/index.html b/docs/en/ranch/1.2/guide/protocols/index.html
index e2f313f9..092946b2 100644
--- a/docs/en/ranch/1.2/guide/protocols/index.html
+++ b/docs/en/ranch/1.2/guide/protocols/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Protocols</title>
@@ -245,6 +245,8 @@ http://www.gnu.org/software/src-highlite -->
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/guide/ssl_auth.asciidoc b/docs/en/ranch/1.2/guide/ssl_auth.asciidoc
index de0bbaf0..39f9c3c0 100644
--- a/docs/en/ranch/1.2/guide/ssl_auth.asciidoc
+++ b/docs/en/ranch/1.2/guide/ssl_auth.asciidoc
@@ -28,7 +28,7 @@ Following are the steps you need to take to create a CAcert.org
account, generate a certificate and install it in your favorite
browser.
-* Open http://cacert.org in your favorite browser
+* Open [CAcert.org](http://cacert.org) in your favorite browser
* Root Certificate link: install both certificates
* Join (Register an account)
* Verify your account (check your email inbox!)
diff --git a/docs/en/ranch/1.2/guide/ssl_auth/index.html b/docs/en/ranch/1.2/guide/ssl_auth/index.html
index cd38f30a..463772c6 100644
--- a/docs/en/ranch/1.2/guide/ssl_auth/index.html
+++ b/docs/en/ranch/1.2/guide/ssl_auth/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: SSL client authentication</title>
@@ -99,7 +99,7 @@ browser.</p></div>
<div class="ulist"><ul>
<li>
<p>
-Open <a href="http://cacert.org">http://cacert.org</a> in your favorite browser
+Open [CAcert.org](<a href="http://cacert.org">http://cacert.org</a>) in your favorite browser
</p>
</li>
<li>
@@ -274,6 +274,8 @@ user.</p></div>
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/guide/transports/index.html b/docs/en/ranch/1.2/guide/transports/index.html
index 682cd26b..d3a4affd 100644
--- a/docs/en/ranch/1.2/guide/transports/index.html
+++ b/docs/en/ranch/1.2/guide/transports/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Transports</title>
@@ -305,6 +305,8 @@ is the transport&#8217;s module. See <code>ranch_ssl</code> for an example.</p><
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/index.html b/docs/en/ranch/1.2/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/ranch/1.2/index.html
+++ b/docs/en/ranch/1.2/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/en/ranch/1.2/manual/index.html b/docs/en/ranch/1.2/manual/index.html
index 83666bc9..3f3ddce7 100644
--- a/docs/en/ranch/1.2/manual/index.html
+++ b/docs/en/ranch/1.2/manual/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Ranch Function Reference</title>
@@ -135,6 +135,8 @@
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/manual/ranch/index.html b/docs/en/ranch/1.2/manual/ranch/index.html
index 7a16695c..78292a1f 100644
--- a/docs/en/ranch/1.2/manual/ranch/index.html
+++ b/docs/en/ranch/1.2/manual/ranch/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: ranch(3)</title>
@@ -185,7 +185,7 @@ Ranch that it initialized properly and let it perform any
additional operations before the socket can be safely used.</p></div>
</div>
<div class="sect2">
-<h3 id="_child_spec_ref_numacceptors_transport_transopts_protocol_protoopts_8594_supervisor_child_spec">child_spec(Ref, NumAcceptors, Transport, TransOpts, Protocol, ProtoOpts) &#8594; supervisor:child_spec()</h3>
+<h3 id="_child_spec_ref_nbacceptors_transport_transopts_protocol_protoopts_8594_supervisor_child_spec">child_spec(Ref, NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts) &#8594; supervisor:child_spec()</h3>
<div class="dlist"><dl>
<dt class="hdlist1">
Ref = ref()
@@ -196,7 +196,7 @@ Listener name.
</p>
</dd>
<dt class="hdlist1">
-NumAcceptors = non_neg_integer()
+NbAcceptors = non_neg_integer()
</dt>
<dd>
<p>
@@ -405,7 +405,7 @@ New protocol options.
Old connections will not receive the new options.</p></div>
</div>
<div class="sect2">
-<h3 id="_start_listener_ref_numacceptors_transport_transopts_protocol_protoopts_8594_ok_pid_error_badarg">start_listener(Ref, NumAcceptors, Transport, TransOpts, Protocol, ProtoOpts) &#8594; {ok, pid()} | {error, badarg}</h3>
+<h3 id="_start_listener_ref_nbacceptors_transport_transopts_protocol_protoopts_8594_ok_pid_error_badarg">start_listener(Ref, NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts) &#8594; {ok, pid()} | {error, badarg}</h3>
<div class="dlist"><dl>
<dt class="hdlist1">
Ref = ref()
@@ -416,7 +416,7 @@ Listener name.
</p>
</dd>
<dt class="hdlist1">
-NumAcceptors = non_neg_integer()
+NbAcceptors = non_neg_integer()
</dt>
<dd>
<p>
@@ -520,6 +520,8 @@ completely stopped.</p></div>
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/manual/ranch_app/index.html b/docs/en/ranch/1.2/manual/ranch_app/index.html
index 24123477..202babbc 100644
--- a/docs/en/ranch/1.2/manual/ranch_app/index.html
+++ b/docs/en/ranch/1.2/manual/ranch_app/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: ranch(7)</title>
@@ -140,6 +140,8 @@ and <em>total.profile</em>. Do not use in production.</p></div>
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/manual/ranch_protocol/index.html b/docs/en/ranch/1.2/manual/ranch_protocol/index.html
index 27eb6c9d..8fd069e6 100644
--- a/docs/en/ranch/1.2/manual/ranch_protocol/index.html
+++ b/docs/en/ranch/1.2/manual/ranch_protocol/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: ranch_protocol(3)</title>
@@ -180,6 +180,8 @@ processes and degrade performance severely.</p></div>
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/manual/ranch_ssl/index.html b/docs/en/ranch/1.2/manual/ranch_ssl/index.html
index b486f5ed..1d77a3d5 100644
--- a/docs/en/ranch/1.2/manual/ranch_ssl/index.html
+++ b/docs/en/ranch/1.2/manual/ranch_ssl/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: ranch_ssl(3)</title>
@@ -92,7 +92,6 @@ by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><span style="font-weight: bold"><span style="color: #000000">ssl_opt</span></span>() <span style="color: #990000">=</span> {<span style="color: #FF6600">alpn_preferred_protocols</span>, [<span style="font-weight: bold"><span style="color: #000080">binary</span></span>()]}
- | {<span style="color: #FF6600">beast_mitigation</span>, <span style="color: #FF6600">one_n_minus_one</span> | <span style="color: #FF6600">zero_n</span> | <span style="color: #FF6600">disabled</span>}
| {<span style="color: #FF6600">cacertfile</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
| {<span style="color: #FF6600">cacerts</span>, [<span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()]}
| {<span style="color: #FF6600">cert</span>, <span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()}
@@ -111,18 +110,15 @@ http://www.gnu.org/software/src-highlite -->
| {<span style="color: #FF6600">keyfile</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
| {<span style="color: #FF6600">log_alert</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
| {<span style="color: #FF6600">next_protocols_advertised</span>, [<span style="font-weight: bold"><span style="color: #000080">binary</span></span>()]}
- | {<span style="color: #FF6600">padding_check</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
| {<span style="color: #FF6600">partial_chain</span>, <span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>(([<span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()]) <span style="color: #990000">-&gt;</span> {<span style="color: #FF6600">trusted_ca</span>, <span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()} | <span style="color: #FF6600">unknown_ca</span>)}
| {<span style="color: #FF6600">password</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
| {<span style="color: #FF6600">psk_identity</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
| {<span style="color: #FF6600">reuse_session</span>, <span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>()}
| {<span style="color: #FF6600">reuse_sessions</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
| {<span style="color: #FF6600">secure_renegotiate</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
- | {<span style="color: #FF6600">signature_algs</span>, [{<span style="font-weight: bold"><span style="color: #000080">atom</span></span>(), <span style="font-weight: bold"><span style="color: #000080">atom</span></span>()}]}
| {<span style="color: #FF6600">sni_fun</span>, <span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>()}
| {<span style="color: #FF6600">sni_hosts</span>, [{<span style="font-weight: bold"><span style="color: #000000">string</span></span>(), <span style="font-weight: bold"><span style="color: #000000">ssl_opt</span></span>()}]}
| {<span style="color: #FF6600">user_lookup_fun</span>, {<span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>(), <span style="font-weight: bold"><span style="color: #000000">any</span></span>()}}
- | {<span style="color: #FF6600">v2_hello_compatible</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
| {<span style="color: #FF6600">verify</span>, <span style="font-weight: bold"><span style="color: #000000">ssl:verify_type</span></span>()}
| {<span style="color: #FF6600">verify_fun</span>, {<span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>(), <span style="font-weight: bold"><span style="color: #000000">any</span></span>()}}
| {<span style="color: #FF6600">versions</span>, [<span style="font-weight: bold"><span style="color: #000080">atom</span></span>()]}<span style="color: #990000">.</span></tt></pre></div></div>
@@ -154,14 +150,6 @@ alpn_preferred_protocols
</p>
</dd>
<dt class="hdlist1">
-beast_mitigation
-</dt>
-<dd>
-<p>
- Change the BEAST mitigation strategy for SSL-3.0 and TLS-1.0 to interoperate with legacy software.
-</p>
-</dd>
-<dt class="hdlist1">
cacertfile
</dt>
<dd>
@@ -314,14 +302,6 @@ nodelay (true)
</p>
</dd>
<dt class="hdlist1">
-padding_check
-</dt>
-<dd>
-<p>
- Allow disabling the block cipher padding check for TLS-1.0 to be able to interoperate with legacy software.
-</p>
-</dd>
-<dt class="hdlist1">
partial_chain
</dt>
<dd>
@@ -370,14 +350,6 @@ secure_renegotiate (false)
</p>
</dd>
<dt class="hdlist1">
-signature_algs
-</dt>
-<dd>
-<p>
- The TLS signature algorithm extension may be used, from TLS 1.2, to negotiate which signature algorithm to use during the TLS handshake.
-</p>
-</dd>
-<dt class="hdlist1">
sni_fun
</dt>
<dd>
@@ -402,14 +374,6 @@ user_lookup_fun
</p>
</dd>
<dt class="hdlist1">
-v2_hello_compatible
-</dt>
-<dd>
-<p>
- Accept clients that send hello messages in SSL-2.0 format while offering supported SSL/TLS versions.
-</p>
-</dd>
-<dt class="hdlist1">
verify (verify_none)
</dt>
<dd>
@@ -482,6 +446,8 @@ greater control over the client certificate validation.</p></div>
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/manual/ranch_tcp/index.html b/docs/en/ranch/1.2/manual/ranch_tcp/index.html
index 44e289c5..bcda73a2 100644
--- a/docs/en/ranch/1.2/manual/ranch_tcp/index.html
+++ b/docs/en/ranch/1.2/manual/ranch_tcp/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: ranch_tcp(3)</title>
@@ -106,7 +106,6 @@ http://www.gnu.org/software/src-highlite -->
| <span style="color: #FF6600">inet</span>
| <span style="color: #FF6600">inet6</span>
| {<span style="color: #FF6600">ip</span>, <span style="font-weight: bold"><span style="color: #000000">inet:ip_address</span></span>()}
- | {<span style="color: #FF6600">ipv6_v6only</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
| {<span style="color: #FF6600">keepalive</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
| {<span style="color: #FF6600">linger</span>, {<span style="font-weight: bold"><span style="color: #000000">boolean</span></span>(), <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}}
| {<span style="color: #FF6600">low_msgq_watermark</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
@@ -230,14 +229,6 @@ ip
</p>
</dd>
<dt class="hdlist1">
-ipv6_v6only (false)
-</dt>
-<dd>
-<p>
- Listen on IPv4 and IPv6 (false) or only on IPv6 (true). Use with inet6.
-</p>
-</dd>
-<dt class="hdlist1">
keepalive (false)
</dt>
<dd>
@@ -380,6 +371,8 @@ portable. Use with caution.</p></div>
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.2/manual/ranch_transport/index.html b/docs/en/ranch/1.2/manual/ranch_transport/index.html
index 9bfb4786..6fab612e 100644
--- a/docs/en/ranch/1.2/manual/ranch_transport/index.html
+++ b/docs/en/ranch/1.2/manual/ranch_transport/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: ranch_transport(3)</title>
@@ -591,6 +591,8 @@ directly.</p></div>
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
<li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
</ul>
diff --git a/docs/en/ranch/1.3/guide/embedded.asciidoc b/docs/en/ranch/1.3/guide/embedded.asciidoc
new file mode 100644
index 00000000..593a8079
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/embedded.asciidoc
@@ -0,0 +1,48 @@
+== Embedded mode
+
+Embedded mode allows you to insert Ranch listeners directly
+in your supervision tree. This allows for greater fault tolerance
+control by permitting the shutdown of a listener due to the
+failure of another part of the application and vice versa.
+
+=== Embedding
+
+To embed Ranch in your application you can simply add the child specs
+to your supervision tree. This can all be done in the `init/1` function
+of one of your application supervisors.
+
+Ranch requires at the minimum two kinds of child specs for embedding.
+First, you need to add `ranch_sup` to your supervision tree, only once,
+regardless of the number of listeners you will use. Then you need to
+add the child specs for each listener.
+
+Ranch has a convenience function for getting the listeners child specs
+called `ranch:child_spec/6`, that works like `ranch:start_listener/6`,
+except that it doesn't start anything, it only returns child specs.
+
+As for `ranch_sup`, the child spec is simple enough to not require a
+convenience function.
+
+The following example adds both `ranch_sup` and one listener to another
+application's supervision tree.
+
+.Embed Ranch directly in your supervision tree
+
+[source,erlang]
+----
+init([]) ->
+ RanchSupSpec = {ranch_sup, {ranch_sup, start_link, []},
+ permanent, 5000, supervisor, [ranch_sup]},
+ ListenerSpec = ranch:child_spec(echo, 100,
+ ranch_tcp, [{port, 5555}],
+ echo_protocol, []
+ ),
+ {ok, {{one_for_one, 10, 10}, [RanchSupSpec, ListenerSpec]}}.
+----
+
+Remember, you can add as many listener child specs as needed, but only
+one `ranch_sup` spec!
+
+It is recommended that your architecture makes sure that all listeners
+are restarted if `ranch_sup` fails. See the Ranch internals chapter for
+more details on how Ranch does it.
diff --git a/docs/en/ranch/1.3/guide/embedded/index.html b/docs/en/ranch/1.3/guide/embedded/index.html
new file mode 100644
index 00000000..a18a512d
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/embedded/index.html
@@ -0,0 +1,205 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Embedded mode</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>Embedded mode</span></h1>
+
+<div class="paragraph"><p>Embedded mode allows you to insert Ranch listeners directly
+in your supervision tree. This allows for greater fault tolerance
+control by permitting the shutdown of a listener due to the
+failure of another part of the application and vice versa.</p></div>
+<div class="sect1">
+<h2 id="_embedding">Embedding</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>To embed Ranch in your application you can simply add the child specs
+to your supervision tree. This can all be done in the <code>init/1</code> function
+of one of your application supervisors.</p></div>
+<div class="paragraph"><p>Ranch requires at the minimum two kinds of child specs for embedding.
+First, you need to add <code>ranch_sup</code> to your supervision tree, only once,
+regardless of the number of listeners you will use. Then you need to
+add the child specs for each listener.</p></div>
+<div class="paragraph"><p>Ranch has a convenience function for getting the listeners child specs
+called <code>ranch:child_spec/6</code>, that works like <code>ranch:start_listener/6</code>,
+except that it doesn&#8217;t start anything, it only returns child specs.</p></div>
+<div class="paragraph"><p>As for <code>ranch_sup</code>, the child spec is simple enough to not require a
+convenience function.</p></div>
+<div class="paragraph"><p>The following example adds both <code>ranch_sup</code> and one listener to another
+application&#8217;s supervision tree.</p></div>
+<div class="listingblock">
+<div class="title">Embed Ranch directly in your supervision tree</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">init</span></span>([]) <span style="color: #990000">-&gt;</span>
+ <span style="color: #009900">RanchSupSpec</span> <span style="color: #990000">=</span> {<span style="color: #FF6600">ranch_sup</span>, {<span style="color: #FF6600">ranch_sup</span>, <span style="color: #FF6600">start_link</span>, []},
+ <span style="color: #FF6600">permanent</span>, <span style="color: #993399">5000</span>, <span style="color: #FF6600">supervisor</span>, [<span style="color: #FF6600">ranch_sup</span>]},
+ <span style="color: #009900">ListenerSpec</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:child_spec</span></span>(<span style="color: #FF6600">echo</span>, <span style="color: #993399">100</span>,
+ <span style="color: #FF6600">ranch_tcp</span>, [{<span style="color: #FF6600">port</span>, <span style="color: #993399">5555</span>}],
+ <span style="color: #FF6600">echo_protocol</span>, []
+ ),
+ {<span style="color: #FF6600">ok</span>, {{<span style="color: #FF6600">one_for_one</span>, <span style="color: #993399">10</span>, <span style="color: #993399">10</span>}, [<span style="color: #009900">RanchSupSpec</span>, <span style="color: #009900">ListenerSpec</span>]}}<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>Remember, you can add as many listener child specs as needed, but only
+one <code>ranch_sup</code> spec!</p></div>
+<div class="paragraph"><p>It is recommended that your architecture makes sure that all listeners
+are restarted if <code>ranch_sup</code> fails. See the Ranch internals chapter for
+more details on how Ranch does it.</p></div>
+</div>
+</div>
+
+
+
+
+
+
+
+ <nav style="margin:1em 0">
+
+ <a style="float:left" href="https://ninenines.eu/docs/en/ranch/1.3/guide/protocols/">
+ Protocols
+ </a>
+
+
+
+ <a style="float:right" href="https://ninenines.eu/docs/en/ranch/1.3/guide/parsers/">
+ Writing parsers
+ </a>
+
+ </nav>
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+
+ User Guide
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/guide/index.html b/docs/en/ranch/1.3/guide/index.html
new file mode 100644
index 00000000..95e87dea
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/index.html
@@ -0,0 +1,186 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Ranch User Guide</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>Ranch User Guide</span></h1>
+
+<div class="ulist"><ul>
+<li>
+<p>
+<a href="introduction/">Introduction</a>
+</p>
+</li>
+<li>
+<p>
+<a href="listeners/">Listeners</a>
+</p>
+</li>
+<li>
+<p>
+<a href="transports/">Transports</a>
+</p>
+</li>
+<li>
+<p>
+<a href="protocols/">Protocols</a>
+</p>
+</li>
+<li>
+<p>
+<a href="embedded/">Embedded mode</a>
+</p>
+</li>
+<li>
+<p>
+<a href="parsers/">Writing parsers</a>
+</p>
+</li>
+<li>
+<p>
+<a href="ssl_auth/">SSL client authentication</a>
+</p>
+</li>
+<li>
+<p>
+<a href="internals/">Internals</a>
+</p>
+</li>
+</ul></div>
+
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+
+ User Guide
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/guide/internals.asciidoc b/docs/en/ranch/1.3/guide/internals.asciidoc
new file mode 100644
index 00000000..fa63f1d3
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/internals.asciidoc
@@ -0,0 +1,94 @@
+== Internals
+
+This chapter may not apply to embedded Ranch as embedding allows you
+to use an architecture specific to your application, which may or may
+not be compatible with the description of the Ranch application.
+
+Note that for everything related to efficiency and performance,
+you should perform the benchmarks yourself to get the numbers that
+matter to you. Generic benchmarks found on the web may or may not
+be of use to you, you can never know until you benchmark your own
+system.
+
+=== Architecture
+
+Ranch is an OTP application.
+
+Like all OTP applications, Ranch has a top supervisor. It is responsible
+for supervising the `ranch_server` process and all the listeners that
+will be started.
+
+The `ranch_server` gen_server is a central process keeping track of the
+listeners and their acceptors. It does so through the use of a public ets
+table called `ranch_server`. The table is owned by the top supervisor
+to improve fault tolerance. This way if the `ranch_server` gen_server
+fails, it doesn't lose any information and the restarted process can
+continue as if nothing happened.
+
+Ranch uses a custom supervisor for managing connections. This supervisor
+keeps track of the number of connections and handles connection limits
+directly. While it is heavily optimized to perform the task of creating
+connection processes for accepted connections, it is still following the
+OTP principles and the usual `sys` and `supervisor` calls will work on
+it as expected.
+
+Listeners are grouped into the `ranch_listener_sup` supervisor and
+consist of three kinds of processes: the listener gen_server, the
+acceptor processes and the connection processes, both grouped under
+their own supervisor. All of these processes are registered to the
+`ranch_server` gen_server with varying amount of information.
+
+All socket operations, including listening for connections, go through
+transport handlers. Accepted connections are given to the protocol handler.
+Transport handlers are simple callback modules for performing operations on
+sockets. Protocol handlers start a new process, which receives socket
+ownership, with no requirements on how the code should be written inside
+that new process.
+
+=== Number of acceptors
+
+The second argument to `ranch:start_listener/6` is the number of
+processes that will be accepting connections. Care should be taken
+when choosing this number.
+
+First of all, it should not be confused with the maximum number
+of connections. Acceptor processes are only used for accepting and
+have nothing else in common with connection processes. Therefore
+there is nothing to be gained from setting this number too high,
+in fact it can slow everything else down.
+
+Second, this number should be high enough to allow Ranch to accept
+connections concurrently. But the number of cores available doesn't
+seem to be the only factor for choosing this number, as we can
+observe faster accepts if we have more acceptors than cores. It
+might be entirely dependent on the protocol, however.
+
+Our observations suggest that using 100 acceptors on modern hardware
+is a good solution, as it's big enough to always have acceptors ready
+and it's low enough that it doesn't have a negative impact on the
+system's performances.
+
+=== Platform-specific TCP features
+
+Some socket options are platform-specific and not supported by `inet`.
+They can be of interest because they generally are related to
+optimizations provided by the underlying OS. They can still be enabled
+thanks to the `raw` option, for which we will see an example.
+
+One of these features is `TCP_DEFER_ACCEPT` on Linux. It is a simplified
+accept mechanism which will wait for application data to come in before
+handing out the connection to the Erlang process.
+
+This is especially useful if you expect many connections to be mostly
+idle, perhaps part of a connection pool. They can be handled by the
+kernel directly until they send any real data, instead of allocating
+resources to idle connections.
+
+To enable this mechanism, the following option can be used.
+
+.Using raw transport options
+
+[source,erlang]
+{raw, 6, 9, << 30:32/native >>}
+
+It means go on layer 6, turn on option 9 with the given integer parameter.
diff --git a/docs/en/ranch/1.3/guide/internals/index.html b/docs/en/ranch/1.3/guide/internals/index.html
new file mode 100644
index 00000000..2a778619
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/internals/index.html
@@ -0,0 +1,246 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Internals</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>Internals</span></h1>
+
+<div class="paragraph"><p>This chapter may not apply to embedded Ranch as embedding allows you
+to use an architecture specific to your application, which may or may
+not be compatible with the description of the Ranch application.</p></div>
+<div class="paragraph"><p>Note that for everything related to efficiency and performance,
+you should perform the benchmarks yourself to get the numbers that
+matter to you. Generic benchmarks found on the web may or may not
+be of use to you, you can never know until you benchmark your own
+system.</p></div>
+<div class="sect1">
+<h2 id="_architecture">Architecture</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Ranch is an OTP application.</p></div>
+<div class="paragraph"><p>Like all OTP applications, Ranch has a top supervisor. It is responsible
+for supervising the <code>ranch_server</code> process and all the listeners that
+will be started.</p></div>
+<div class="paragraph"><p>The <code>ranch_server</code> gen_server is a central process keeping track of the
+listeners and their acceptors. It does so through the use of a public ets
+table called <code>ranch_server</code>. The table is owned by the top supervisor
+to improve fault tolerance. This way if the <code>ranch_server</code> gen_server
+fails, it doesn&#8217;t lose any information and the restarted process can
+continue as if nothing happened.</p></div>
+<div class="paragraph"><p>Ranch uses a custom supervisor for managing connections. This supervisor
+keeps track of the number of connections and handles connection limits
+directly. While it is heavily optimized to perform the task of creating
+connection processes for accepted connections, it is still following the
+OTP principles and the usual <code>sys</code> and <code>supervisor</code> calls will work on
+it as expected.</p></div>
+<div class="paragraph"><p>Listeners are grouped into the <code>ranch_listener_sup</code> supervisor and
+consist of three kinds of processes: the listener gen_server, the
+acceptor processes and the connection processes, both grouped under
+their own supervisor. All of these processes are registered to the
+<code>ranch_server</code> gen_server with varying amount of information.</p></div>
+<div class="paragraph"><p>All socket operations, including listening for connections, go through
+transport handlers. Accepted connections are given to the protocol handler.
+Transport handlers are simple callback modules for performing operations on
+sockets. Protocol handlers start a new process, which receives socket
+ownership, with no requirements on how the code should be written inside
+that new process.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_number_of_acceptors">Number of acceptors</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The second argument to <code>ranch:start_listener/6</code> is the number of
+processes that will be accepting connections. Care should be taken
+when choosing this number.</p></div>
+<div class="paragraph"><p>First of all, it should not be confused with the maximum number
+of connections. Acceptor processes are only used for accepting and
+have nothing else in common with connection processes. Therefore
+there is nothing to be gained from setting this number too high,
+in fact it can slow everything else down.</p></div>
+<div class="paragraph"><p>Second, this number should be high enough to allow Ranch to accept
+connections concurrently. But the number of cores available doesn&#8217;t
+seem to be the only factor for choosing this number, as we can
+observe faster accepts if we have more acceptors than cores. It
+might be entirely dependent on the protocol, however.</p></div>
+<div class="paragraph"><p>Our observations suggest that using 100 acceptors on modern hardware
+is a good solution, as it&#8217;s big enough to always have acceptors ready
+and it&#8217;s low enough that it doesn&#8217;t have a negative impact on the
+system&#8217;s performances.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_platform_specific_tcp_features">Platform-specific TCP features</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Some socket options are platform-specific and not supported by <code>inet</code>.
+They can be of interest because they generally are related to
+optimizations provided by the underlying OS. They can still be enabled
+thanks to the <code>raw</code> option, for which we will see an example.</p></div>
+<div class="paragraph"><p>One of these features is <code>TCP_DEFER_ACCEPT</code> on Linux. It is a simplified
+accept mechanism which will wait for application data to come in before
+handing out the connection to the Erlang process.</p></div>
+<div class="paragraph"><p>This is especially useful if you expect many connections to be mostly
+idle, perhaps part of a connection pool. They can be handled by the
+kernel directly until they send any real data, instead of allocating
+resources to idle connections.</p></div>
+<div class="paragraph"><p>To enable this mechanism, the following option can be used.</p></div>
+<div class="listingblock">
+<div class="title">Using raw transport options</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #FF6600">raw</span>, <span style="color: #993399">6</span>, <span style="color: #993399">9</span>, <span style="color: #990000">&lt;&lt;</span> <span style="font-weight: bold"><span style="color: #000000">30:32</span></span><span style="color: #990000">/</span><span style="color: #FF6600">native</span> <span style="color: #990000">&gt;&gt;</span>}</tt></pre></div></div>
+<div class="paragraph"><p>It means go on layer 6, turn on option 9 with the given integer parameter.</p></div>
+</div>
+</div>
+
+
+
+
+
+
+
+ <nav style="margin:1em 0">
+
+ <a style="float:left" href="https://ninenines.eu/docs/en/ranch/1.3/guide/ssl_auth/">
+ SSL client authentication
+ </a>
+
+
+
+ </nav>
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+
+ User Guide
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/guide/introduction.asciidoc b/docs/en/ranch/1.3/guide/introduction.asciidoc
new file mode 100644
index 00000000..ac27862e
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/introduction.asciidoc
@@ -0,0 +1,28 @@
+== Introduction
+
+Ranch is a socket acceptor pool for TCP protocols.
+
+Ranch aims to provide everything you need to accept TCP connections
+with a small code base and low latency while being easy to use directly
+as an application or to embed into your own.
+
+=== Prerequisites
+
+It is assumed the developer already knows Erlang and has some experience
+with socket programming and TCP protocols.
+
+=== Supported platforms
+
+Ranch is tested and supported on Linux, FreeBSD, OSX and Windows.
+
+Ranch is developed for Erlang/OTP R16B+.
+
+There are known issues with the SSL application found in Erlang/OTP
+18.3.2 and 18.3.3. These versions are therefore not supported.
+
+Ranch may be compiled on earlier Erlang versions with small source code
+modifications but there is no guarantee that it will work as expected.
+
+=== Versioning
+
+Ranch uses http://semver.org/[Semantic Versioning 2.0.0]
diff --git a/docs/en/ranch/1.3/guide/introduction/index.html b/docs/en/ranch/1.3/guide/introduction/index.html
new file mode 100644
index 00000000..7420a70b
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/introduction/index.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Introduction</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>Introduction</span></h1>
+
+<div class="paragraph"><p>Ranch is a socket acceptor pool for TCP protocols.</p></div>
+<div class="paragraph"><p>Ranch aims to provide everything you need to accept TCP connections
+with a small code base and low latency while being easy to use directly
+as an application or to embed into your own.</p></div>
+<div class="sect1">
+<h2 id="_prerequisites">Prerequisites</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>It is assumed the developer already knows Erlang and has some experience
+with socket programming and TCP protocols.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_supported_platforms">Supported platforms</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Ranch is tested and supported on Linux, FreeBSD, OSX and Windows.</p></div>
+<div class="paragraph"><p>Ranch is developed for Erlang/OTP R16B+.</p></div>
+<div class="paragraph"><p>There are known issues with the SSL application found in Erlang/OTP
+18.3.2 and 18.3.3. These versions are therefore not supported.</p></div>
+<div class="paragraph"><p>Ranch may be compiled on earlier Erlang versions with small source code
+modifications but there is no guarantee that it will work as expected.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_versioning">Versioning</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Ranch uses <a href="http://semver.org/">Semantic Versioning 2.0.0</a></p></div>
+</div>
+</div>
+
+
+
+
+
+
+
+ <nav style="margin:1em 0">
+
+
+
+ <a style="float:right" href="https://ninenines.eu/docs/en/ranch/1.3/guide/listeners/">
+ Listeners
+ </a>
+
+ </nav>
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+
+ User Guide
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/guide/listeners.asciidoc b/docs/en/ranch/1.3/guide/listeners.asciidoc
new file mode 100644
index 00000000..1055b804
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/listeners.asciidoc
@@ -0,0 +1,302 @@
+== Listeners
+
+A listener is a set of processes whose role is to listen on a port
+for new connections. It manages a pool of acceptor processes, each
+of them indefinitely accepting connections. When it does, it starts
+a new process executing the protocol handler code. All the socket
+programming is abstracted through the use of transport handlers.
+
+The listener takes care of supervising all the acceptor and connection
+processes, allowing developers to focus on building their application.
+
+=== Starting a listener
+
+Ranch does nothing by default. It is up to the application developer
+to request that Ranch listens for connections.
+
+A listener can be started and stopped at will.
+
+When starting a listener, a number of different settings are required:
+
+* A name to identify it locally and be able to interact with it.
+* The number of acceptors in the pool.
+* A transport handler and its associated options.
+* A protocol handler and its associated options.
+
+Ranch includes both TCP and SSL transport handlers, respectively
+`ranch_tcp` and `ranch_ssl`.
+
+A listener can be started by calling the `ranch:start_listener/6`
+function. Before doing so however, you must ensure that the `ranch`
+application is started.
+
+.Starting the Ranch application
+
+[source,erlang]
+ok = application:start(ranch).
+
+You are then ready to start a listener. Let's call it `tcp_echo`. It will
+have a pool of 100 acceptors, use a TCP transport and forward connections
+to the `echo_protocol` handler.
+
+.Starting a listener for TCP connections on port 5555
+
+[source,erlang]
+{ok, _} = ranch:start_listener(tcp_echo, 100,
+ ranch_tcp, [{port, 5555}],
+ echo_protocol, []
+).
+
+You can try this out by compiling and running the `tcp_echo` example in the
+examples directory. To do so, open a shell in the 'examples/tcp_echo/'
+directory and run the following command:
+
+.Building and starting a Ranch example
+
+[source,bash]
+$ make run
+
+You can then connect to it using telnet and see the echo server reply
+everything you send to it. Then when you're done testing, you can use
+the `Ctrl+]` key to escape to the telnet command line and type
+`quit` to exit.
+
+.Connecting to the example listener with telnet
+
+[source,bash]
+----
+$ telnet localhost 5555
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is '^]'.
+Hello!
+Hello!
+It works!
+It works!
+^]
+
+telnet> quit
+Connection closed.
+----
+
+=== Stopping a listener
+
+All you need to stop a Ranch listener is to call the
+`ranch:stop_listener/1` function with the listener's name
+as argument. In the previous section we started the listener
+named `tcp_echo`. We can now stop it.
+
+.Stopping a listener
+
+[source,erlang]
+ranch:stop_listener(tcp_echo).
+
+=== Default transport options
+
+By default the socket will be set to return `binary` data, with the
+options `{active, false}`, `{packet, raw}`, `{reuseaddr, true}` set.
+These values can't be overriden when starting the listener, but
+they can be overriden using `Transport:setopts/2` in the protocol.
+
+It will also set `{backlog, 1024}` and `{nodelay, true}`, which
+can be overriden at listener startup.
+
+=== Listening on a random port
+
+You do not have to specify a specific port to listen on. If you give
+the port number 0, or if you omit the port number entirely, Ranch will
+start listening on a random port.
+
+You can retrieve this port number by calling `ranch:get_port/1`. The
+argument is the name of the listener you gave in `ranch:start_listener/6`.
+
+.Starting a listener for TCP connections on a random port
+
+[source,erlang]
+{ok, _} = ranch:start_listener(tcp_echo, 100,
+ ranch_tcp, [{port, 0}],
+ echo_protocol, []
+).
+Port = ranch:get_port(tcp_echo).
+
+=== Listening on privileged ports
+
+Some systems limit access to ports below 1024 for security reasons.
+This can easily be identified by an `{error, eacces}` error when trying
+to open a listening socket on such a port.
+
+The methods for listening on privileged ports vary between systems,
+please refer to your system's documentation for more information.
+
+We recommend the use of port rewriting for systems with a single server,
+and load balancing for systems with multiple servers. Documenting these
+solutions is however out of the scope of this guide.
+
+=== Accepting connections on an existing socket
+
+If you want to accept connections on an existing socket, you can use the
+`socket` transport option, which should just be the relevant data returned
+from the connect function for the transport or the underlying socket library
+(`gen_tcp:connect`, `ssl:connect`). The accept function will then be
+called on the passed in socket. You should connect the socket in
+`{active, false}` mode, as well.
+
+Note, however, that because of a bug in SSL, you cannot change ownership of an
+SSL listen socket prior to R16. Ranch will catch the error thrown, but the
+owner of the SSL socket will remain as whatever process created the socket.
+However, this will not affect accept behaviour unless the owner process dies,
+in which case the socket is closed. Therefore, to use this feature with SSL
+with an erlang release prior to R16, ensure that the SSL socket is opened in a
+persistant process.
+
+=== Limiting the number of concurrent connections
+
+The `max_connections` transport option allows you to limit the number
+of concurrent connections. It defaults to 1024. Its purpose is to
+prevent your system from being overloaded and ensuring all the
+connections are handled optimally.
+
+.Customizing the maximum number of concurrent connections
+
+[source,erlang]
+{ok, _} = ranch:start_listener(tcp_echo, 100,
+ ranch_tcp, [{port, 5555}, {max_connections, 100}],
+ echo_protocol, []
+).
+
+You can disable this limit by setting its value to the atom `infinity`.
+
+.Disabling the limit for the number of connections
+
+[source,erlang]
+{ok, _} = ranch:start_listener(tcp_echo, 100,
+ ranch_tcp, [{port, 5555}, {max_connections, infinity}],
+ echo_protocol, []
+).
+
+The maximum number of connections is a soft limit. In practice, it
+can reach `max_connections` + the number of acceptors.
+
+When the maximum number of connections is reached, Ranch will stop
+accepting connections. This will not result in further connections
+being rejected, as the kernel option allows queueing incoming
+connections. The size of this queue is determined by the `backlog`
+option and defaults to 1024. Ranch does not know about the number
+of connections that are in the backlog.
+
+You may not always want connections to be counted when checking for
+`max_connections`. For example you might have a protocol where both
+short-lived and long-lived connections are possible. If the long-lived
+connections are mostly waiting for messages, then they don't consume
+much resources and can safely be removed from the count.
+
+To remove the connection from the count, you must call the
+`ranch:remove_connection/1` from within the connection process,
+with the name of the listener as the only argument.
+
+.Removing a connection from the count of connections
+
+[source,erlang]
+ranch:remove_connection(Ref).
+
+As seen in the chapter covering protocols, this pid is received as the
+first argument of the protocol's `start_link/4` callback.
+
+You can modify the `max_connections` value on a running listener by
+using the `ranch:set_max_connections/2` function, with the name of the
+listener as first argument and the new value as the second.
+
+.Upgrading the maximum number of connections
+
+[source,erlang]
+ranch:set_max_connections(tcp_echo, MaxConns).
+
+The change will occur immediately.
+
+=== When running out of file descriptors
+
+Operating systems have limits on the number of sockets
+which can be opened by applications. When this maximum is
+reached the listener can no longer accept new connections. The
+accept rate of the listener will be automatically reduced, and a
+warning message will be logged.
+
+----
+=ERROR REPORT==== 13-Jan-2016::12:24:38 ===
+Ranch acceptor reducing accept rate: out of file descriptors
+----
+
+If you notice messages like this you should increase the number
+of file-descriptors which can be opened by your application. How
+this should be done is operating-system dependent. Please consult
+the documentation of your operating system.
+
+=== Using a supervisor for connection processes
+
+Ranch allows you to define the type of process that will be used
+for the connection processes. By default it expects a `worker`.
+When the `connection_type` configuration value is set to `supervisor`,
+Ranch will consider that the connection process it manages is a
+supervisor and will reflect that in its supervision tree.
+
+Connection processes of type `supervisor` can either handle the
+socket directly or through one of their children. In the latter
+case the start function for the connection process must return
+two pids: the pid of the supervisor you created (that will be
+supervised) and the pid of the protocol handling process (that
+will receive the socket).
+
+Instead of returning `{ok, ConnPid}`, simply return
+`{ok, SupPid, ConnPid}`.
+
+It is very important that the connection process be created
+under the supervisor process so that everything works as intended.
+If not, you will most likely experience issues when the supervised
+process is stopped.
+
+=== Upgrading
+
+Ranch allows you to upgrade the protocol options. This takes effect
+immediately and for all subsequent connections.
+
+To upgrade the protocol options, call `ranch:set_protocol_options/2`
+with the name of the listener as first argument and the new options
+as the second.
+
+.Upgrading the protocol options
+
+[source,erlang]
+ranch:set_protocol_options(tcp_echo, NewOpts).
+
+All future connections will use the new options.
+
+You can also retrieve the current options similarly by
+calling `ranch:get_protocol_options/1`.
+
+.Retrieving the current protocol options
+
+[source,erlang]
+Opts = ranch:get_protocol_options(tcp_echo).
+
+=== Obtain information about listeners
+
+Ranch provides two functions for retrieving information about the
+listeners, for reporting and diagnostic purposes.
+
+The `ranch:info/0` function will return detailed information
+about all listeners.
+
+.Retrieving detailed information
+[source,erlang]
+ranch:info().
+
+The `ranch:procs/2` function will return all acceptor or listener
+processes for a given listener.
+
+.Get all acceptor processes
+[source,erlang]
+ranch:procs(tcp_echo, acceptors).
+
+.Get all connection processes
+[source,erlang]
+ranch:procs(tcp_echo, connections).
diff --git a/docs/en/ranch/1.3/guide/listeners/index.html b/docs/en/ranch/1.3/guide/listeners/index.html
new file mode 100644
index 00000000..48143ae5
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/listeners/index.html
@@ -0,0 +1,503 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Listeners</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>Listeners</span></h1>
+
+<div class="paragraph"><p>A listener is a set of processes whose role is to listen on a port
+for new connections. It manages a pool of acceptor processes, each
+of them indefinitely accepting connections. When it does, it starts
+a new process executing the protocol handler code. All the socket
+programming is abstracted through the use of transport handlers.</p></div>
+<div class="paragraph"><p>The listener takes care of supervising all the acceptor and connection
+processes, allowing developers to focus on building their application.</p></div>
+<div class="sect1">
+<h2 id="_starting_a_listener">Starting a listener</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Ranch does nothing by default. It is up to the application developer
+to request that Ranch listens for connections.</p></div>
+<div class="paragraph"><p>A listener can be started and stopped at will.</p></div>
+<div class="paragraph"><p>When starting a listener, a number of different settings are required:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+A name to identify it locally and be able to interact with it.
+</p>
+</li>
+<li>
+<p>
+The number of acceptors in the pool.
+</p>
+</li>
+<li>
+<p>
+A transport handler and its associated options.
+</p>
+</li>
+<li>
+<p>
+A protocol handler and its associated options.
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>Ranch includes both TCP and SSL transport handlers, respectively
+<code>ranch_tcp</code> and <code>ranch_ssl</code>.</p></div>
+<div class="paragraph"><p>A listener can be started by calling the <code>ranch:start_listener/6</code>
+function. Before doing so however, you must ensure that the <code>ranch</code>
+application is started.</p></div>
+<div class="listingblock">
+<div class="title">Starting the Ranch application</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #0000FF">ok</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">application:start</span></span>(<span style="color: #FF6600">ranch</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>You are then ready to start a listener. Let&#8217;s call it <code>tcp_echo</code>. It will
+have a pool of 100 acceptors, use a TCP transport and forward connections
+to the <code>echo_protocol</code> handler.</p></div>
+<div class="listingblock">
+<div class="title">Starting a listener for TCP connections on port 5555</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #FF6600">ok</span>, <span style="color: #990000">_</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:start_listener</span></span>(<span style="color: #FF6600">tcp_echo</span>, <span style="color: #993399">100</span>,
+ <span style="color: #FF6600">ranch_tcp</span>, [{<span style="color: #FF6600">port</span>, <span style="color: #993399">5555</span>}],
+ <span style="color: #FF6600">echo_protocol</span>, []
+)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>You can try this out by compiling and running the <code>tcp_echo</code> example in the
+examples directory. To do so, open a shell in the <em>examples/tcp_echo/</em>
+directory and run the following command:</p></div>
+<div class="listingblock">
+<div class="title">Building and starting a Ranch example</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>$ make run</tt></pre></div></div>
+<div class="paragraph"><p>You can then connect to it using telnet and see the echo server reply
+everything you send to it. Then when you&#8217;re done testing, you can use
+the <code>Ctrl+]</code> key to escape to the telnet command line and type
+<code>quit</code> to exit.</p></div>
+<div class="listingblock">
+<div class="title">Connecting to the example listener with telnet</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>$ telnet localhost <span style="color: #993399">5555</span>
+Trying <span style="color: #993399">127.0</span><span style="color: #990000">.</span><span style="color: #993399">0.1</span><span style="color: #990000">...</span>
+Connected to localhost<span style="color: #990000">.</span>
+Escape character is <span style="color: #FF0000">'^]'</span><span style="color: #990000">.</span>
+Hello<span style="color: #990000">!</span>
+Hello<span style="color: #990000">!</span>
+It works<span style="color: #990000">!</span>
+It works<span style="color: #990000">!</span>
+<span style="color: #990000">^]</span>
+
+telnet<span style="color: #990000">&gt;</span> quit
+Connection closed<span style="color: #990000">.</span></tt></pre></div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_stopping_a_listener">Stopping a listener</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>All you need to stop a Ranch listener is to call the
+<code>ranch:stop_listener/1</code> function with the listener&#8217;s name
+as argument. In the previous section we started the listener
+named <code>tcp_echo</code>. We can now stop it.</p></div>
+<div class="listingblock">
+<div class="title">Stopping a listener</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">ranch:stop_listener</span></span>(<span style="color: #FF6600">tcp_echo</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_default_transport_options">Default transport options</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>By default the socket will be set to return <code>binary</code> data, with the
+options <code>{active, false}</code>, <code>{packet, raw}</code>, <code>{reuseaddr, true}</code> set.
+These values can&#8217;t be overriden when starting the listener, but
+they can be overriden using <code>Transport:setopts/2</code> in the protocol.</p></div>
+<div class="paragraph"><p>It will also set <code>{backlog, 1024}</code> and <code>{nodelay, true}</code>, which
+can be overriden at listener startup.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_listening_on_a_random_port">Listening on a random port</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>You do not have to specify a specific port to listen on. If you give
+the port number 0, or if you omit the port number entirely, Ranch will
+start listening on a random port.</p></div>
+<div class="paragraph"><p>You can retrieve this port number by calling <code>ranch:get_port/1</code>. The
+argument is the name of the listener you gave in <code>ranch:start_listener/6</code>.</p></div>
+<div class="listingblock">
+<div class="title">Starting a listener for TCP connections on a random port</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #FF6600">ok</span>, <span style="color: #990000">_</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:start_listener</span></span>(<span style="color: #FF6600">tcp_echo</span>, <span style="color: #993399">100</span>,
+ <span style="color: #FF6600">ranch_tcp</span>, [{<span style="color: #FF6600">port</span>, <span style="color: #993399">0</span>}],
+ <span style="color: #FF6600">echo_protocol</span>, []
+)<span style="color: #990000">.</span>
+<span style="color: #009900">Port</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:get_port</span></span>(<span style="color: #FF6600">tcp_echo</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_listening_on_privileged_ports">Listening on privileged ports</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Some systems limit access to ports below 1024 for security reasons.
+This can easily be identified by an <code>{error, eacces}</code> error when trying
+to open a listening socket on such a port.</p></div>
+<div class="paragraph"><p>The methods for listening on privileged ports vary between systems,
+please refer to your system&#8217;s documentation for more information.</p></div>
+<div class="paragraph"><p>We recommend the use of port rewriting for systems with a single server,
+and load balancing for systems with multiple servers. Documenting these
+solutions is however out of the scope of this guide.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_accepting_connections_on_an_existing_socket">Accepting connections on an existing socket</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>If you want to accept connections on an existing socket, you can use the
+<code>socket</code> transport option, which should just be the relevant data returned
+from the connect function for the transport or the underlying socket library
+(<code>gen_tcp:connect</code>, <code>ssl:connect</code>). The accept function will then be
+called on the passed in socket. You should connect the socket in
+<code>{active, false}</code> mode, as well.</p></div>
+<div class="paragraph"><p>Note, however, that because of a bug in SSL, you cannot change ownership of an
+SSL listen socket prior to R16. Ranch will catch the error thrown, but the
+owner of the SSL socket will remain as whatever process created the socket.
+However, this will not affect accept behaviour unless the owner process dies,
+in which case the socket is closed. Therefore, to use this feature with SSL
+with an erlang release prior to R16, ensure that the SSL socket is opened in a
+persistant process.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_limiting_the_number_of_concurrent_connections">Limiting the number of concurrent connections</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The <code>max_connections</code> transport option allows you to limit the number
+of concurrent connections. It defaults to 1024. Its purpose is to
+prevent your system from being overloaded and ensuring all the
+connections are handled optimally.</p></div>
+<div class="listingblock">
+<div class="title">Customizing the maximum number of concurrent connections</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #FF6600">ok</span>, <span style="color: #990000">_</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:start_listener</span></span>(<span style="color: #FF6600">tcp_echo</span>, <span style="color: #993399">100</span>,
+ <span style="color: #FF6600">ranch_tcp</span>, [{<span style="color: #FF6600">port</span>, <span style="color: #993399">5555</span>}, {<span style="color: #FF6600">max_connections</span>, <span style="color: #993399">100</span>}],
+ <span style="color: #FF6600">echo_protocol</span>, []
+)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>You can disable this limit by setting its value to the atom <code>infinity</code>.</p></div>
+<div class="listingblock">
+<div class="title">Disabling the limit for the number of connections</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #FF6600">ok</span>, <span style="color: #990000">_</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:start_listener</span></span>(<span style="color: #FF6600">tcp_echo</span>, <span style="color: #993399">100</span>,
+ <span style="color: #FF6600">ranch_tcp</span>, [{<span style="color: #FF6600">port</span>, <span style="color: #993399">5555</span>}, {<span style="color: #FF6600">max_connections</span>, <span style="color: #FF6600">infinity</span>}],
+ <span style="color: #FF6600">echo_protocol</span>, []
+)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>The maximum number of connections is a soft limit. In practice, it
+can reach <code>max_connections</code> + the number of acceptors.</p></div>
+<div class="paragraph"><p>When the maximum number of connections is reached, Ranch will stop
+accepting connections. This will not result in further connections
+being rejected, as the kernel option allows queueing incoming
+connections. The size of this queue is determined by the <code>backlog</code>
+option and defaults to 1024. Ranch does not know about the number
+of connections that are in the backlog.</p></div>
+<div class="paragraph"><p>You may not always want connections to be counted when checking for
+<code>max_connections</code>. For example you might have a protocol where both
+short-lived and long-lived connections are possible. If the long-lived
+connections are mostly waiting for messages, then they don&#8217;t consume
+much resources and can safely be removed from the count.</p></div>
+<div class="paragraph"><p>To remove the connection from the count, you must call the
+<code>ranch:remove_connection/1</code> from within the connection process,
+with the name of the listener as the only argument.</p></div>
+<div class="listingblock">
+<div class="title">Removing a connection from the count of connections</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">ranch:remove_connection</span></span>(<span style="color: #009900">Ref</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>As seen in the chapter covering protocols, this pid is received as the
+first argument of the protocol&#8217;s <code>start_link/4</code> callback.</p></div>
+<div class="paragraph"><p>You can modify the <code>max_connections</code> value on a running listener by
+using the <code>ranch:set_max_connections/2</code> function, with the name of the
+listener as first argument and the new value as the second.</p></div>
+<div class="listingblock">
+<div class="title">Upgrading the maximum number of connections</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">ranch:set_max_connections</span></span>(<span style="color: #FF6600">tcp_echo</span>, <span style="color: #009900">MaxConns</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>The change will occur immediately.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_when_running_out_of_file_descriptors">When running out of file descriptors</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Operating systems have limits on the number of sockets
+which can be opened by applications. When this maximum is
+reached the listener can no longer accept new connections. The
+accept rate of the listener will be automatically reduced, and a
+warning message will be logged.</p></div>
+<div class="listingblock">
+<div class="content">
+<pre><code>=ERROR REPORT==== 13-Jan-2016::12:24:38 ===
+Ranch acceptor reducing accept rate: out of file descriptors</code></pre>
+</div></div>
+<div class="paragraph"><p>If you notice messages like this you should increase the number
+of file-descriptors which can be opened by your application. How
+this should be done is operating-system dependent. Please consult
+the documentation of your operating system.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_using_a_supervisor_for_connection_processes">Using a supervisor for connection processes</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Ranch allows you to define the type of process that will be used
+for the connection processes. By default it expects a <code>worker</code>.
+When the <code>connection_type</code> configuration value is set to <code>supervisor</code>,
+Ranch will consider that the connection process it manages is a
+supervisor and will reflect that in its supervision tree.</p></div>
+<div class="paragraph"><p>Connection processes of type <code>supervisor</code> can either handle the
+socket directly or through one of their children. In the latter
+case the start function for the connection process must return
+two pids: the pid of the supervisor you created (that will be
+supervised) and the pid of the protocol handling process (that
+will receive the socket).</p></div>
+<div class="paragraph"><p>Instead of returning <code>{ok, ConnPid}</code>, simply return
+<code>{ok, SupPid, ConnPid}</code>.</p></div>
+<div class="paragraph"><p>It is very important that the connection process be created
+under the supervisor process so that everything works as intended.
+If not, you will most likely experience issues when the supervised
+process is stopped.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_upgrading">Upgrading</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Ranch allows you to upgrade the protocol options. This takes effect
+immediately and for all subsequent connections.</p></div>
+<div class="paragraph"><p>To upgrade the protocol options, call <code>ranch:set_protocol_options/2</code>
+with the name of the listener as first argument and the new options
+as the second.</p></div>
+<div class="listingblock">
+<div class="title">Upgrading the protocol options</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">ranch:set_protocol_options</span></span>(<span style="color: #FF6600">tcp_echo</span>, <span style="color: #009900">NewOpts</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>All future connections will use the new options.</p></div>
+<div class="paragraph"><p>You can also retrieve the current options similarly by
+calling <code>ranch:get_protocol_options/1</code>.</p></div>
+<div class="listingblock">
+<div class="title">Retrieving the current protocol options</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #009900">Opts</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:get_protocol_options</span></span>(<span style="color: #FF6600">tcp_echo</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_obtain_information_about_listeners">Obtain information about listeners</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Ranch provides two functions for retrieving information about the
+listeners, for reporting and diagnostic purposes.</p></div>
+<div class="paragraph"><p>The <code>ranch:info/0</code> function will return detailed information
+about all listeners.</p></div>
+<div class="listingblock">
+<div class="title">Retrieving detailed information</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">ranch:info</span></span>()<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>The <code>ranch:procs/2</code> function will return all acceptor or listener
+processes for a given listener.</p></div>
+<div class="listingblock">
+<div class="title">Get all acceptor processes</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">ranch:procs</span></span>(<span style="color: #FF6600">tcp_echo</span>, <span style="color: #FF6600">acceptors</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="listingblock">
+<div class="title">Get all connection processes</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">ranch:procs</span></span>(<span style="color: #FF6600">tcp_echo</span>, <span style="color: #FF6600">connections</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+</div>
+</div>
+
+
+
+
+
+
+
+ <nav style="margin:1em 0">
+
+ <a style="float:left" href="https://ninenines.eu/docs/en/ranch/1.3/guide/introduction/">
+ Introduction
+ </a>
+
+
+
+ <a style="float:right" href="https://ninenines.eu/docs/en/ranch/1.3/guide/transports/">
+ Transports
+ </a>
+
+ </nav>
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+
+ User Guide
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/guide/parsers.asciidoc b/docs/en/ranch/1.3/guide/parsers.asciidoc
new file mode 100644
index 00000000..9eacbfa9
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/parsers.asciidoc
@@ -0,0 +1,92 @@
+== Writing parsers
+
+There are three kinds of protocols:
+
+* Text protocols
+* Schema-less binary protocols
+* Schema-based binary protocols
+
+This chapter introduces the first two kinds. It will not cover
+more advanced topics such as continuations or parser generators.
+
+This chapter isn't specifically about Ranch, we assume here that
+you know how to read data from the socket. The data you read and
+the data that hasn't been parsed is saved in a buffer. Every
+time you read from the socket, the data read is appended to the
+buffer. What happens next depends on the kind of protocol. We
+will only cover the first two.
+
+=== Parsing text
+
+Text protocols are generally line based. This means that we can't
+do anything with them until we receive the full line.
+
+A simple way to get a full line is to use `binary:split/{2,3}`.
+
+.Using binary:split/2 to get a line of input
+
+[source,erlang]
+case binary:split(Buffer, <<"\n">>) of
+ [_] ->
+ get_more_data(Buffer);
+ [Line, Rest] ->
+ handle_line(Line, Rest)
+end.
+
+In the above example, we can have two results. Either there was
+a line break in the buffer and we get it split into two parts,
+the line and the rest of the buffer; or there was no line break
+in the buffer and we need to get more data from the socket.
+
+Next, we need to parse the line. The simplest way is to again
+split, here on space. The difference is that we want to split
+on all spaces character, as we want to tokenize the whole string.
+
+.Using binary:split/3 to split text
+
+[source,erlang]
+case binary:split(Line, <<" ">>, [global]) of
+ [<<"HELLO">>] ->
+ be_polite();
+ [<<"AUTH">>, User, Password] ->
+ authenticate_user(User, Password);
+ [<<"QUIT">>, Reason] ->
+ quit(Reason)
+ %% ...
+end.
+
+Pretty simple, right? Match on the command name, get the rest
+of the tokens in variables and call the respective functions.
+
+After doing this, you will want to check if there is another
+line in the buffer, and handle it immediately if any.
+Otherwise wait for more data.
+
+=== Parsing binary
+
+Binary protocols can be more varied, although most of them are
+pretty similar. The first four bytes of a frame tend to be
+the size of the frame, which is followed by a certain number
+of bytes for the type of frame and then various parameters.
+
+Sometimes the size of the frame includes the first four bytes,
+sometimes not. Other times this size is encoded over two bytes.
+And even other times little-endian is used instead of big-endian.
+
+The general idea stays the same though.
+
+.Using binary pattern matching to split frames
+
+[source,erlang]
+<< Size:32, _/bits >> = Buffer,
+case Buffer of
+ << Frame:Size/binary, Rest/bits >> ->
+ handle_frame(Frame, Rest);
+ _ ->
+ get_more_data(Buffer)
+end.
+
+You will then need to parse this frame using binary pattern
+matching, and handle it. Then you will want to check if there
+is another frame fully received in the buffer, and handle it
+immediately if any. Otherwise wait for more data.
diff --git a/docs/en/ranch/1.3/guide/parsers/index.html b/docs/en/ranch/1.3/guide/parsers/index.html
new file mode 100644
index 00000000..96660915
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/parsers/index.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Writing parsers</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>Writing parsers</span></h1>
+
+<div class="paragraph"><p>There are three kinds of protocols:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+Text protocols
+</p>
+</li>
+<li>
+<p>
+Schema-less binary protocols
+</p>
+</li>
+<li>
+<p>
+Schema-based binary protocols
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>This chapter introduces the first two kinds. It will not cover
+more advanced topics such as continuations or parser generators.</p></div>
+<div class="paragraph"><p>This chapter isn&#8217;t specifically about Ranch, we assume here that
+you know how to read data from the socket. The data you read and
+the data that hasn&#8217;t been parsed is saved in a buffer. Every
+time you read from the socket, the data read is appended to the
+buffer. What happens next depends on the kind of protocol. We
+will only cover the first two.</p></div>
+<div class="sect1">
+<h2 id="_parsing_text">Parsing text</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Text protocols are generally line based. This means that we can&#8217;t
+do anything with them until we receive the full line.</p></div>
+<div class="paragraph"><p>A simple way to get a full line is to use <code>binary:split/{2,3}</code>.</p></div>
+<div class="listingblock">
+<div class="title">Using binary:split/2 to get a line of input</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #0000FF">case</span></span> <span style="font-weight: bold"><span style="color: #000000">binary:split</span></span>(<span style="color: #009900">Buffer</span>, <span style="color: #990000">&lt;&lt;</span><span style="color: #FF0000">"\n"</span><span style="color: #990000">&gt;&gt;</span>) <span style="font-weight: bold"><span style="color: #0000FF">of</span></span>
+ [<span style="color: #990000">_</span>] <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">get_more_data</span></span>(<span style="color: #009900">Buffer</span>);
+ [<span style="color: #009900">Line</span>, <span style="color: #009900">Rest</span>] <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">handle_line</span></span>(<span style="color: #009900">Line</span>, <span style="color: #009900">Rest</span>)
+<span style="font-weight: bold"><span style="color: #0000FF">end</span></span><span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>In the above example, we can have two results. Either there was
+a line break in the buffer and we get it split into two parts,
+the line and the rest of the buffer; or there was no line break
+in the buffer and we need to get more data from the socket.</p></div>
+<div class="paragraph"><p>Next, we need to parse the line. The simplest way is to again
+split, here on space. The difference is that we want to split
+on all spaces character, as we want to tokenize the whole string.</p></div>
+<div class="listingblock">
+<div class="title">Using binary:split/3 to split text</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #0000FF">case</span></span> <span style="font-weight: bold"><span style="color: #000000">binary:split</span></span>(<span style="color: #009900">Line</span>, <span style="color: #990000">&lt;&lt;</span><span style="color: #FF0000">" "</span><span style="color: #990000">&gt;&gt;</span>, [<span style="color: #FF6600">global</span>]) <span style="font-weight: bold"><span style="color: #0000FF">of</span></span>
+ [<span style="color: #990000">&lt;&lt;</span><span style="color: #FF0000">"HELLO"</span><span style="color: #990000">&gt;&gt;</span>] <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">be_polite</span></span>();
+ [<span style="color: #990000">&lt;&lt;</span><span style="color: #FF0000">"AUTH"</span><span style="color: #990000">&gt;&gt;</span>, <span style="color: #009900">User</span>, <span style="color: #009900">Password</span>] <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">authenticate_user</span></span>(<span style="color: #009900">User</span>, <span style="color: #009900">Password</span>);
+ [<span style="color: #990000">&lt;&lt;</span><span style="color: #FF0000">"QUIT"</span><span style="color: #990000">&gt;&gt;</span>, <span style="color: #009900">Reason</span>] <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">quit</span></span>(<span style="color: #009900">Reason</span>)
+ <span style="font-style: italic"><span style="color: #9A1900">%% ...</span></span>
+<span style="font-weight: bold"><span style="color: #0000FF">end</span></span><span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>Pretty simple, right? Match on the command name, get the rest
+of the tokens in variables and call the respective functions.</p></div>
+<div class="paragraph"><p>After doing this, you will want to check if there is another
+line in the buffer, and handle it immediately if any.
+Otherwise wait for more data.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_parsing_binary">Parsing binary</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Binary protocols can be more varied, although most of them are
+pretty similar. The first four bytes of a frame tend to be
+the size of the frame, which is followed by a certain number
+of bytes for the type of frame and then various parameters.</p></div>
+<div class="paragraph"><p>Sometimes the size of the frame includes the first four bytes,
+sometimes not. Other times this size is encoded over two bytes.
+And even other times little-endian is used instead of big-endian.</p></div>
+<div class="paragraph"><p>The general idea stays the same though.</p></div>
+<div class="listingblock">
+<div class="title">Using binary pattern matching to split frames</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #990000">&lt;&lt;</span> <span style="color: #009900">Size</span><span style="color: #990000">:</span><span style="color: #993399">32</span>, <span style="color: #990000">_/</span><span style="color: #FF6600">bits</span> <span style="color: #990000">&gt;&gt;</span> <span style="color: #990000">=</span> <span style="color: #009900">Buffer</span>,
+<span style="font-weight: bold"><span style="color: #0000FF">case</span></span> <span style="color: #009900">Buffer</span> <span style="font-weight: bold"><span style="color: #0000FF">of</span></span>
+ <span style="color: #990000">&lt;&lt;</span> <span style="color: #009900">Frame</span><span style="color: #990000">:</span><span style="color: #009900">Size</span><span style="color: #990000">/</span><span style="font-weight: bold"><span style="color: #000080">binary</span></span>, <span style="color: #009900">Rest</span><span style="color: #990000">/</span><span style="color: #FF6600">bits</span> <span style="color: #990000">&gt;&gt;</span> <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">handle_frame</span></span>(<span style="color: #009900">Frame</span>, <span style="color: #009900">Rest</span>);
+ <span style="color: #990000">_</span> <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">get_more_data</span></span>(<span style="color: #009900">Buffer</span>)
+<span style="font-weight: bold"><span style="color: #0000FF">end</span></span><span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>You will then need to parse this frame using binary pattern
+matching, and handle it. Then you will want to check if there
+is another frame fully received in the buffer, and handle it
+immediately if any. Otherwise wait for more data.</p></div>
+</div>
+</div>
+
+
+
+
+
+
+
+ <nav style="margin:1em 0">
+
+ <a style="float:left" href="https://ninenines.eu/docs/en/ranch/1.3/guide/embedded/">
+ Embedded mode
+ </a>
+
+
+
+ <a style="float:right" href="https://ninenines.eu/docs/en/ranch/1.3/guide/ssl_auth/">
+ SSL client authentication
+ </a>
+
+ </nav>
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+
+ User Guide
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/guide/protocols.asciidoc b/docs/en/ranch/1.3/guide/protocols.asciidoc
new file mode 100644
index 00000000..48c74ef5
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/protocols.asciidoc
@@ -0,0 +1,99 @@
+== Protocols
+
+A protocol handler starts a connection process and defines the
+protocol logic executed in this process.
+
+=== Writing a protocol handler
+
+All protocol handlers must implement the `ranch_protocol` behavior
+which defines a single callback, `start_link/4`. This callback is
+responsible for spawning a new process for handling the connection.
+It receives four arguments: the name of the listener, the socket, the
+transport handler being used and the protocol options defined in
+the call to `ranch:start_listener/6`. This callback must
+return `{ok, Pid}`, with `Pid` the pid of the new process.
+
+The newly started process can then freely initialize itself. However,
+it must call `ranch:accept_ack/1` before doing any socket operation.
+This will ensure the connection process is the owner of the socket.
+It expects the listener's name as argument.
+
+.Acknowledge accepting the socket
+
+[source,erlang]
+ok = ranch:accept_ack(Ref).
+
+If your protocol code requires specific socket options, you should
+set them while initializing your connection process, after
+calling `ranch:accept_ack/1`. You can use `Transport:setopts/2`
+for that purpose.
+
+Following is the complete protocol code for the example found
+in `examples/tcp_echo/`.
+
+.Protocol module that echoes everything it receives
+
+[source,erlang]
+----
+-module(echo_protocol).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/4]).
+
+start_link(Ref, Socket, Transport, Opts) ->
+ Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
+ {ok, Pid}.
+
+init(Ref, Socket, Transport, _Opts = []) ->
+ ok = ranch:accept_ack(Ref),
+ loop(Socket, Transport).
+
+loop(Socket, Transport) ->
+ case Transport:recv(Socket, 0, 5000) of
+ {ok, Data} ->
+ Transport:send(Socket, Data),
+ loop(Socket, Transport);
+ _ ->
+ ok = Transport:close(Socket)
+ end.
+----
+
+=== Using gen_server
+
+Special processes like the ones that use the `gen_server` or `gen_fsm`
+behaviours have the particularity of having their `start_link` call not
+return until the `init` function returns. This is problematic, because
+you won't be able to call `ranch:accept_ack/1` from the `init` callback
+as this would cause a deadlock to happen.
+
+Use the `gen_server:enter_loop/3` function. It allows you to start your process
+normally (although it must be started with `proc_lib` like all special
+processes), then perform any needed operations before falling back into
+the normal `gen_server` execution loop.
+
+.Use a gen_server for protocol handling
+
+[source,erlang]
+----
+-module(my_protocol).
+-behaviour(gen_server).
+-behaviour(ranch_protocol).
+
+-export([start_link/4]).
+-export([init/1]).
+%% Exports of other gen_server callbacks here.
+
+start_link(Ref, Socket, Transport, Opts) ->
+ {ok, proc_lib:spawn_link(?MODULE, init, [{Ref, Socket, Transport, Opts}])}.
+
+init({Ref, Socket, Transport, _Opts = []}) ->
+ %% Perform any required state initialization here.
+ ok = ranch:accept_ack(Ref),
+ ok = Transport:setopts(Socket, [{active, once}]),
+ gen_server:enter_loop(?MODULE, [], {state, Socket, Transport}).
+
+%% Other gen_server callbacks here.
+----
+
+Check the `tcp_reverse` example for a complete example.
diff --git a/docs/en/ranch/1.3/guide/protocols/index.html b/docs/en/ranch/1.3/guide/protocols/index.html
new file mode 100644
index 00000000..e2f3d946
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/protocols/index.html
@@ -0,0 +1,261 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Protocols</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>Protocols</span></h1>
+
+<div class="paragraph"><p>A protocol handler starts a connection process and defines the
+protocol logic executed in this process.</p></div>
+<div class="sect1">
+<h2 id="_writing_a_protocol_handler">Writing a protocol handler</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>All protocol handlers must implement the <code>ranch_protocol</code> behavior
+which defines a single callback, <code>start_link/4</code>. This callback is
+responsible for spawning a new process for handling the connection.
+It receives four arguments: the name of the listener, the socket, the
+transport handler being used and the protocol options defined in
+the call to <code>ranch:start_listener/6</code>. This callback must
+return <code>{ok, Pid}</code>, with <code>Pid</code> the pid of the new process.</p></div>
+<div class="paragraph"><p>The newly started process can then freely initialize itself. However,
+it must call <code>ranch:accept_ack/1</code> before doing any socket operation.
+This will ensure the connection process is the owner of the socket.
+It expects the listener&#8217;s name as argument.</p></div>
+<div class="listingblock">
+<div class="title">Acknowledge accepting the socket</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #0000FF">ok</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:accept_ack</span></span>(<span style="color: #009900">Ref</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>If your protocol code requires specific socket options, you should
+set them while initializing your connection process, after
+calling <code>ranch:accept_ack/1</code>. You can use <code>Transport:setopts/2</code>
+for that purpose.</p></div>
+<div class="paragraph"><p>Following is the complete protocol code for the example found
+in <code>examples/tcp_echo/</code>.</p></div>
+<div class="listingblock">
+<div class="title">Protocol module that echoes everything it receives</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000080">-module</span></span>(<span style="color: #FF6600">echo_protocol</span>)<span style="color: #990000">.</span>
+<span style="font-weight: bold"><span style="color: #000080">-behaviour</span></span>(<span style="color: #FF6600">ranch_protocol</span>)<span style="color: #990000">.</span>
+
+<span style="font-weight: bold"><span style="color: #000080">-export</span></span>([<span style="font-weight: bold"><span style="color: #000000">start_link</span></span><span style="color: #990000">/</span><span style="color: #993399">4</span>])<span style="color: #990000">.</span>
+<span style="font-weight: bold"><span style="color: #000080">-export</span></span>([<span style="font-weight: bold"><span style="color: #000000">init</span></span><span style="color: #990000">/</span><span style="color: #993399">4</span>])<span style="color: #990000">.</span>
+
+<span style="font-weight: bold"><span style="color: #000000">start_link</span></span>(<span style="color: #009900">Ref</span>, <span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>, <span style="color: #009900">Opts</span>) <span style="color: #990000">-&gt;</span>
+ <span style="color: #009900">Pid</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000080">spawn_link</span></span>(<span style="font-weight: bold"><span style="color: #000080">?MODULE</span></span>, <span style="color: #FF6600">init</span>, [<span style="color: #009900">Ref</span>, <span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>, <span style="color: #009900">Opts</span>]),
+ {<span style="color: #FF6600">ok</span>, <span style="color: #009900">Pid</span>}<span style="color: #990000">.</span>
+
+<span style="font-weight: bold"><span style="color: #000000">init</span></span>(<span style="color: #009900">Ref</span>, <span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>, <span style="color: #009900">_Opts</span> <span style="color: #990000">=</span> []) <span style="color: #990000">-&gt;</span>
+ <span style="color: #0000FF">ok</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:accept_ack</span></span>(<span style="color: #009900">Ref</span>),
+ <span style="font-weight: bold"><span style="color: #000000">loop</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>)<span style="color: #990000">.</span>
+
+<span style="font-weight: bold"><span style="color: #000000">loop</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>) <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">case</span></span> <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">recv</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #993399">0</span>, <span style="color: #993399">5000</span>) <span style="font-weight: bold"><span style="color: #0000FF">of</span></span>
+ {<span style="color: #FF6600">ok</span>, <span style="color: #009900">Data</span>} <span style="color: #990000">-&gt;</span>
+ <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">send</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">Data</span>),
+ <span style="font-weight: bold"><span style="color: #000000">loop</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>);
+ <span style="color: #990000">_</span> <span style="color: #990000">-&gt;</span>
+ <span style="color: #0000FF">ok</span> <span style="color: #990000">=</span> <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">close</span></span>(<span style="color: #009900">Socket</span>)
+ <span style="font-weight: bold"><span style="color: #0000FF">end</span></span><span style="color: #990000">.</span></tt></pre></div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_using_gen_server">Using gen_server</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Special processes like the ones that use the <code>gen_server</code> or <code>gen_fsm</code>
+behaviours have the particularity of having their <code>start_link</code> call not
+return until the <code>init</code> function returns. This is problematic, because
+you won&#8217;t be able to call <code>ranch:accept_ack/1</code> from the <code>init</code> callback
+as this would cause a deadlock to happen.</p></div>
+<div class="paragraph"><p>Use the <code>gen_server:enter_loop/3</code> function. It allows you to start your process
+normally (although it must be started with <code>proc_lib</code> like all special
+processes), then perform any needed operations before falling back into
+the normal <code>gen_server</code> execution loop.</p></div>
+<div class="listingblock">
+<div class="title">Use a gen_server for protocol handling</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000080">-module</span></span>(<span style="color: #FF6600">my_protocol</span>)<span style="color: #990000">.</span>
+<span style="font-weight: bold"><span style="color: #000080">-behaviour</span></span>(<span style="color: #FF6600">gen_server</span>)<span style="color: #990000">.</span>
+<span style="font-weight: bold"><span style="color: #000080">-behaviour</span></span>(<span style="color: #FF6600">ranch_protocol</span>)<span style="color: #990000">.</span>
+
+<span style="font-weight: bold"><span style="color: #000080">-export</span></span>([<span style="font-weight: bold"><span style="color: #000000">start_link</span></span><span style="color: #990000">/</span><span style="color: #993399">4</span>])<span style="color: #990000">.</span>
+<span style="font-weight: bold"><span style="color: #000080">-export</span></span>([<span style="font-weight: bold"><span style="color: #000000">init</span></span><span style="color: #990000">/</span><span style="color: #993399">1</span>])<span style="color: #990000">.</span>
+<span style="font-style: italic"><span style="color: #9A1900">%% Exports of other gen_server callbacks here.</span></span>
+
+<span style="font-weight: bold"><span style="color: #000000">start_link</span></span>(<span style="color: #009900">Ref</span>, <span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>, <span style="color: #009900">Opts</span>) <span style="color: #990000">-&gt;</span>
+ {<span style="color: #FF6600">ok</span>, <span style="font-weight: bold"><span style="color: #000000">proc_lib:spawn_link</span></span>(<span style="font-weight: bold"><span style="color: #000080">?MODULE</span></span>, <span style="color: #FF6600">init</span>, [{<span style="color: #009900">Ref</span>, <span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>, <span style="color: #009900">Opts</span>}])}<span style="color: #990000">.</span>
+
+<span style="font-weight: bold"><span style="color: #000000">init</span></span>({<span style="color: #009900">Ref</span>, <span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>, <span style="color: #009900">_Opts</span> <span style="color: #990000">=</span> []}) <span style="color: #990000">-&gt;</span>
+ <span style="font-style: italic"><span style="color: #9A1900">%% Perform any required state initialization here.</span></span>
+ <span style="color: #0000FF">ok</span> <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:accept_ack</span></span>(<span style="color: #009900">Ref</span>),
+ <span style="color: #0000FF">ok</span> <span style="color: #990000">=</span> <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">setopts</span></span>(<span style="color: #009900">Socket</span>, [{<span style="color: #FF6600">active</span>, <span style="color: #FF6600">once</span>}]),
+ <span style="font-weight: bold"><span style="color: #000000">gen_server:enter_loop</span></span>(<span style="font-weight: bold"><span style="color: #000080">?MODULE</span></span>, [], {<span style="color: #FF6600">state</span>, <span style="color: #009900">Socket</span>, <span style="color: #009900">Transport</span>})<span style="color: #990000">.</span>
+
+<span style="font-style: italic"><span style="color: #9A1900">%% Other gen_server callbacks here.</span></span></tt></pre></div></div>
+<div class="paragraph"><p>Check the <code>tcp_reverse</code> example for a complete example.</p></div>
+</div>
+</div>
+
+
+
+
+
+
+
+ <nav style="margin:1em 0">
+
+ <a style="float:left" href="https://ninenines.eu/docs/en/ranch/1.3/guide/transports/">
+ Transports
+ </a>
+
+
+
+ <a style="float:right" href="https://ninenines.eu/docs/en/ranch/1.3/guide/embedded/">
+ Embedded mode
+ </a>
+
+ </nav>
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+
+ User Guide
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/guide/ssl_auth.asciidoc b/docs/en/ranch/1.3/guide/ssl_auth.asciidoc
new file mode 100644
index 00000000..de0bbaf0
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/ssl_auth.asciidoc
@@ -0,0 +1,120 @@
+== SSL client authentication
+
+=== Purpose
+
+SSL client authentication is a mechanism allowing applications to
+identify certificates. This allows your application to make sure that
+the client is an authorized certificate, but makes no claim about
+whether the user can be trusted. This can be combined with a password
+based authentication to attain greater security.
+
+The server only needs to retain the certificate serial number and
+the certificate issuer to authenticate the certificate. Together,
+they can be used to uniquely identify a certicate.
+
+As Ranch allows the same protocol code to be used for both SSL and
+non-SSL transports, you need to make sure you are in an SSL context
+before attempting to perform an SSL client authentication. This
+can be done by checking the return value of `Transport:name/0`.
+
+=== Obtaining client certificates
+
+You can obtain client certificates from various sources. You can
+generate them yourself, or you can use a service like CAcert.org
+which allows you to generate client and server certificates for
+free.
+
+Following are the steps you need to take to create a CAcert.org
+account, generate a certificate and install it in your favorite
+browser.
+
+* Open http://cacert.org in your favorite browser
+* Root Certificate link: install both certificates
+* Join (Register an account)
+* Verify your account (check your email inbox!)
+* Log in
+* Client Certificates: New
+* Follow instructions to create the certificate
+* Install the certificate in your browser
+
+You can optionally save the certificate for later use, for example
+to extract the `IssuerID` information as will be detailed later on.
+
+=== Transport configuration
+
+The SSL transport does not request a client certificate by default.
+You need to specify the `{verify, verify_peer}` option when starting
+the listener to enable this behavior.
+
+.Configure a listener for SSL authentication
+
+[source,erlang]
+{ok, _} = ranch:start_listener(my_ssl, 100,
+ ranch_ssl, [
+ {port, SSLPort},
+ {certfile, PathToCertfile},
+ {cacertfile, PathToCACertfile},
+ {verify, verify_peer}
+ ],
+ my_protocol, []
+).
+
+In this example we set the required `port` and `certfile`, but also
+the `cacertfile` containing the CACert.org root certificate, and
+the option to request the client certificate.
+
+If you enable the `{verify, verify_peer}` option and the client does
+not have a client certificate configured for your domain, then no
+certificate will be sent. This allows you to use SSL for more than
+just authenticated clients.
+
+=== Authentication
+
+To authenticate users, you must first save the certificate information
+required. If you have your users' certificate files, you can simply
+load the certificate and retrieve the information directly.
+
+.Retrieve the issuer ID from a certificate
+
+[source,erlang]
+----
+certfile_to_issuer_id(Filename) ->
+ {ok, Data} = file:read_file(Filename),
+ [{'Certificate', Cert, not_encrypted}] = public_key:pem_decode(Data),
+ {ok, IssuerID} = public_key:pkix_issuer_id(Cert, self),
+ IssuerID.
+----
+
+The `IssuerID` variable contains both the certificate serial number
+and the certificate issuer stored in a tuple, so this value alone can
+be used to uniquely identify the user certificate. You can save this
+value in a database, a configuration file or any other place where an
+Erlang term can be stored and retrieved.
+
+To retrieve the `IssuerID` from a running connection, you need to first
+retrieve the client certificate and then extract this information from
+it. Ranch does not provide a function to retrieve the client certificate.
+Instead you can use the `ssl:peercert/1` function. Once you have the
+certificate, you can again use the `public_key:pkix_issuer_id/2` to
+extract the `IssuerID` value.
+
+The following function returns the `IssuerID` or `false` if no client
+certificate was found. This snippet is intended to be used from your
+protocol code.
+
+.Retrieve the issuer ID from the certificate for the current connection
+
+[source,erlang]
+----
+socket_to_issuer_id(Socket) ->
+ case ssl:peercert(Socket) of
+ {error, no_peercert} ->
+ false;
+ {ok, Cert} ->
+ {ok, IssuerID} = public_key:pkix_issuer_id(Cert, self),
+ IssuerID
+ end.
+----
+
+You then only need to match the `IssuerID` value to authenticate the
+user.
diff --git a/docs/en/ranch/1.3/guide/ssl_auth/index.html b/docs/en/ranch/1.3/guide/ssl_auth/index.html
new file mode 100644
index 00000000..868c2d1e
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/ssl_auth/index.html
@@ -0,0 +1,315 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: SSL client authentication</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>SSL client authentication</span></h1>
+
+<div class="sect1">
+<h2 id="_purpose">Purpose</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>SSL client authentication is a mechanism allowing applications to
+identify certificates. This allows your application to make sure that
+the client is an authorized certificate, but makes no claim about
+whether the user can be trusted. This can be combined with a password
+based authentication to attain greater security.</p></div>
+<div class="paragraph"><p>The server only needs to retain the certificate serial number and
+the certificate issuer to authenticate the certificate. Together,
+they can be used to uniquely identify a certicate.</p></div>
+<div class="paragraph"><p>As Ranch allows the same protocol code to be used for both SSL and
+non-SSL transports, you need to make sure you are in an SSL context
+before attempting to perform an SSL client authentication. This
+can be done by checking the return value of <code>Transport:name/0</code>.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_obtaining_client_certificates">Obtaining client certificates</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>You can obtain client certificates from various sources. You can
+generate them yourself, or you can use a service like CAcert.org
+which allows you to generate client and server certificates for
+free.</p></div>
+<div class="paragraph"><p>Following are the steps you need to take to create a CAcert.org
+account, generate a certificate and install it in your favorite
+browser.</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+Open <a href="http://cacert.org">http://cacert.org</a> in your favorite browser
+</p>
+</li>
+<li>
+<p>
+Root Certificate link: install both certificates
+</p>
+</li>
+<li>
+<p>
+Join (Register an account)
+</p>
+</li>
+<li>
+<p>
+Verify your account (check your email inbox!)
+</p>
+</li>
+<li>
+<p>
+Log in
+</p>
+</li>
+<li>
+<p>
+Client Certificates: New
+</p>
+</li>
+<li>
+<p>
+Follow instructions to create the certificate
+</p>
+</li>
+<li>
+<p>
+Install the certificate in your browser
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>You can optionally save the certificate for later use, for example
+to extract the <code>IssuerID</code> information as will be detailed later on.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_transport_configuration">Transport configuration</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The SSL transport does not request a client certificate by default.
+You need to specify the <code>{verify, verify_peer}</code> option when starting
+the listener to enable this behavior.</p></div>
+<div class="listingblock">
+<div class="title">Configure a listener for SSL authentication</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #FF6600">ok</span>, <span style="color: #990000">_</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">ranch:start_listener</span></span>(<span style="color: #FF6600">my_ssl</span>, <span style="color: #993399">100</span>,
+ <span style="color: #FF6600">ranch_ssl</span>, [
+ {<span style="color: #FF6600">port</span>, <span style="color: #009900">SSLPort</span>},
+ {<span style="color: #FF6600">certfile</span>, <span style="color: #009900">PathToCertfile</span>},
+ {<span style="color: #FF6600">cacertfile</span>, <span style="color: #009900">PathToCACertfile</span>},
+ {<span style="color: #FF6600">verify</span>, <span style="color: #FF6600">verify_peer</span>}
+ ],
+ <span style="color: #FF6600">my_protocol</span>, []
+)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>In this example we set the required <code>port</code> and <code>certfile</code>, but also
+the <code>cacertfile</code> containing the CACert.org root certificate, and
+the option to request the client certificate.</p></div>
+<div class="paragraph"><p>If you enable the <code>{verify, verify_peer}</code> option and the client does
+not have a client certificate configured for your domain, then no
+certificate will be sent. This allows you to use SSL for more than
+just authenticated clients.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_authentication">Authentication</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>To authenticate users, you must first save the certificate information
+required. If you have your users' certificate files, you can simply
+load the certificate and retrieve the information directly.</p></div>
+<div class="listingblock">
+<div class="title">Retrieve the issuer ID from a certificate</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">certfile_to_issuer_id</span></span>(<span style="color: #009900">Filename</span>) <span style="color: #990000">-&gt;</span>
+ {<span style="color: #FF6600">ok</span>, <span style="color: #009900">Data</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">file:read_file</span></span>(<span style="color: #009900">Filename</span>),
+ [{<span style="color: #FF6600">'Certificate'</span>, <span style="color: #009900">Cert</span>, <span style="color: #FF6600">not_encrypted</span>}] <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">public_key:pem_decode</span></span>(<span style="color: #009900">Data</span>),
+ {<span style="color: #FF6600">ok</span>, <span style="color: #009900">IssuerID</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">public_key:pkix_issuer_id</span></span>(<span style="color: #009900">Cert</span>, <span style="font-weight: bold"><span style="color: #000080">self</span></span>),
+ <span style="color: #009900">IssuerID</span><span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>The <code>IssuerID</code> variable contains both the certificate serial number
+and the certificate issuer stored in a tuple, so this value alone can
+be used to uniquely identify the user certificate. You can save this
+value in a database, a configuration file or any other place where an
+Erlang term can be stored and retrieved.</p></div>
+<div class="paragraph"><p>To retrieve the <code>IssuerID</code> from a running connection, you need to first
+retrieve the client certificate and then extract this information from
+it. Ranch does not provide a function to retrieve the client certificate.
+Instead you can use the <code>ssl:peercert/1</code> function. Once you have the
+certificate, you can again use the <code>public_key:pkix_issuer_id/2</code> to
+extract the <code>IssuerID</code> value.</p></div>
+<div class="paragraph"><p>The following function returns the <code>IssuerID</code> or <code>false</code> if no client
+certificate was found. This snippet is intended to be used from your
+protocol code.</p></div>
+<div class="listingblock">
+<div class="title">Retrieve the issuer ID from the certificate for the current connection</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">socket_to_issuer_id</span></span>(<span style="color: #009900">Socket</span>) <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">case</span></span> <span style="font-weight: bold"><span style="color: #000000">ssl:peercert</span></span>(<span style="color: #009900">Socket</span>) <span style="font-weight: bold"><span style="color: #0000FF">of</span></span>
+ {<span style="color: #FF6600">error</span>, <span style="color: #FF6600">no_peercert</span>} <span style="color: #990000">-&gt;</span>
+ <span style="color: #000080">false</span>;
+ {<span style="color: #FF6600">ok</span>, <span style="color: #009900">Cert</span>} <span style="color: #990000">-&gt;</span>
+ {<span style="color: #FF6600">ok</span>, <span style="color: #009900">IssuerID</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">public_key:pkix_issuer_id</span></span>(<span style="color: #009900">Cert</span>, <span style="font-weight: bold"><span style="color: #000080">self</span></span>),
+ <span style="color: #009900">IssuerID</span>
+ <span style="font-weight: bold"><span style="color: #0000FF">end</span></span><span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>You then only need to match the <code>IssuerID</code> value to authenticate the
+user.</p></div>
+</div>
+</div>
+
+
+
+
+
+
+
+ <nav style="margin:1em 0">
+
+ <a style="float:left" href="https://ninenines.eu/docs/en/ranch/1.3/guide/parsers/">
+ Writing parsers
+ </a>
+
+
+
+ <a style="float:right" href="https://ninenines.eu/docs/en/ranch/1.3/guide/internals/">
+ Internals
+ </a>
+
+ </nav>
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+
+ User Guide
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/guide/transports.asciidoc b/docs/en/ranch/1.3/guide/transports.asciidoc
new file mode 100644
index 00000000..f5bb17eb
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/transports.asciidoc
@@ -0,0 +1,161 @@
+== Transports
+
+A transport defines the interface to interact with a socket.
+
+Transports can be used for connecting, listening and accepting
+connections, but also for receiving and sending data. Both
+passive and active mode are supported, although all sockets
+are initialized as passive.
+
+=== TCP transport
+
+The TCP transport is a thin wrapper around `gen_tcp`.
+
+=== SSL transport
+
+The SSL transport is a thin wrapper around `ssl`.
+
+Ranch depends on `ssl` by default so any necessary
+dependencies will start when Ranch is started. It is
+possible to remove the dependency when the SSL transport
+will not be used. Refer to your release build tool's
+documentation for more information.
+
+When embedding Ranch listeners that have an SSL transport,
+your application must depend on the `ssl` application for
+proper behavior.
+
+=== Sending and receiving data
+
+This section assumes that `Transport` is a valid transport handler
+(like `ranch_tcp` or `ranch_ssl`) and `Socket` is a connected
+socket obtained through the listener.
+
+You can send data to a socket by calling the `Transport:send/2`
+function. The data can be given as `iodata()`, which is defined as
+`binary() | iolist()`. All the following calls will work:
+
+.Sending data to the socket
+
+[source,erlang]
+----
+Transport:send(Socket, <<"Ranch is cool!">>).
+Transport:send(Socket, "Ranch is cool!").
+Transport:send(Socket, ["Ranch", ["is", "cool!"]]).
+Transport:send(Socket, ["Ranch", [<<"is">>, "cool!"]]).
+----
+
+You can receive data either in passive or in active mode. Passive mode
+means that you will perform a blocking `Transport:recv/3` call, while
+active mode means that you will receive the data as a message.
+
+By default, all data will be received as binary. It is possible to
+receive data as strings, although this is not recommended as binaries
+are a more efficient construct, especially for binary protocols.
+
+Receiving data using passive mode requires a single function call. The
+first argument is the socket, and the third argument is a timeout duration
+before the call returns with `{error, timeout}`.
+
+The second argument is the amount of data in bytes that we want to receive.
+The function will wait for data until it has received exactly this amount.
+If you are not expecting a precise size, you can specify 0 which will make
+this call return as soon as data was read, regardless of its size.
+
+.Receiving data from the socket in passive mode
+
+[source,erlang]
+{ok, Data} = Transport:recv(Socket, 0, 5000).
+
+Active mode requires you to inform the socket that you want to receive
+data as a message and to write the code to actually receive it.
+
+There are two kinds of active modes: `{active, once}` and
+`{active, true}`. The first will send a single message before going
+back to passive mode; the second will send messages indefinitely.
+We recommend not using the `{active, true}` mode as it could quickly
+flood your process mailbox. It's better to keep the data in the socket
+and read it only when required.
+
+Three different messages can be received:
+
+* `{OK, Socket, Data}`
+* `{Closed, Socket}`
+* `{Error, Socket, Reason}`
+
+The value of `OK`, `Closed` and `Error` can be different
+depending on the transport being used. To be able to properly match
+on them you must first call the `Transport:messages/0` function.
+
+.Retrieving the transport's active message identifiers
+
+[source,erlang]
+{OK, Closed, Error} = Transport:messages().
+
+To start receiving messages you will need to call the `Transport:setopts/2`
+function, and do so every time you want to receive data.
+
+.Receiving messages from the socket in active mode
+
+[source,erlang]
+----
+{OK, Closed, Error} = Transport:messages(),
+Transport:setopts(Socket, [{active, once}]),
+receive
+ {OK, Socket, Data} ->
+ io:format("data received: ~p~n", [Data]);
+ {Closed, Socket} ->
+ io:format("socket got closed!~n");
+ {Error, Socket, Reason} ->
+ io:format("error happened: ~p~n", [Reason])
+end.
+----
+
+You can easily integrate active sockets with existing Erlang code as all
+you really need is just a few more clauses when receiving messages.
+
+=== Sending files
+
+As in the previous section it is assumed `Transport` is a valid transport
+handler and `Socket` is a connected socket obtained through the listener.
+
+To send a whole file, with name `Filename`, over a socket:
+
+.Sending a file by filename
+
+[source,erlang]
+{ok, SentBytes} = Transport:sendfile(Socket, Filename).
+
+Or part of a file, with `Offset` greater than or equal to 0, `Bytes` number of
+bytes and chunks of size `ChunkSize`:
+
+.Sending part of a file by filename in chunks
+
+[source,erlang]
+Opts = [{chunk_size, ChunkSize}],
+{ok, SentBytes} = Transport:sendfile(Socket, Filename, Offset, Bytes, Opts).
+
+To improve efficiency when sending multiple parts of the same file it is also
+possible to use a file descriptor opened in raw mode:
+
+.Sending a file opened in raw mode
+
+[source,erlang]
+{ok, RawFile} = file:open(Filename, [raw, read, binary]),
+{ok, SentBytes} = Transport:sendfile(Socket, RawFile, Offset, Bytes, Opts).
+
+=== Writing a transport handler
+
+A transport handler is a module implementing the `ranch_transport` behavior.
+It defines a certain number of callbacks that must be written in order to
+allow transparent usage of the transport handler.
+
+The behavior doesn't define the socket options available when opening a
+socket. These do not need to be common to all transports as it's easy enough
+to write different initialization functions for the different transports that
+will be used. With one exception though. The `setopts/2` function *must*
+implement the `{active, once}` and the `{active, true}` options.
+
+If the transport handler doesn't have a native implementation of `sendfile/5` a
+fallback is available, `ranch_transport:sendfile/6`. The extra first argument
+is the transport's module. See `ranch_ssl` for an example.
diff --git a/docs/en/ranch/1.3/guide/transports/index.html b/docs/en/ranch/1.3/guide/transports/index.html
new file mode 100644
index 00000000..b96517ac
--- /dev/null
+++ b/docs/en/ranch/1.3/guide/transports/index.html
@@ -0,0 +1,336 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Transports</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>Transports</span></h1>
+
+<div class="paragraph"><p>A transport defines the interface to interact with a socket.</p></div>
+<div class="paragraph"><p>Transports can be used for connecting, listening and accepting
+connections, but also for receiving and sending data. Both
+passive and active mode are supported, although all sockets
+are initialized as passive.</p></div>
+<div class="sect1">
+<h2 id="_tcp_transport">TCP transport</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The TCP transport is a thin wrapper around <code>gen_tcp</code>.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_ssl_transport">SSL transport</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The SSL transport is a thin wrapper around <code>ssl</code>.</p></div>
+<div class="paragraph"><p>Ranch depends on <code>ssl</code> by default so any necessary
+dependencies will start when Ranch is started. It is
+possible to remove the dependency when the SSL transport
+will not be used. Refer to your release build tool&#8217;s
+documentation for more information.</p></div>
+<div class="paragraph"><p>When embedding Ranch listeners that have an SSL transport,
+your application must depend on the <code>ssl</code> application for
+proper behavior.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_sending_and_receiving_data">Sending and receiving data</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>This section assumes that <code>Transport</code> is a valid transport handler
+(like <code>ranch_tcp</code> or <code>ranch_ssl</code>) and <code>Socket</code> is a connected
+socket obtained through the listener.</p></div>
+<div class="paragraph"><p>You can send data to a socket by calling the <code>Transport:send/2</code>
+function. The data can be given as <code>iodata()</code>, which is defined as
+<code>binary() | iolist()</code>. All the following calls will work:</p></div>
+<div class="listingblock">
+<div class="title">Sending data to the socket</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">send</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #990000">&lt;&lt;</span><span style="color: #FF0000">"Ranch is cool!"</span><span style="color: #990000">&gt;&gt;</span>)<span style="color: #990000">.</span>
+<span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">send</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #FF0000">"Ranch is cool!"</span>)<span style="color: #990000">.</span>
+<span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">send</span></span>(<span style="color: #009900">Socket</span>, [<span style="color: #FF0000">"Ranch"</span>, [<span style="color: #FF0000">"is"</span>, <span style="color: #FF0000">"cool!"</span>]])<span style="color: #990000">.</span>
+<span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">send</span></span>(<span style="color: #009900">Socket</span>, [<span style="color: #FF0000">"Ranch"</span>, [<span style="color: #990000">&lt;&lt;</span><span style="color: #FF0000">"is"</span><span style="color: #990000">&gt;&gt;</span>, <span style="color: #FF0000">"cool!"</span>]])<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>You can receive data either in passive or in active mode. Passive mode
+means that you will perform a blocking <code>Transport:recv/3</code> call, while
+active mode means that you will receive the data as a message.</p></div>
+<div class="paragraph"><p>By default, all data will be received as binary. It is possible to
+receive data as strings, although this is not recommended as binaries
+are a more efficient construct, especially for binary protocols.</p></div>
+<div class="paragraph"><p>Receiving data using passive mode requires a single function call. The
+first argument is the socket, and the third argument is a timeout duration
+before the call returns with <code>{error, timeout}</code>.</p></div>
+<div class="paragraph"><p>The second argument is the amount of data in bytes that we want to receive.
+The function will wait for data until it has received exactly this amount.
+If you are not expecting a precise size, you can specify 0 which will make
+this call return as soon as data was read, regardless of its size.</p></div>
+<div class="listingblock">
+<div class="title">Receiving data from the socket in passive mode</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #FF6600">ok</span>, <span style="color: #009900">Data</span>} <span style="color: #990000">=</span> <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">recv</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #993399">0</span>, <span style="color: #993399">5000</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>Active mode requires you to inform the socket that you want to receive
+data as a message and to write the code to actually receive it.</p></div>
+<div class="paragraph"><p>There are two kinds of active modes: <code>{active, once}</code> and
+<code>{active, true}</code>. The first will send a single message before going
+back to passive mode; the second will send messages indefinitely.
+We recommend not using the <code>{active, true}</code> mode as it could quickly
+flood your process mailbox. It&#8217;s better to keep the data in the socket
+and read it only when required.</p></div>
+<div class="paragraph"><p>Three different messages can be received:</p></div>
+<div class="ulist"><ul>
+<li>
+<p>
+<code>{OK, Socket, Data}</code>
+</p>
+</li>
+<li>
+<p>
+<code>{Closed, Socket}</code>
+</p>
+</li>
+<li>
+<p>
+<code>{Error, Socket, Reason}</code>
+</p>
+</li>
+</ul></div>
+<div class="paragraph"><p>The value of <code>OK</code>, <code>Closed</code> and <code>Error</code> can be different
+depending on the transport being used. To be able to properly match
+on them you must first call the <code>Transport:messages/0</code> function.</p></div>
+<div class="listingblock">
+<div class="title">Retrieving the transport&#8217;s active message identifiers</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #009900">OK</span>, <span style="color: #009900">Closed</span>, <span style="color: #009900">Error</span>} <span style="color: #990000">=</span> <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">messages</span></span>()<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>To start receiving messages you will need to call the <code>Transport:setopts/2</code>
+function, and do so every time you want to receive data.</p></div>
+<div class="listingblock">
+<div class="title">Receiving messages from the socket in active mode</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #009900">OK</span>, <span style="color: #009900">Closed</span>, <span style="color: #009900">Error</span>} <span style="color: #990000">=</span> <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">messages</span></span>(),
+<span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">setopts</span></span>(<span style="color: #009900">Socket</span>, [{<span style="color: #FF6600">active</span>, <span style="color: #FF6600">once</span>}]),
+<span style="font-weight: bold"><span style="color: #0000FF">receive</span></span>
+ {<span style="color: #009900">OK</span>, <span style="color: #009900">Socket</span>, <span style="color: #009900">Data</span>} <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">io:format</span></span>(<span style="color: #FF0000">"data received: ~p~n"</span>, [<span style="color: #009900">Data</span>]);
+ {<span style="color: #009900">Closed</span>, <span style="color: #009900">Socket</span>} <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">io:format</span></span>(<span style="color: #FF0000">"socket got closed!~n"</span>);
+ {<span style="color: #009900">Error</span>, <span style="color: #009900">Socket</span>, <span style="color: #009900">Reason</span>} <span style="color: #990000">-&gt;</span>
+ <span style="font-weight: bold"><span style="color: #000000">io:format</span></span>(<span style="color: #FF0000">"error happened: ~p~n"</span>, [<span style="color: #009900">Reason</span>])
+<span style="font-weight: bold"><span style="color: #0000FF">end</span></span><span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>You can easily integrate active sockets with existing Erlang code as all
+you really need is just a few more clauses when receiving messages.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_sending_files">Sending files</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>As in the previous section it is assumed <code>Transport</code> is a valid transport
+handler and <code>Socket</code> is a connected socket obtained through the listener.</p></div>
+<div class="paragraph"><p>To send a whole file, with name <code>Filename</code>, over a socket:</p></div>
+<div class="listingblock">
+<div class="title">Sending a file by filename</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #FF6600">ok</span>, <span style="color: #009900">SentBytes</span>} <span style="color: #990000">=</span> <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">sendfile</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">Filename</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>Or part of a file, with <code>Offset</code> greater than or equal to 0, <code>Bytes</code> number of
+bytes and chunks of size <code>ChunkSize</code>:</p></div>
+<div class="listingblock">
+<div class="title">Sending part of a file by filename in chunks</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="color: #009900">Opts</span> <span style="color: #990000">=</span> [{<span style="color: #FF6600">chunk_size</span>, <span style="color: #009900">ChunkSize</span>}],
+{<span style="color: #FF6600">ok</span>, <span style="color: #009900">SentBytes</span>} <span style="color: #990000">=</span> <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">sendfile</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">Filename</span>, <span style="color: #009900">Offset</span>, <span style="color: #009900">Bytes</span>, <span style="color: #009900">Opts</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>To improve efficiency when sending multiple parts of the same file it is also
+possible to use a file descriptor opened in raw mode:</p></div>
+<div class="listingblock">
+<div class="title">Sending a file opened in raw mode</div>
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt>{<span style="color: #FF6600">ok</span>, <span style="color: #009900">RawFile</span>} <span style="color: #990000">=</span> <span style="font-weight: bold"><span style="color: #000000">file:open</span></span>(<span style="color: #009900">Filename</span>, [<span style="color: #FF6600">raw</span>, <span style="color: #FF6600">read</span>, <span style="font-weight: bold"><span style="color: #000080">binary</span></span>]),
+{<span style="color: #FF6600">ok</span>, <span style="color: #009900">SentBytes</span>} <span style="color: #990000">=</span> <span style="color: #009900">Transport</span><span style="color: #990000">:</span><span style="font-weight: bold"><span style="color: #000000">sendfile</span></span>(<span style="color: #009900">Socket</span>, <span style="color: #009900">RawFile</span>, <span style="color: #009900">Offset</span>, <span style="color: #009900">Bytes</span>, <span style="color: #009900">Opts</span>)<span style="color: #990000">.</span></tt></pre></div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_writing_a_transport_handler">Writing a transport handler</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>A transport handler is a module implementing the <code>ranch_transport</code> behavior.
+It defines a certain number of callbacks that must be written in order to
+allow transparent usage of the transport handler.</p></div>
+<div class="paragraph"><p>The behavior doesn&#8217;t define the socket options available when opening a
+socket. These do not need to be common to all transports as it&#8217;s easy enough
+to write different initialization functions for the different transports that
+will be used. With one exception though. The <code>setopts/2</code> function <strong>must</strong>
+implement the <code>{active, once}</code> and the <code>{active, true}</code> options.</p></div>
+<div class="paragraph"><p>If the transport handler doesn&#8217;t have a native implementation of <code>sendfile/5</code> a
+fallback is available, <code>ranch_transport:sendfile/6</code>. The extra first argument
+is the transport&#8217;s module. See <code>ranch_ssl</code> for an example.</p></div>
+</div>
+</div>
+
+
+
+
+
+
+
+ <nav style="margin:1em 0">
+
+ <a style="float:left" href="https://ninenines.eu/docs/en/ranch/1.3/guide/listeners/">
+ Listeners
+ </a>
+
+
+
+ <a style="float:right" href="https://ninenines.eu/docs/en/ranch/1.3/guide/protocols/">
+ Protocols
+ </a>
+
+ </nav>
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+
+ User Guide
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/guide">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/guide">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/manual/index.html b/docs/en/ranch/1.3/manual/index.html
new file mode 100644
index 00000000..df038c0e
--- /dev/null
+++ b/docs/en/ranch/1.3/manual/index.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: Ranch Function Reference</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>Ranch Function Reference</span></h1>
+
+<div class="ulist"><ul>
+<li>
+<p>
+<a href="ranch_app">ranch(7)</a>
+</p>
+</li>
+<li>
+<p>
+<a href="ranch">ranch(3)</a>
+</p>
+</li>
+<li>
+<p>
+<a href="ranch_protocol">ranch_protocol(3)</a>
+</p>
+</li>
+<li>
+<p>
+<a href="ranch_ssl">ranch_ssl(3)</a>
+</p>
+</li>
+<li>
+<p>
+<a href="ranch_tcp">ranch_tcp(3)</a>
+</p>
+</li>
+<li>
+<p>
+<a href="ranch_transport">ranch_transport(3)</a>
+</p>
+</li>
+</ul></div>
+
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+ Function Reference
+
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/manual/ranch/index.html b/docs/en/ranch/1.3/manual/ranch/index.html
new file mode 100644
index 00000000..ef89eff1
--- /dev/null
+++ b/docs/en/ranch/1.3/manual/ranch/index.html
@@ -0,0 +1,696 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: ranch(3)</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>ranch(3)</span></h1>
+
+<div class="sect1">
+<h2 id="_name">Name</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>ranch - socket acceptor pool</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">Description</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The <code>ranch</code> module provides functions for starting and
+manipulating Ranch listeners.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_types">Types</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_max_conns_non_neg_integer_infinity">max_conns() = non_neg_integer() | infinity</h3>
+<div class="paragraph"><p>Maximum number of connections allowed on this listener.</p></div>
+<div class="paragraph"><p>This is a soft limit. The actual number of connections
+might be slightly above the limit due to concurrency
+when accepting new connections. Some connections may
+also be removed from this count explicitly by the user
+code.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_opt">opt()</h3>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">opt</span></span>() <span style="color: #990000">=</span> {<span style="color: #FF6600">ack_timeout</span>, <span style="font-weight: bold"><span style="color: #000000">timeout</span></span>()}
+ | {<span style="color: #FF6600">connection_type</span>, <span style="color: #FF6600">worker</span> | <span style="color: #FF6600">supervisor</span>}
+ | {<span style="color: #FF6600">max_connections</span>, <span style="font-weight: bold"><span style="color: #000000">max_conns</span></span>()}
+ | {<span style="color: #000080">shutdown</span>, <span style="font-weight: bold"><span style="color: #000000">timeout</span></span>() | <span style="color: #FF6600">brutal_kill</span>}
+ | {<span style="color: #FF6600">socket</span>, <span style="font-weight: bold"><span style="color: #000000">any</span></span>()}</tt></pre></div></div>
+<div class="paragraph"><p>Ranch-specific transport options.</p></div>
+<div class="paragraph"><p>These options are not passed on to the transports.
+They are used by Ranch while setting up the listeners.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_ref_any">ref() = any()</h3>
+<div class="paragraph"><p>Unique name used to refer to a listener.</p></div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_option_descriptions">Option descriptions</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>None of the options are required.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+ack_timeout (5000)
+</dt>
+<dd>
+<p>
+ Maximum allowed time for the <code>ranch:accept_ack/1</code> call to finish.
+</p>
+</dd>
+<dt class="hdlist1">
+connection_type (worker)
+</dt>
+<dd>
+<p>
+ Type of process that will handle the connection.
+</p>
+</dd>
+<dt class="hdlist1">
+max_connections (1024)
+</dt>
+<dd>
+<p>
+ Maximum number of active connections. Soft limit. Using <code>infinity</code> will disable the limit entirely.
+</p>
+</dd>
+<dt class="hdlist1">
+shutdown (5000)
+</dt>
+<dd>
+<p>
+ Maximum allowed time for children to stop on listener shutdown.
+</p>
+</dd>
+<dt class="hdlist1">
+socket
+</dt>
+<dd>
+<p>
+ Listening socket opened externally to be used instead of calling <code>Transport:listen/1</code>.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_exports">Exports</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_accept_ack_ref_8594_ok">accept_ack(Ref) &#8594; ok</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Acknowledge that the connection is accepted.</p></div>
+<div class="paragraph"><p>This function MUST be used by a connection process to inform
+Ranch that it initialized properly and let it perform any
+additional operations before the socket can be safely used.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_child_spec_ref_numacceptors_transport_transopts_protocol_protoopts_8594_supervisor_child_spec">child_spec(Ref, NumAcceptors, Transport, TransOpts, Protocol, ProtoOpts) &#8594; supervisor:child_spec()</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+NumAcceptors = non_neg_integer()
+</dt>
+<dd>
+<p>
+Number of acceptor processes.
+</p>
+</dd>
+<dt class="hdlist1">
+Transport = module()
+</dt>
+<dd>
+<p>
+Transport module.
+</p>
+</dd>
+<dt class="hdlist1">
+TransOpts = any()
+</dt>
+<dd>
+<p>
+Transport options.
+</p>
+</dd>
+<dt class="hdlist1">
+Protocol = module()
+</dt>
+<dd>
+<p>
+Protocol module.
+</p>
+</dd>
+<dt class="hdlist1">
+ProtoOpts = any()
+</dt>
+<dd>
+<p>
+Protocol options.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return child specifications for a new listener.</p></div>
+<div class="paragraph"><p>This function can be used to embed a listener directly
+in an application instead of letting Ranch handle it.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_get_addr_ref_8594_ip_port">get_addr(Ref) &#8594; {IP, Port}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+IP = inet:ip_address()
+</dt>
+<dd>
+<p>
+IP of the interface used by this listener.
+</p>
+</dd>
+<dt class="hdlist1">
+Port = inet:port_number()
+</dt>
+<dd>
+<p>
+Port number used by this listener.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return the IP address and port for the given listener.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_get_max_connections_ref_8594_maxconns">get_max_connections(Ref) &#8594; MaxConns</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+MaxConns = max_conns()
+</dt>
+<dd>
+<p>
+Current maximum number of connections.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return the max number of connections allowed for the given listener.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_get_port_ref_8594_port">get_port(Ref) &#8594; Port</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+Port = inet:port_number()
+</dt>
+<dd>
+<p>
+Port number used by this listener.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return the port for the given listener.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_get_protocol_options_ref_8594_protoopts">get_protocol_options(Ref) &#8594; ProtoOpts</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+ProtoOpts = any()
+</dt>
+<dd>
+<p>
+Current protocol options.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return the protocol options set for the given listener.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_info_8594_ref_key_value">info() &#8594; [{Ref, [{Key, Value}]}]</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+Key = atom()
+</dt>
+<dd>
+<p>
+Information key.
+</p>
+</dd>
+<dt class="hdlist1">
+Value = any()
+</dt>
+<dd>
+<p>
+Information value.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return detailed information about all Ranch listeners.</p></div>
+<div class="paragraph"><p>The following keys are defined:</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+pid
+</dt>
+<dd>
+<p>
+Pid of the listener&#8217;s top-level supervisor.
+</p>
+</dd>
+<dt class="hdlist1">
+ip
+</dt>
+<dd>
+<p>
+Interface Ranch listens on.
+</p>
+</dd>
+<dt class="hdlist1">
+port
+</dt>
+<dd>
+<p>
+Port number Ranch listens on.
+</p>
+</dd>
+<dt class="hdlist1">
+num_acceptors
+</dt>
+<dd>
+<p>
+Number of acceptor processes.
+</p>
+</dd>
+<dt class="hdlist1">
+max_connections
+</dt>
+<dd>
+<p>
+Maximum number of connections.
+</p>
+</dd>
+<dt class="hdlist1">
+active_connections
+</dt>
+<dd>
+<p>
+Number of active connections.
+</p>
+</dd>
+<dt class="hdlist1">
+all_connections
+</dt>
+<dd>
+<p>
+Number of connections, including those removed from the count.
+</p>
+</dd>
+<dt class="hdlist1">
+transport
+</dt>
+<dd>
+<p>
+Transport module.
+</p>
+</dd>
+<dt class="hdlist1">
+transport_options
+</dt>
+<dd>
+<p>
+Transport options.
+</p>
+</dd>
+<dt class="hdlist1">
+protocol
+</dt>
+<dd>
+<p>
+Protocol module.
+</p>
+</dd>
+<dt class="hdlist1">
+protocol_options
+</dt>
+<dd>
+<p>
+Protocol options.
+</p>
+</dd>
+</dl></div>
+</div>
+<div class="sect2">
+<h3 id="_procs_ref_acceptors_connections_8594_pid">procs(Ref, acceptors | connections) &#8594; [pid()]</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return all acceptor or connection processes for one listener.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_remove_connection_ref_8594_ok">remove_connection(Ref) &#8594; ok</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Do not count this connection when limiting the number of connections.</p></div>
+<div class="paragraph"><p>You can use this function for long-running connection processes
+which spend most of their time idling rather than consuming
+resources. This allows Ranch to accept a lot more connections
+without sacrificing the latency of the system.</p></div>
+<div class="paragraph"><p>This function may only be called from a connection process.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_set_max_connections_ref_maxconns_8594_ok">set_max_connections(Ref, MaxConns) &#8594; ok</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+MaxConns = max_conns()
+</dt>
+<dd>
+<p>
+New maximum number of connections.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Set the max number of connections for the given listener.</p></div>
+<div class="paragraph"><p>The change will be applied immediately. If the new value is
+smaller than the previous one, Ranch will not kill the extra
+connections, but will wait for them to terminate properly.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_set_protocol_options_ref_protoopts_8594_ok">set_protocol_options(Ref, ProtoOpts) &#8594; ok</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+ProtoOpts = any()
+</dt>
+<dd>
+<p>
+New protocol options.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Set the protocol options for the given listener.</p></div>
+<div class="paragraph"><p>The change will be applied immediately for all new connections.
+Old connections will not receive the new options.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_start_listener_ref_numacceptors_transport_transopts_protocol_protoopts_8594_ok_pid_error_badarg">start_listener(Ref, NumAcceptors, Transport, TransOpts, Protocol, ProtoOpts) &#8594; {ok, pid()} | {error, badarg}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+NumAcceptors = non_neg_integer()
+</dt>
+<dd>
+<p>
+Number of acceptor processes.
+</p>
+</dd>
+<dt class="hdlist1">
+Transport = module()
+</dt>
+<dd>
+<p>
+Transport module.
+</p>
+</dd>
+<dt class="hdlist1">
+TransOpts = any()
+</dt>
+<dd>
+<p>
+Transport options.
+</p>
+</dd>
+<dt class="hdlist1">
+Protocol = module()
+</dt>
+<dd>
+<p>
+Protocol module.
+</p>
+</dd>
+<dt class="hdlist1">
+ProtoOpts = any()
+</dt>
+<dd>
+<p>
+Protocol options.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Start listening for connections using the given transport
+and protocol. Returns the pid for this listener&#8217;s supervisor.</p></div>
+<div class="paragraph"><p>There are additional transport options that apply
+regardless of transport. They allow configuring how the
+connections are supervised, rate limited and more. Please
+consult the previous section for more details.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_stop_listener_ref_8594_ok_error_not_found">stop_listener(Ref) &#8594; ok | {error, not_found}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Stop the given listener.</p></div>
+<div class="paragraph"><p>The listener is stopped gracefully, first by closing the
+listening port, then by stopping the connection processes.
+These processes are stopped according to the <code>shutdown</code>
+transport option, which may be set to brutally kill all
+connection processes or give them some time to stop properly.</p></div>
+<div class="paragraph"><p>This function does not return until the listener is
+completely stopped.</p></div>
+</div>
+</div>
+</div>
+
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+ Function Reference
+
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/manual/ranch_app/index.html b/docs/en/ranch/1.3/manual/ranch_app/index.html
new file mode 100644
index 00000000..c5ce74d1
--- /dev/null
+++ b/docs/en/ranch/1.3/manual/ranch_app/index.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: ranch(7)</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>ranch(7)</span></h1>
+
+<div class="sect1">
+<h2 id="_name">Name</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>ranch - Socket acceptor pool for TCP protocols.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_dependencies">Dependencies</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The <code>ranch</code> application depends on the <code>ssl</code> application to
+start. It is used for handling secure connections, when the
+transport is <code>ranch_ssl</code>. It can be disabled if SSL is not
+used.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_environment">Environment</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The <code>ranch</code> application defines one application environment
+configuration parameter.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+profile (false)
+</dt>
+<dd>
+<p>
+ When enabled, Ranch will start <code>eprof</code> profiling automatically.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>You can use the <code>ranch_app:profile_output/0</code> function to stop
+profiling and output the results to the files <em>procs.profile</em>
+and <em>total.profile</em>. Do not use in production.</p></div>
+</div>
+</div>
+
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+ Function Reference
+
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/manual/ranch_protocol/index.html b/docs/en/ranch/1.3/manual/ranch_protocol/index.html
new file mode 100644
index 00000000..05c77ee1
--- /dev/null
+++ b/docs/en/ranch/1.3/manual/ranch_protocol/index.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: ranch_protocol(3)</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>ranch_protocol(3)</span></h1>
+
+<div class="sect1">
+<h2 id="_name">Name</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>ranch_protocol - behaviour for protocol modules</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">Description</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The <code>ranch_protocol</code> behaviour defines the interface used
+by Ranch protocols.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_types">Types</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>None.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_callbacks">Callbacks</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_start_link_ref_socket_transport_protoopts_8594_ok_pid_ok_pid_pid">start_link(Ref, Socket, Transport, ProtoOpts) &#8594; {ok, pid()} | {ok, pid(), pid()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Ref = ranch:ref()
+</dt>
+<dd>
+<p>
+Listener name.
+</p>
+</dd>
+<dt class="hdlist1">
+Socket = any()
+</dt>
+<dd>
+<p>
+Socket for this connection.
+</p>
+</dd>
+<dt class="hdlist1">
+Transport = module()
+</dt>
+<dd>
+<p>
+Transport module for this socket.
+</p>
+</dd>
+<dt class="hdlist1">
+ProtoOpts = any()
+</dt>
+<dd>
+<p>
+Protocol options.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Start a new connection process for the given socket.</p></div>
+<div class="paragraph"><p>The only purpose of this callback is to start a process that
+will handle the socket. It must spawn the process, link and
+then return the new pid. This function will always be called
+from inside a supervisor.</p></div>
+<div class="paragraph"><p>This callback can also return two pids. The first pid is the
+pid of the process that will be supervised. The second pid is
+the pid of the process that will receive ownership of the
+socket. This second process must be a child of the first. This
+form is only available when <code>connection_type</code> is set to
+<code>supervisor</code>.</p></div>
+<div class="paragraph"><p>If any other value is returned, the supervisor will close the
+socket and assume no process has been started.</p></div>
+<div class="paragraph"><p>Do not perform any operations in this callback, as this would
+block the supervisor responsible for starting connection
+processes and degrade performance severely.</p></div>
+</div>
+</div>
+</div>
+
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+ Function Reference
+
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/manual/ranch_ssl/index.html b/docs/en/ranch/1.3/manual/ranch_ssl/index.html
new file mode 100644
index 00000000..c54a9dbe
--- /dev/null
+++ b/docs/en/ranch/1.3/manual/ranch_ssl/index.html
@@ -0,0 +1,523 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: ranch_ssl(3)</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>ranch_ssl(3)</span></h1>
+
+<div class="sect1">
+<h2 id="_name">Name</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>ranch_ssl - SSL transport module</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">Description</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The <code>ranch_ssl</code> module implements an SSL Ranch transport.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_types">Types</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_ssl_opt">ssl_opt()</h3>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">ssl_opt</span></span>() <span style="color: #990000">=</span> {<span style="color: #FF6600">alpn_preferred_protocols</span>, [<span style="font-weight: bold"><span style="color: #000080">binary</span></span>()]}
+ | {<span style="color: #FF6600">beast_mitigation</span>, <span style="color: #FF6600">one_n_minus_one</span> | <span style="color: #FF6600">zero_n</span> | <span style="color: #FF6600">disabled</span>}
+ | {<span style="color: #FF6600">cacertfile</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
+ | {<span style="color: #FF6600">cacerts</span>, [<span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()]}
+ | {<span style="color: #FF6600">cert</span>, <span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()}
+ | {<span style="color: #FF6600">certfile</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
+ | {<span style="color: #FF6600">ciphers</span>, [<span style="font-weight: bold"><span style="color: #000000">ssl:erl_cipher_suite</span></span>()] | <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
+ | {<span style="color: #FF6600">client_renegotiation</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">crl_cache</span>, {<span style="font-weight: bold"><span style="color: #000000">module</span></span>(), {<span style="color: #FF6600">internal</span> | <span style="font-weight: bold"><span style="color: #000000">any</span></span>(), <span style="font-weight: bold"><span style="color: #000080">list</span></span>()}}}
+ | {<span style="color: #FF6600">crl_check</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>() | <span style="color: #FF6600">peer</span> | <span style="color: #FF6600">best_effort</span>}
+ | {<span style="color: #FF6600">depth</span>, <span style="color: #993399">0</span><span style="color: #990000">..</span><span style="color: #993399">255</span>}
+ | {<span style="color: #FF6600">dh</span>, <span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()}
+ | {<span style="color: #FF6600">dhfile</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
+ | {<span style="color: #FF6600">fail_if_no_peer_cert</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">hibernate_after</span>, <span style="font-weight: bold"><span style="color: #000080">integer</span></span>() | <span style="color: #000080">undefined</span>}
+ | {<span style="color: #FF6600">honor_cipher_order</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">key</span>, {<span style="color: #FF6600">'RSAPrivateKey'</span> | <span style="color: #FF6600">'DSAPrivateKey'</span> | <span style="color: #FF6600">'PrivateKeyInfo'</span>, <span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()}}
+ | {<span style="color: #FF6600">keyfile</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
+ | {<span style="color: #FF6600">log_alert</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">next_protocols_advertised</span>, [<span style="font-weight: bold"><span style="color: #000080">binary</span></span>()]}
+ | {<span style="color: #FF6600">padding_check</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">partial_chain</span>, <span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>(([<span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()]) <span style="color: #990000">-&gt;</span> {<span style="color: #FF6600">trusted_ca</span>, <span style="font-weight: bold"><span style="color: #000000">public_key:der_encoded</span></span>()} | <span style="color: #FF6600">unknown_ca</span>)}
+ | {<span style="color: #FF6600">password</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
+ | {<span style="color: #FF6600">psk_identity</span>, <span style="font-weight: bold"><span style="color: #000000">string</span></span>()}
+ | {<span style="color: #FF6600">reuse_session</span>, <span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>()}
+ | {<span style="color: #FF6600">reuse_sessions</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">secure_renegotiate</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">signature_algs</span>, [{<span style="font-weight: bold"><span style="color: #000080">atom</span></span>(), <span style="font-weight: bold"><span style="color: #000080">atom</span></span>()}]}
+ | {<span style="color: #FF6600">sni_fun</span>, <span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>()}
+ | {<span style="color: #FF6600">sni_hosts</span>, [{<span style="font-weight: bold"><span style="color: #000000">string</span></span>(), <span style="font-weight: bold"><span style="color: #000000">ssl_opt</span></span>()}]}
+ | {<span style="color: #FF6600">user_lookup_fun</span>, {<span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>(), <span style="font-weight: bold"><span style="color: #000000">any</span></span>()}}
+ | {<span style="color: #FF6600">v2_hello_compatible</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">verify</span>, <span style="font-weight: bold"><span style="color: #000000">ssl:verify_type</span></span>()}
+ | {<span style="color: #FF6600">verify_fun</span>, {<span style="font-weight: bold"><span style="color: #0000FF">fun</span></span>(), <span style="font-weight: bold"><span style="color: #000000">any</span></span>()}}
+ | {<span style="color: #FF6600">versions</span>, [<span style="font-weight: bold"><span style="color: #000080">atom</span></span>()]}<span style="color: #990000">.</span></tt></pre></div></div>
+<div class="paragraph"><p>SSL-specific listen options.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_opt_ranch_tcp_opt_ssl_opt">opt() = ranch_tcp:opt() | ssl_opt()</h3>
+<div class="paragraph"><p>Listen options.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_opts_opt">opts() = [opt()]</h3>
+<div class="paragraph"><p>List of listen options.</p></div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_option_descriptions">Option descriptions</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Specifying a certificate is mandatory, either through the <code>cert</code>
+or the <code>certfile</code> option. None of the other options are required.</p></div>
+<div class="paragraph"><p>The default value is given next to the option name.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+alpn_preferred_protocols
+</dt>
+<dd>
+<p>
+ Perform Application-Layer Protocol Negotiation with the given list of preferred protocols.
+</p>
+</dd>
+<dt class="hdlist1">
+beast_mitigation
+</dt>
+<dd>
+<p>
+ Change the BEAST mitigation strategy for SSL-3.0 and TLS-1.0 to interoperate with legacy software.
+</p>
+</dd>
+<dt class="hdlist1">
+cacertfile
+</dt>
+<dd>
+<p>
+ Path to PEM encoded trusted certificates file used to verify peer certificates.
+</p>
+</dd>
+<dt class="hdlist1">
+cacerts
+</dt>
+<dd>
+<p>
+ List of DER encoded trusted certificates.
+</p>
+</dd>
+<dt class="hdlist1">
+cert
+</dt>
+<dd>
+<p>
+ DER encoded user certificate.
+</p>
+</dd>
+<dt class="hdlist1">
+certfile
+</dt>
+<dd>
+<p>
+ Path to the PEM encoded user certificate file. May also contain the private key.
+</p>
+</dd>
+<dt class="hdlist1">
+ciphers
+</dt>
+<dd>
+<p>
+ List of ciphers that clients are allowed to use.
+</p>
+</dd>
+<dt class="hdlist1">
+client_renegotiation (true)
+</dt>
+<dd>
+<p>
+ Whether to allow client-initiated renegotiation.
+</p>
+</dd>
+<dt class="hdlist1">
+crl_cache ({ssl_crl_cache, {internal, []}})
+</dt>
+<dd>
+<p>
+ Customize the module used to cache Certificate Revocation Lists.
+</p>
+</dd>
+<dt class="hdlist1">
+crl_check (false)
+</dt>
+<dd>
+<p>
+ Whether to perform CRL check on all certificates in the chain during validation.
+</p>
+</dd>
+<dt class="hdlist1">
+depth (1)
+</dt>
+<dd>
+<p>
+ Maximum of intermediate certificates allowed in the certification path.
+</p>
+</dd>
+<dt class="hdlist1">
+dh
+</dt>
+<dd>
+<p>
+ DER encoded Diffie-Hellman parameters.
+</p>
+</dd>
+<dt class="hdlist1">
+dhfile
+</dt>
+<dd>
+<p>
+ Path to the PEM encoded Diffie-Hellman parameters file.
+</p>
+</dd>
+<dt class="hdlist1">
+fail_if_no_peer_cert (false)
+</dt>
+<dd>
+<p>
+ Whether to refuse the connection if the client sends an empty certificate.
+</p>
+</dd>
+<dt class="hdlist1">
+hibernate_after (undefined)
+</dt>
+<dd>
+<p>
+ Time in ms after which SSL socket processes go into hibernation to reduce memory usage.
+</p>
+</dd>
+<dt class="hdlist1">
+honor_cipher_order (false)
+</dt>
+<dd>
+<p>
+ If true, use the server&#8217;s preference for cipher selection. If false, use the client&#8217;s preference.
+</p>
+</dd>
+<dt class="hdlist1">
+key
+</dt>
+<dd>
+<p>
+ DER encoded user private key.
+</p>
+</dd>
+<dt class="hdlist1">
+keyfile
+</dt>
+<dd>
+<p>
+ Path to the PEM encoded private key file, if different than the certfile.
+</p>
+</dd>
+<dt class="hdlist1">
+log_alert (true)
+</dt>
+<dd>
+<p>
+ If false, error reports will not be displayed.
+</p>
+</dd>
+<dt class="hdlist1">
+next_protocols_advertised
+</dt>
+<dd>
+<p>
+ List of protocols to send to the client if it supports the Next Protocol extension.
+</p>
+</dd>
+<dt class="hdlist1">
+nodelay (true)
+</dt>
+<dd>
+<p>
+ Whether to enable TCP_NODELAY.
+</p>
+</dd>
+<dt class="hdlist1">
+padding_check
+</dt>
+<dd>
+<p>
+ Allow disabling the block cipher padding check for TLS-1.0 to be able to interoperate with legacy software.
+</p>
+</dd>
+<dt class="hdlist1">
+partial_chain
+</dt>
+<dd>
+<p>
+ Claim an intermediate CA in the chain as trusted.
+</p>
+</dd>
+<dt class="hdlist1">
+password
+</dt>
+<dd>
+<p>
+ Password to the private key file, if password protected.
+</p>
+</dd>
+<dt class="hdlist1">
+psk_identity
+</dt>
+<dd>
+<p>
+ Provide the given PSK identity hint to the client during the handshake.
+</p>
+</dd>
+<dt class="hdlist1">
+reuse_session
+</dt>
+<dd>
+<p>
+ Custom policy to decide whether a session should be reused.
+</p>
+</dd>
+<dt class="hdlist1">
+reuse_sessions (false)
+</dt>
+<dd>
+<p>
+ Whether to allow session reuse.
+</p>
+</dd>
+<dt class="hdlist1">
+secure_renegotiate (false)
+</dt>
+<dd>
+<p>
+ Whether to reject renegotiation attempts that do not conform to RFC5746.
+</p>
+</dd>
+<dt class="hdlist1">
+signature_algs
+</dt>
+<dd>
+<p>
+ The TLS signature algorithm extension may be used, from TLS 1.2, to negotiate which signature algorithm to use during the TLS handshake.
+</p>
+</dd>
+<dt class="hdlist1">
+sni_fun
+</dt>
+<dd>
+<p>
+ Function called when the client requests a host using Server Name Indication. Returns options to apply.
+</p>
+</dd>
+<dt class="hdlist1">
+sni_hosts
+</dt>
+<dd>
+<p>
+ Options to apply for the host that matches what the client requested with Server Name Indication.
+</p>
+</dd>
+<dt class="hdlist1">
+user_lookup_fun
+</dt>
+<dd>
+<p>
+ Function called to determine the shared secret when using PSK, or provide parameters when using SRP.
+</p>
+</dd>
+<dt class="hdlist1">
+v2_hello_compatible
+</dt>
+<dd>
+<p>
+ Accept clients that send hello messages in SSL-2.0 format while offering supported SSL/TLS versions.
+</p>
+</dd>
+<dt class="hdlist1">
+verify (verify_none)
+</dt>
+<dd>
+<p>
+ Use <code>verify_peer</code> to request a certificate from the client.
+</p>
+</dd>
+<dt class="hdlist1">
+verify_fun
+</dt>
+<dd>
+<p>
+ Custom policy to decide whether a client certificate is valid.
+</p>
+</dd>
+<dt class="hdlist1">
+versions
+</dt>
+<dd>
+<p>
+ TLS protocol versions that will be supported.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Note that the client will not send a certificate unless the
+value for the <code>verify</code> option is set to <code>verify_peer</code>. This
+means that the <code>fail_if_no_peer_cert</code> only apply when combined
+with the <code>verify</code> option. The <code>verify_fun</code> option allows
+greater control over the client certificate validation.</p></div>
+<div class="paragraph"><p>The options <code>sni_fun</code> and <code>sni_hosts</code> are mutually exclusive.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_exports">Exports</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>None.</p></div>
+</div>
+</div>
+
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+ Function Reference
+
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/manual/ranch_tcp/index.html b/docs/en/ranch/1.3/manual/ranch_tcp/index.html
new file mode 100644
index 00000000..2b28bb77
--- /dev/null
+++ b/docs/en/ranch/1.3/manual/ranch_tcp/index.html
@@ -0,0 +1,421 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: ranch_tcp(3)</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>ranch_tcp(3)</span></h1>
+
+<div class="sect1">
+<h2 id="_name">Name</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>ranch_tcp - TCP transport module</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">Description</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The <code>ranch_tcp</code> module implements a TCP Ranch transport.</p></div>
+<div class="paragraph"><p>Note that due to bugs in OTP up to at least R16B02, it is
+recommended to disable async threads when using the
+<code>sendfile</code> function of this transport, as it can make
+the threads stuck indefinitely.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_types">Types</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_opt">opt()</h3>
+<div class="listingblock">
+<div class="content"><!-- Generator: GNU source-highlight 3.1.8
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><tt><span style="font-weight: bold"><span style="color: #000000">opt</span></span>() <span style="color: #990000">=</span> {<span style="color: #FF6600">backlog</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
+ | {<span style="color: #FF6600">buffer</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
+ | {<span style="color: #FF6600">delay_send</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">dontroute</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">exit_on_close</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">fd</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
+ | {<span style="color: #FF6600">high_msgq_watermark</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
+ | {<span style="color: #FF6600">high_watermark</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
+ | <span style="color: #FF6600">inet</span>
+ | <span style="color: #FF6600">inet6</span>
+ | {<span style="color: #FF6600">ip</span>, <span style="font-weight: bold"><span style="color: #000000">inet:ip_address</span></span>()}
+ | {<span style="color: #FF6600">ipv6_v6only</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">keepalive</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">linger</span>, {<span style="font-weight: bold"><span style="color: #000000">boolean</span></span>(), <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}}
+ | {<span style="color: #FF6600">low_msgq_watermark</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
+ | {<span style="color: #FF6600">low_watermark</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
+ | {<span style="color: #FF6600">nodelay</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">port</span>, <span style="font-weight: bold"><span style="color: #000000">inet:port_number</span></span>()}
+ | {<span style="font-weight: bold"><span style="color: #000080">priority</span></span>, <span style="font-weight: bold"><span style="color: #000080">integer</span></span>()}
+ | {<span style="color: #FF6600">raw</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>(), <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>(), <span style="font-weight: bold"><span style="color: #000080">binary</span></span>()}
+ | {<span style="color: #FF6600">recbuf</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
+ | {<span style="color: #FF6600">send_timeout</span>, <span style="font-weight: bold"><span style="color: #000000">timeout</span></span>()}
+ | {<span style="color: #FF6600">send_timeout_close</span>, <span style="font-weight: bold"><span style="color: #000000">boolean</span></span>()}
+ | {<span style="color: #FF6600">sndbuf</span>, <span style="font-weight: bold"><span style="color: #000000">non_neg_integer</span></span>()}
+ | {<span style="color: #FF6600">tos</span>, <span style="font-weight: bold"><span style="color: #000080">integer</span></span>()}</tt></pre></div></div>
+<div class="paragraph"><p>Listen options.</p></div>
+<div class="paragraph"><p>This does not represent the entirety of the options that can
+be set on the socket, but only the options that may be
+set independently of protocol implementation.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_opts_opt">opts() = [opt()]</h3>
+<div class="paragraph"><p>List of listen options.</p></div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_option_descriptions">Option descriptions</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>None of the options are required.</p></div>
+<div class="paragraph"><p>Please consult the <code>gen_tcp</code> and <code>inet</code> manuals for a more
+thorough description of these options. This manual only aims
+to provide a short description along with what the defaults
+are. Defaults may be different in Ranch compared to <code>gen_tcp</code>.
+Defaults are given next to the option name.</p></div>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+backlog (1024)
+</dt>
+<dd>
+<p>
+ Max length of the queue of pending connections.
+</p>
+</dd>
+<dt class="hdlist1">
+buffer
+</dt>
+<dd>
+<p>
+ Size of the buffer used by the Erlang driver. Default is system-dependent.
+</p>
+</dd>
+<dt class="hdlist1">
+delay_send (false)
+</dt>
+<dd>
+<p>
+ Always queue packets before sending, to send fewer, larger packets over the network.
+</p>
+</dd>
+<dt class="hdlist1">
+dontroute (false)
+</dt>
+<dd>
+<p>
+ Don&#8217;t send via a gateway, only send to directly connected hosts.
+</p>
+</dd>
+<dt class="hdlist1">
+exit_on_close (true)
+</dt>
+<dd>
+<p>
+ Disable to allow sending data after a close has been detected.
+</p>
+</dd>
+<dt class="hdlist1">
+fd
+</dt>
+<dd>
+<p>
+ File descriptor of the socket, if it was opened externally.
+</p>
+</dd>
+<dt class="hdlist1">
+high_msgq_watermark (8192)
+</dt>
+<dd>
+<p>
+ Limit in the amount of data in the socket message queue before the socket queue becomes busy.
+</p>
+</dd>
+<dt class="hdlist1">
+high_watermark (8192)
+</dt>
+<dd>
+<p>
+ Limit in the amount of data in the ERTS socket implementation&#8217;s queue before the socket becomes busy.
+</p>
+</dd>
+<dt class="hdlist1">
+inet
+</dt>
+<dd>
+<p>
+ Set up the socket for IPv4.
+</p>
+</dd>
+<dt class="hdlist1">
+inet6
+</dt>
+<dd>
+<p>
+ Set up the socket for IPv6.
+</p>
+</dd>
+<dt class="hdlist1">
+ip
+</dt>
+<dd>
+<p>
+ Interface to listen on. Listen on all interfaces by default.
+</p>
+</dd>
+<dt class="hdlist1">
+ipv6_v6only (false)
+</dt>
+<dd>
+<p>
+ Listen on IPv4 and IPv6 (false) or only on IPv6 (true). Use with inet6.
+</p>
+</dd>
+<dt class="hdlist1">
+keepalive (false)
+</dt>
+<dd>
+<p>
+ Enable sending of keep-alive messages.
+</p>
+</dd>
+<dt class="hdlist1">
+linger ({false, 0})
+</dt>
+<dd>
+<p>
+ Whether to wait and how long to flush data sent before closing the socket.
+</p>
+</dd>
+<dt class="hdlist1">
+low_msgq_watermark (4096)
+</dt>
+<dd>
+<p>
+ Amount of data in the socket message queue before the socket queue leaves busy state.
+</p>
+</dd>
+<dt class="hdlist1">
+low_watermark (4096)
+</dt>
+<dd>
+<p>
+ Amount of data in the ERTS socket implementation&#8217;s queue before the socket leaves busy state.
+</p>
+</dd>
+<dt class="hdlist1">
+nodelay (true)
+</dt>
+<dd>
+<p>
+ Whether to enable TCP_NODELAY.
+</p>
+</dd>
+<dt class="hdlist1">
+port (0)
+</dt>
+<dd>
+<p>
+ TCP port number to listen on. 0 means a random port will be used.
+</p>
+</dd>
+<dt class="hdlist1">
+priority (0)
+</dt>
+<dd>
+<p>
+ Priority value for all packets to be sent by this socket.
+</p>
+</dd>
+<dt class="hdlist1">
+recbuf
+</dt>
+<dd>
+<p>
+ Minimum size of the socket&#8217;s receive buffer. Default is system-dependent.
+</p>
+</dd>
+<dt class="hdlist1">
+send_timeout (30000)
+</dt>
+<dd>
+<p>
+ How long the send call may wait for confirmation before returning.
+</p>
+</dd>
+<dt class="hdlist1">
+send_timeout_close (true)
+</dt>
+<dd>
+<p>
+ Whether to close the socket when the confirmation wasn&#8217;t received.
+</p>
+</dd>
+<dt class="hdlist1">
+sndbuf
+</dt>
+<dd>
+<p>
+ Minimum size of the socket&#8217;s send buffer. Default is system-dependent.
+</p>
+</dd>
+<dt class="hdlist1">
+tos
+</dt>
+<dd>
+<p>
+ Value for the IP_TOS IP level option. Use with caution.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>In addition, the <code>raw</code> option can be used to set system-specific
+options by specifying the protocol level, the option number and
+the actual option value specified as a binary. This option is not
+portable. Use with caution.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_exports">Exports</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>None.</p></div>
+</div>
+</div>
+
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+ Function Reference
+
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/1.3/manual/ranch_transport/index.html b/docs/en/ranch/1.3/manual/ranch_transport/index.html
new file mode 100644
index 00000000..299a82a5
--- /dev/null
+++ b/docs/en/ranch/1.3/manual/ranch_transport/index.html
@@ -0,0 +1,632 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="">
+ <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
+
+ <meta name="generator" content="Hugo 0.17" />
+
+ <title>Nine Nines: ranch_transport(3)</title>
+
+ <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
+
+ <link href="/css/bootstrap.min.css" rel="stylesheet">
+ <link href="/css/99s.css" rel="stylesheet">
+
+ <link rel="shortcut icon" href="/img/ico/favicon.ico">
+ <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
+ <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
+ <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
+
+
+</head>
+
+
+<body class="">
+ <header id="page-head">
+ <div id="topbar" class="container">
+ <div class="row">
+ <div class="span2">
+ <h1 id="logo"><a href="/" title="99s">99s</a></h1>
+ </div>
+ <div class="span10">
+
+ <div id="side-header">
+ <nav>
+ <ul>
+ <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
+ <li><a title="Watch my talks" href="/talks">Talks</a></li>
+ <li class="active"><a title="Read the docs" href="/docs">Documentation</a></li>
+ <li><a title="Request my services" href="/services">Consulting & Training</a></li>
+ </ul>
+ </nav>
+ <ul id="social">
+ <li>
+ <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
+ </li>
+ <li>
+ <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
+ </li>
+ <li>
+ <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+</header>
+
+<div id="contents" class="two_col">
+<div class="container">
+<div class="row">
+<div id="docs" class="span9 maincol">
+
+<h1 class="lined-header"><span>ranch_transport(3)</span></h1>
+
+<div class="sect1">
+<h2 id="_name">Name</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>ranch_transport - behaviour for transport modules</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">Description</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The <code>ranch_transport</code> behaviour defines the interface used
+by Ranch transports.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_types">Types</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_sendfile_opts_chunk_size_non_neg_integer">sendfile_opts() = [{chunk_size, non_neg_integer()}]</h3>
+<div class="paragraph"><p>Options used by the sendfile function and callbacks.</p></div>
+<div class="paragraph"><p>Allows configuring the chunk size, in bytes. Defaults to 8191 bytes.</p></div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_callbacks">Callbacks</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_accept_lsocket_timeout_8594_ok_csocket_error_closed_timeout_atom">accept(LSocket, Timeout) &#8594; {ok, CSocket} | {error, closed | timeout | atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+LSocket = CSocket = any()
+</dt>
+<dd>
+<p>
+Listening socket.
+</p>
+</dd>
+<dt class="hdlist1">
+Timeout = timeout()
+</dt>
+<dd>
+<p>
+Accept timeout.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Accept a connection on the given listening socket.</p></div>
+<div class="paragraph"><p>The <code>accept_ack</code> callback will be used to initialize the socket
+after accepting the connection. This is most useful when the
+transport is not raw TCP, like with SSL for example.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_accept_ack_csocket_timeout_8594_ok">accept_ack(CSocket, Timeout) &#8594; ok</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+CSocket = any()
+</dt>
+<dd>
+<p>
+Socket for this connection.
+</p>
+</dd>
+<dt class="hdlist1">
+Timeout = timeout()
+</dt>
+<dd>
+<p>
+Ack timeout.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Perform post-accept initialization of the connection.</p></div>
+<div class="paragraph"><p>This function will be called by connection processes
+before performing any socket operation. It allows
+transports that require extra initialization to perform
+their task and make the socket ready to use.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_close_socket_8594_ok">close(Socket) &#8594; ok</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Socket = any()
+</dt>
+<dd>
+<p>
+Socket opened with listen/1 or accept/2.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Close the given socket.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_controlling_process_socket_pid_8594_ok_error_closed_not_owner_atom">controlling_process(Socket, Pid) &#8594; ok | {error, closed | not_owner | atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Socket = any()
+</dt>
+<dd>
+<p>
+Socket opened with listen/1 or accept/2.
+</p>
+</dd>
+<dt class="hdlist1">
+Pid = pid()
+</dt>
+<dd>
+<p>
+Pid of the new owner of the socket.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Change the controlling process for the given socket.</p></div>
+<div class="paragraph"><p>The controlling process is the process that is allowed to
+perform operations on the socket, and that will receive
+messages from the socket when active mode is used. When
+the controlling process dies, the socket is closed.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_listen_transopts_8594_ok_lsocket_error_atom">listen(TransOpts) &#8594; {ok, LSocket} | {error, atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+TransOpts = any()
+</dt>
+<dd>
+<p>
+Transport options.
+</p>
+</dd>
+<dt class="hdlist1">
+LSocket = any()
+</dt>
+<dd>
+<p>
+Listening socket.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Listen for connections on the given port.</p></div>
+<div class="paragraph"><p>The port is given as part of the transport options under
+the key <code>port</code>. Any other option is transport dependent.</p></div>
+<div class="paragraph"><p>The socket returned by this call can then be used to
+accept connections. It is not possible to send or receive
+data from the listening socket.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_messages_8594_ok_closed_error">messages() &#8594; {OK, Closed, Error}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+OK = Closed = Error = atom()
+</dt>
+<dd>
+<p>
+Tuple names.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return the atoms used to identify messages sent in active mode.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_name_8594_name">name() &#8594; Name</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Name = atom()
+</dt>
+<dd>
+<p>
+Transport module name.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return the name of the transport.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_peername_csocket_8594_ok_ip_port_error_atom">peername(CSocket) &#8594; {ok, {IP, Port}} | {error, atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+CSocket = any()
+</dt>
+<dd>
+<p>
+Socket for this connection.
+</p>
+</dd>
+<dt class="hdlist1">
+IP = inet:ip_address()
+</dt>
+<dd>
+<p>
+IP of the remote endpoint.
+</p>
+</dd>
+<dt class="hdlist1">
+Port = inet:port_number()
+</dt>
+<dd>
+<p>
+Port of the remote endpoint.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return the IP and port of the remote endpoint.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_recv_csocket_length_timeout_8594_ok_packet_error_closed_timeout_atom">recv(CSocket, Length, Timeout) &#8594; {ok, Packet} | {error, closed | timeout | atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+CSocket = any()
+</dt>
+<dd>
+<p>
+Socket for this connection.
+</p>
+</dd>
+<dt class="hdlist1">
+Length = non_neg_integer()
+</dt>
+<dd>
+<p>
+Requested length.
+</p>
+</dd>
+<dt class="hdlist1">
+Timeout = timeout()
+</dt>
+<dd>
+<p>
+Receive timeout.
+</p>
+</dd>
+<dt class="hdlist1">
+Packet = iodata() | any()
+</dt>
+<dd>
+<p>
+Data received.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Receive data from the given socket when in passive mode.</p></div>
+<div class="paragraph"><p>Trying to receive data from a socket that is in active mode
+will return an error.</p></div>
+<div class="paragraph"><p>A length of 0 will return any data available on the socket.</p></div>
+<div class="paragraph"><p>While it is possible to use the timeout value <code>infinity</code>,
+this is highly discouraged as this could cause your process
+to get stuck waiting for data that will never come. This may
+happen when a socket becomes half-open due to a crash of the
+remote endpoint. Wi-Fi going down is another common culprit
+of this issue.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_send_csocket_packet_8594_ok_error_atom">send(CSocket, Packet) &#8594; ok | {error, atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+CSocket = any()
+</dt>
+<dd>
+<p>
+Socket for this connection.
+</p>
+</dd>
+<dt class="hdlist1">
+Packet = iodata()
+</dt>
+<dd>
+<p>
+Data to be sent.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Send data to the given socket.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_sendfile_csocket_file_8594_sendfile_csocket_file_0_0">sendfile(CSocket, File) &#8594; sendfile(CSocket, File, 0, 0, [])</h3>
+<div class="paragraph"><p>Alias of <code>ranch_transport:sendfile/5</code>.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_sendfile_csocket_file_offset_bytes_8594_sendfile_csocket_file_offset_bytes">sendfile(CSocket, File, Offset, Bytes) &#8594; sendfile(CSocket, File, Offset, Bytes, [])</h3>
+<div class="paragraph"><p>Alias of <code>ranch_transport:sendfile/5</code>.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_sendfile_csocket_file_offset_bytes_sfopts_8594_ok_sentbytes_error_atom">sendfile(CSocket, File, Offset, Bytes, SfOpts) &#8594; {ok, SentBytes} | {error, atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+CSocket = any()
+</dt>
+<dd>
+<p>
+Socket for this connection.
+</p>
+</dd>
+<dt class="hdlist1">
+File = file:filename_all() | file:fd()
+</dt>
+<dd>
+<p>
+Filename or file descriptor for the file to be sent.
+</p>
+</dd>
+<dt class="hdlist1">
+Offset = non_neg_integer()
+</dt>
+<dd>
+<p>
+Begin sending at this position in the file.
+</p>
+</dd>
+<dt class="hdlist1">
+Bytes = non_neg_integer()
+</dt>
+<dd>
+<p>
+Send this many bytes.
+</p>
+</dd>
+<dt class="hdlist1">
+SentBytes = non_neg_integer()
+</dt>
+<dd>
+<p>
+This many bytes were sent.
+</p>
+</dd>
+<dt class="hdlist1">
+SfOpts = sendfile_opts()
+</dt>
+<dd>
+<p>
+Sendfile options.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Send data from a file to the given socket.</p></div>
+<div class="paragraph"><p>The file may be sent full or in parts, and may be specified
+by its filename or by an already open file descriptor.</p></div>
+<div class="paragraph"><p>Transports that manipulate TCP directly may use the
+<code>file:sendfile/{2,4,5}</code> function, which calls the sendfile
+syscall where applicable (on Linux, for example). Other
+transports can use the <code>sendfile/6</code> function exported from
+this module.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_setopts_csocket_sockopts_8594_ok_error_atom">setopts(CSocket, SockOpts) &#8594; ok | {error, atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+CSocket = any()
+</dt>
+<dd>
+<p>
+Socket for this connection.
+</p>
+</dd>
+<dt class="hdlist1">
+SockOpts = any()
+</dt>
+<dd>
+<p>
+Socket options.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Change options for the given socket.</p></div>
+<div class="paragraph"><p>This is mainly useful for switching to active or passive mode
+or to set protocol-specific options.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_shutdown_csocket_how_8594_ok_error_atom">shutdown(CSocket, How) &#8594; ok | {error, atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+CSocket = any()
+</dt>
+<dd>
+<p>
+Socket for this connection.
+</p>
+</dd>
+<dt class="hdlist1">
+How = read | write | read_write
+</dt>
+<dd>
+<p>
+Which side(s) of the socket to close.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Immediately close the socket in one or two directions.</p></div>
+</div>
+<div class="sect2">
+<h3 id="_sockname_socket_8594_ok_ip_port_error_atom">sockname(Socket) &#8594; {ok, {IP, Port}} | {error, atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Socket = any()
+</dt>
+<dd>
+<p>
+Socket opened with listen/1 or accept/2.
+</p>
+</dd>
+<dt class="hdlist1">
+IP = inet:ip_address()
+</dt>
+<dd>
+<p>
+IP of the local endpoint.
+</p>
+</dd>
+<dt class="hdlist1">
+Port = inet:port_number()
+</dt>
+<dd>
+<p>
+Port of the local endpoint.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Return the IP and port of the local endpoint.</p></div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_exports">Exports</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_sendfile_transport_csocket_file_offset_bytes_sfopts_8594_ok_sentbytes_error_atom">sendfile(Transport, CSocket, File, Offset, Bytes, SfOpts) &#8594; {ok, SentBytes} | {error, atom()}</h3>
+<div class="dlist"><dl>
+<dt class="hdlist1">
+Transport = module()
+</dt>
+<dd>
+<p>
+Transport module for this socket.
+</p>
+</dd>
+<dt class="hdlist1">
+CSocket = any()
+</dt>
+<dd>
+<p>
+Socket for this connection.
+</p>
+</dd>
+<dt class="hdlist1">
+File = file:filename_all() | file:fd()
+</dt>
+<dd>
+<p>
+Filename or file descriptor for the file to be sent.
+</p>
+</dd>
+<dt class="hdlist1">
+Offset = non_neg_integer()
+</dt>
+<dd>
+<p>
+Begin sending at this position in the file.
+</p>
+</dd>
+<dt class="hdlist1">
+Bytes = non_neg_integer()
+</dt>
+<dd>
+<p>
+Send this many bytes.
+</p>
+</dd>
+<dt class="hdlist1">
+SentBytes = non_neg_integer()
+</dt>
+<dd>
+<p>
+This many bytes were sent.
+</p>
+</dd>
+<dt class="hdlist1">
+SfOpts = sendfile_opts()
+</dt>
+<dd>
+<p>
+Sendfile options.
+</p>
+</dd>
+</dl></div>
+<div class="paragraph"><p>Send data from a file to the given socket.</p></div>
+<div class="paragraph"><p>This function emulates the function <code>file:sendfile/{2,4,5}</code>
+and may be used when transports are not manipulating TCP
+directly.</p></div>
+</div>
+</div>
+</div>
+
+
+
+
+
+</div>
+
+<div class="span3 sidecol">
+
+
+<h3>
+ Ranch
+ 1.3
+ Function Reference
+
+</h3>
+
+<ul>
+
+ <li><a href="/docs/en/ranch/1.3/guide">User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Function Reference</a></li>
+
+
+</ul>
+
+<h4 id="docs-nav">Navigation</h4>
+
+<h4>Version select</h4>
+<ul>
+
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">1.3</a></li>
+
+ <li><a href="/docs/en/ranch/1.2/manual">1.2</a></li>
+
+</ul>
+
+</div>
+</div>
+</div>
+</div>
+
+ <footer>
+ <div class="container">
+ <div class="row">
+ <div class="span6">
+ <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
+ <nav>
+ <ul>
+ <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
+ </ul>
+ </nav>
+ </div>
+ <div class="span6 credits">
+ <p><img src="/img/footer_logo.png"></p>
+ <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
+ </div>
+ </div>
+ </div>
+ </footer>
+
+
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/js/bootstrap-carousel.js"></script>
+ <script src="/js/bootstrap-dropdown.js"></script>
+ <script src="/js/custom.js"></script>
+ </body>
+</html>
+
+
diff --git a/docs/en/ranch/index.html b/docs/en/ranch/index.html
index ea24e654..d87c4243 100644
--- a/docs/en/ranch/index.html
+++ b/docs/en/ranch/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/docs/</title><link rel="canonical" href="https://ninenines.eu/docs/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/docs/" /></head></html> \ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
index e3f50323..849efa1c 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Documentation</title>
@@ -125,6 +125,13 @@
<ul>
+ <li><a href="/docs/en/ranch/1.3/guide">Ranch 1.3 User Guide</a></li>
+
+
+ <li><a href="/docs/en/ranch/1.3/manual">Ranch 1.3 Function Reference</a></li>
+
+
+
<li><a href="/docs/en/ranch/1.2/guide">Ranch 1.2 User Guide</a></li>
diff --git a/docs/index.xml b/docs/index.xml
index d6741f2f..43b5184d 100644
--- a/docs/index.xml
+++ b/docs/index.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
- <title>Docs on Nine Nines</title>
- <link>https://ninenines.eu/docs/</link>
- <description>Recent content in Docs on Nine Nines</description>
+ <title>Docs-rsses on Nine Nines</title>
+ <link>https://ninenines.eu/docs/index.xml</link>
+ <description>Recent content in Docs-rsses on Nine Nines</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<atom:link href="https://ninenines.eu/docs/index.xml" rel="self" type="application/rss+xml" />
@@ -969,6 +969,47 @@ client and the connection is closed.&lt;/p&gt;&lt;/div&gt;
</item>
<item>
+ <title>Ranch Function Reference</title>
+ <link>https://ninenines.eu/docs/en/ranch/1.3/manual/</link>
+ <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
+
+ <guid>https://ninenines.eu/docs/en/ranch/1.3/manual/</guid>
+ <description>&lt;div class=&#34;ulist&#34;&gt;&lt;ul&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;ranch_app&#34;&gt;ranch(7)&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;ranch&#34;&gt;ranch(3)&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;ranch_protocol&#34;&gt;ranch_protocol(3)&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;ranch_ssl&#34;&gt;ranch_ssl(3)&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;ranch_tcp&#34;&gt;ranch_tcp(3)&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;ranch_transport&#34;&gt;ranch_transport(3)&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;/ul&gt;&lt;/div&gt;
+</description>
+ </item>
+
+ <item>
<title>Ranch User Guide</title>
<link>https://ninenines.eu/docs/en/ranch/1.2/guide/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
@@ -1020,6 +1061,57 @@ client and the connection is closed.&lt;/p&gt;&lt;/div&gt;
</item>
<item>
+ <title>Ranch User Guide</title>
+ <link>https://ninenines.eu/docs/en/ranch/1.3/guide/</link>
+ <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
+
+ <guid>https://ninenines.eu/docs/en/ranch/1.3/guide/</guid>
+ <description>&lt;div class=&#34;ulist&#34;&gt;&lt;ul&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;introduction/&#34;&gt;Introduction&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;listeners/&#34;&gt;Listeners&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;transports/&#34;&gt;Transports&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;protocols/&#34;&gt;Protocols&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;embedded/&#34;&gt;Embedded mode&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;parsers/&#34;&gt;Writing parsers&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;ssl_auth/&#34;&gt;SSL client authentication&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;li&gt;
+&lt;p&gt;
+&lt;a href=&#34;internals/&#34;&gt;Internals&lt;/a&gt;
+&lt;/p&gt;
+&lt;/li&gt;
+&lt;/ul&gt;&lt;/div&gt;
+</description>
+ </item>
+
+ <item>
<title>Request overview</title>
<link>https://ninenines.eu/docs/en/cowboy/2.0/guide/overview/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
@@ -1773,273 +1865,5 @@ http://www.gnu.org/software/src-highlite --&gt;
</description>
</item>
- <item>
- <title>cowboy:start_tls(3)</title>
- <link>https://ninenines.eu/docs/en/cowboy/2.0/manual/cowboy.start_tls/</link>
- <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
-
- <guid>https://ninenines.eu/docs/en/cowboy/2.0/manual/cowboy.start_tls/</guid>
- <description>&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_name&#34;&gt;Name&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;cowboy:start_tls - Listen for connections using TLS&lt;/p&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_description&#34;&gt;Description&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;listingblock&#34;&gt;
-&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite --&gt;
-&lt;pre&gt;&lt;tt&gt;&lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;start_tls&lt;/span&gt;&lt;/span&gt;(&lt;span style=&#34;color: #009900&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;::&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;ranch:ref&lt;/span&gt;&lt;/span&gt;(),
- &lt;span style=&#34;color: #009900&#34;&gt;NumAcceptors&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;::&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;non_neg_integer&lt;/span&gt;&lt;/span&gt;(),
- &lt;span style=&#34;color: #009900&#34;&gt;TransportOpts&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;::&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;ranch_ssl:opts&lt;/span&gt;&lt;/span&gt;(),
- &lt;span style=&#34;color: #009900&#34;&gt;ProtocolOpts&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;::&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;opts&lt;/span&gt;&lt;/span&gt;())
- &lt;span style=&#34;color: #990000&#34;&gt;-&amp;gt;&lt;/span&gt; {&lt;span style=&#34;color: #FF6600&#34;&gt;ok&lt;/span&gt;, &lt;span style=&#34;color: #009900&#34;&gt;ListenerPid&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;::&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000080&#34;&gt;pid&lt;/span&gt;&lt;/span&gt;()}
- | {&lt;span style=&#34;color: #FF6600&#34;&gt;error&lt;/span&gt;, &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;any&lt;/span&gt;&lt;/span&gt;()}&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Start listening for connections over a secure TLS channel.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Both HTTP/1.1 and HTTP/2 are supported on this listener.
-The ALPN TLS extension must be used to initiate an HTTP/2
-connection.&lt;/p&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_arguments&#34;&gt;Arguments&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;dlist&#34;&gt;&lt;dl&gt;
-&lt;dt class=&#34;hdlist1&#34;&gt;
-Name
-&lt;/dt&gt;
-&lt;dd&gt;
-&lt;p&gt;
-The listener name is used to refer to this listener in
-future calls, for example when stopping it or when
-updating the routes defined.
-&lt;/p&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;It can be any Erlang term. An atom is generally good enough,
-for example &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;my_app_clear&lt;/code&gt; or &lt;code&gt;my_app_tls&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
-&lt;/dd&gt;
-&lt;dt class=&#34;hdlist1&#34;&gt;
-NumAcceptors
-&lt;/dt&gt;
-&lt;dd&gt;
-&lt;p&gt;
-The number of acceptors is the number of processes that
-will accept connections. Tweak this value to improve the
-accept rate for incoming connections.
-&lt;/p&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The ideal value is between 10 and 100 on most systems.
-Larger values may have the opposite effect and reduce the
-accept rate. It&amp;#8217;s generally safe to start with a value of
-100 (or 10 on low memory systems). Then, when accept rates
-become a concern, measure the performance and update the
-value accordingly.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;This value is unrelated to the maximum number of concurrent
-connections.&lt;/p&gt;&lt;/div&gt;
-&lt;/dd&gt;
-&lt;dt class=&#34;hdlist1&#34;&gt;
-TransportOpts
-&lt;/dt&gt;
-&lt;dd&gt;
-&lt;p&gt;
-The transport options are where the TCP options, including
-the listener&amp;#8217;s port number, are defined. They also contain
-the TLS options, like the server&amp;#8217;s certificate. Transport options
-are provided as a list of keys and values, for example
-&lt;code&gt;[{port, 8443}, {certfile, &#34;path/to/cert.pem&#34;}]&lt;/code&gt;.
-&lt;/p&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The available options are documented in the
-&lt;a href=&#34;../ranch_ssl&#34;&gt;ranch_ssl(3)&lt;/a&gt; manual.&lt;/p&gt;&lt;/div&gt;
-&lt;/dd&gt;
-&lt;dt class=&#34;hdlist1&#34;&gt;
-ProtocolOpts
-&lt;/dt&gt;
-&lt;dd&gt;
-&lt;p&gt;
-The protocol options are in a map containing all the options for
-the different protocols that may be involved when connecting
-to the listener, including HTTP/1.1 and HTTP/2 but also
-subprotocols like Websocket.
-&lt;/p&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The HTTP/1.1 options are documented in the
-&lt;a href=&#34;../cowboy_http&#34;&gt;cowboy_http(3)&lt;/a&gt; manual;
-the HTTP/2 options in
-&lt;a href=&#34;../cowboy_http&#34;&gt;cowboy_http2(3)&lt;/a&gt;;
-and the Websocket options in
-&lt;a href=&#34;../cowboy_websocket&#34;&gt;cowboy_websocket(3)&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
-&lt;/dd&gt;
-&lt;/dl&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_return_value&#34;&gt;Return value&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;An ok tuple is returned on success. It contains the pid of
-the top-level supervisor for the listener.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;An error tuple is returned on error. The error reason may
-be any Erlang term.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;A common error is &lt;code&gt;eaddrinuse&lt;/code&gt;. It indicates that the port
-configured for Cowboy is already in use.&lt;/p&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_changelog&#34;&gt;Changelog&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;ulist&#34;&gt;&lt;ul&gt;
-&lt;li&gt;
-&lt;p&gt;
-&lt;strong&gt;2.0&lt;/strong&gt;: HTTP/2 support added.
-&lt;/p&gt;
-&lt;/li&gt;
-&lt;li&gt;
-&lt;p&gt;
-&lt;strong&gt;2.0&lt;/strong&gt;: Function introduced. Replaces &lt;code&gt;cowboy:start_https/4&lt;/code&gt;.
-&lt;/p&gt;
-&lt;/li&gt;
-&lt;/ul&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_examples&#34;&gt;Examples&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;listingblock&#34;&gt;
-&lt;div class=&#34;title&#34;&gt;Start a listener&lt;/div&gt;
-&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite --&gt;
-&lt;pre&gt;&lt;tt&gt;&lt;span style=&#34;color: #009900&#34;&gt;Dispatch&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;cowboy_router:compile&lt;/span&gt;&lt;/span&gt;([
- {&lt;span style=&#34;color: #FF6600&#34;&gt;&#39;_&#39;&lt;/span&gt;, [
- {&lt;span style=&#34;color: #FF0000&#34;&gt;&#34;/&#34;&lt;/span&gt;, &lt;span style=&#34;color: #FF6600&#34;&gt;toppage_h&lt;/span&gt;, []}
- ]}
-]),
-
-{&lt;span style=&#34;color: #FF6600&#34;&gt;ok&lt;/span&gt;, &lt;span style=&#34;color: #990000&#34;&gt;_&lt;/span&gt;} &lt;span style=&#34;color: #990000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;cowboy:start_tls&lt;/span&gt;&lt;/span&gt;(&lt;span style=&#34;color: #FF6600&#34;&gt;example&lt;/span&gt;, &lt;span style=&#34;color: #993399&#34;&gt;100&lt;/span&gt;, [
- {&lt;span style=&#34;color: #FF6600&#34;&gt;port&lt;/span&gt;, &lt;span style=&#34;color: #993399&#34;&gt;8443&lt;/span&gt;},
- {&lt;span style=&#34;color: #FF6600&#34;&gt;cert&lt;/span&gt;, &lt;span style=&#34;color: #FF0000&#34;&gt;&#34;path/to/cert.pem&#34;&lt;/span&gt;}
-], #{
- &lt;span style=&#34;color: #0000FF&#34;&gt;env&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;=&amp;gt;&lt;/span&gt; #{&lt;span style=&#34;color: #0000FF&#34;&gt;dispatch&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #009900&#34;&gt;Dispatch&lt;/span&gt;}
-})&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;div class=&#34;listingblock&#34;&gt;
-&lt;div class=&#34;title&#34;&gt;Start a listener on a random port&lt;/div&gt;
-&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite --&gt;
-&lt;pre&gt;&lt;tt&gt;&lt;span style=&#34;color: #009900&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;example&lt;/span&gt;,
-
-{&lt;span style=&#34;color: #FF6600&#34;&gt;ok&lt;/span&gt;, &lt;span style=&#34;color: #990000&#34;&gt;_&lt;/span&gt;} &lt;span style=&#34;color: #990000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;cowboy:start_tls&lt;/span&gt;&lt;/span&gt;(&lt;span style=&#34;color: #009900&#34;&gt;Name&lt;/span&gt;, &lt;span style=&#34;color: #993399&#34;&gt;100&lt;/span&gt;, [
- {&lt;span style=&#34;color: #FF6600&#34;&gt;cert&lt;/span&gt;, &lt;span style=&#34;color: #FF0000&#34;&gt;&#34;path/to/cert.pem&#34;&lt;/span&gt;}
-], #{
- &lt;span style=&#34;color: #0000FF&#34;&gt;env&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;=&amp;gt;&lt;/span&gt; #{&lt;span style=&#34;color: #0000FF&#34;&gt;dispatch&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #009900&#34;&gt;Dispatch&lt;/span&gt;}
-}),
-
-&lt;span style=&#34;color: #009900&#34;&gt;Port&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;ranch:get_port&lt;/span&gt;&lt;/span&gt;(&lt;span style=&#34;color: #009900&#34;&gt;Name&lt;/span&gt;)&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_see_also&#34;&gt;See also&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;&lt;a href=&#34;../cowboy&#34;&gt;cowboy(3)&lt;/a&gt;,
-&lt;a href=&#34;../cowboy.start_clear&#34;&gt;cowboy:start_clear(3)&lt;/a&gt;,
-&lt;a href=&#34;../cowboy.stop_listener&#34;&gt;cowboy:stop_listener(3)&lt;/a&gt;,
-&lt;a href=&#34;../ranch&#34;&gt;ranch(3)&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-</description>
- </item>
-
- <item>
- <title>cowboy:stop_listener(3)</title>
- <link>https://ninenines.eu/docs/en/cowboy/2.0/manual/cowboy.stop_listener/</link>
- <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
-
- <guid>https://ninenines.eu/docs/en/cowboy/2.0/manual/cowboy.stop_listener/</guid>
- <description>&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_name&#34;&gt;Name&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;cowboy:stop_listener - Stop the given listener&lt;/p&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_description&#34;&gt;Description&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;listingblock&#34;&gt;
-&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite --&gt;
-&lt;pre&gt;&lt;tt&gt;&lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;stop_listener&lt;/span&gt;&lt;/span&gt;(&lt;span style=&#34;color: #009900&#34;&gt;Name&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;::&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;ranch:ref&lt;/span&gt;&lt;/span&gt;())
- &lt;span style=&#34;color: #990000&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color: #FF6600&#34;&gt;ok&lt;/span&gt; | {&lt;span style=&#34;color: #FF6600&#34;&gt;error&lt;/span&gt;, &lt;span style=&#34;color: #FF6600&#34;&gt;not_found&lt;/span&gt;}&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Stop a previously started listener.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;Alias of &lt;a href=&#34;../ranch.stop_listener&#34;&gt;ranch:stop_listener(3)&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_arguments&#34;&gt;Arguments&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;dlist&#34;&gt;&lt;dl&gt;
-&lt;dt class=&#34;hdlist1&#34;&gt;
-Name
-&lt;/dt&gt;
-&lt;dd&gt;
-&lt;p&gt;
-The name of the listener to be stopped.
-&lt;/p&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The name of the listener is the first argument given to the
-&lt;a href=&#34;../cowboy.start_clear&#34;&gt;cowboy:start_clear(3)&lt;/a&gt;,
-&lt;a href=&#34;../cowboy.start_tls&#34;&gt;cowboy:start_tls(3)&lt;/a&gt; or
-&lt;a href=&#34;../ranch.start_listener&#34;&gt;ranch:start_listener(3)&lt;/a&gt; function.&lt;/p&gt;&lt;/div&gt;
-&lt;/dd&gt;
-&lt;/dl&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_return_value&#34;&gt;Return value&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The atom &lt;code&gt;ok&lt;/code&gt; is returned on success.&lt;/p&gt;&lt;/div&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;The &lt;code&gt;{error, not_found}&lt;/code&gt; tuple is returned when the listener
-does not exist.&lt;/p&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_changelog&#34;&gt;Changelog&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;ulist&#34;&gt;&lt;ul&gt;
-&lt;li&gt;
-&lt;p&gt;
-&lt;strong&gt;1.0&lt;/strong&gt;: Function introduced.
-&lt;/p&gt;
-&lt;/li&gt;
-&lt;/ul&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_examples&#34;&gt;Examples&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;listingblock&#34;&gt;
-&lt;div class=&#34;title&#34;&gt;Stop a listener&lt;/div&gt;
-&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
-by Lorenzo Bettini
-http://www.lorenzobettini.it
-http://www.gnu.org/software/src-highlite --&gt;
-&lt;pre&gt;&lt;tt&gt;&lt;span style=&#34;color: #0000FF&#34;&gt;ok&lt;/span&gt; &lt;span style=&#34;color: #990000&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;font-weight: bold&#34;&gt;&lt;span style=&#34;color: #000000&#34;&gt;cowboy:stop_listener&lt;/span&gt;&lt;/span&gt;(&lt;span style=&#34;color: #FF6600&#34;&gt;example&lt;/span&gt;)&lt;span style=&#34;color: #990000&#34;&gt;.&lt;/span&gt;&lt;/tt&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-&lt;div class=&#34;sect1&#34;&gt;
-&lt;h2 id=&#34;_see_also&#34;&gt;See also&lt;/h2&gt;
-&lt;div class=&#34;sectionbody&#34;&gt;
-&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;&lt;a href=&#34;../cowboy&#34;&gt;cowboy(3)&lt;/a&gt;,
-&lt;a href=&#34;../cowboy.start_clear&#34;&gt;cowboy:start_clear(3)&lt;/a&gt;,
-&lt;a href=&#34;../cowboy.start_tls&#34;&gt;cowboy:start_tls(3)&lt;/a&gt;,
-&lt;a href=&#34;../ranch&#34;&gt;ranch(3)&lt;/a&gt;,
-&lt;a href=&#34;../ranch.start_listener&#34;&gt;ranch:start_listener(3)&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
-&lt;/div&gt;
-&lt;/div&gt;
-</description>
- </item>
-
</channel>
</rss> \ No newline at end of file
diff --git a/donate/index.html b/donate/index.html
index c6f8b359..0de606b5 100644
--- a/donate/index.html
+++ b/donate/index.html
@@ -1,74 +1,726 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta name="description" content="">
- <meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
-
- <meta name="generator" content="Hugo 0.16" />
-
- <title>Nine Nines: Donate</title>
-
- <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic' rel='stylesheet' type='text/css'>
-
- <link href="/css/bootstrap.min.css" rel="stylesheet">
- <link href="/css/99s.css" rel="stylesheet">
-
- <link rel="shortcut icon" href="/img/ico/favicon.ico">
- <link rel="apple-touch-icon-precomposed" sizes="114x114" href="/img/ico/apple-touch-icon-114.png">
- <link rel="apple-touch-icon-precomposed" sizes="72x72" href="/img/ico/apple-touch-icon-72.png">
- <link rel="apple-touch-icon-precomposed" href="/img/ico/apple-touch-icon-57.png">
-
-
-</head>
-
-
-<body class="">
- <header id="page-head">
- <div id="topbar" class="container">
- <div class="row">
- <div class="span2">
- <h1 id="logo"><a href="/" title="99s">99s</a></h1>
- </div>
- <div class="span10">
-
- <div id="side-header">
- <nav>
- <ul>
- <li><a title="Hear my thoughts" href="/articles">Articles</a></li>
- <li><a title="Watch my talks" href="/talks">Talks</a></li>
- <li><a title="Read the docs" href="/docs">Documentation</a></li>
- <li class="active"><a title="Request my services" href="/services">Consulting & Training</a></li>
- </ul>
- </nav>
- <ul id="social">
- <li>
- <a href="https://github.com/ninenines" title="Check my Github repositories"><img src="/img/ico_github.png" data-hover="/img/ico_github_alt.png" alt="Github"></a>
- </li>
- <li>
- <a title="Keep in touch!" href="http://twitter.com/lhoguin"><img src="/img/ico_microblog.png" data-hover="/img/ico_microblog_alt.png"></a>
- </li>
- <li>
- <a title="Contact me" href="mailto:[email protected]"><img src="/img/ico_mail.png" data-hover="/img/ico_mail_alt.png"></a>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </div>
-
-
-</header>
-
-<div id="contents" class="two_col">
-<div class="container">
-<div class="row">
-<div class="span9 maincol">
-
-<h1 class="lined-header"><span>Services</span></h1>
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 8.6.9" />
+<title></title>
+<style type="text/css">
+
+
+
+body {
+ font-family: Georgia,serif;
+}
+
+
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content {
+ padding: 0;
+}
+
+
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+
+var asciidoc = {
+
+
+
+
+
+
+
+
+
+
+
+
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 )
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+
+
+
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 ) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+
+
+
+
+
+
+
+footnotes: function () {
+
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+
+
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0];
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+
+</script>
+</head>
+<body class="article">
+<div id="header">
+</div>
+<div id="content">
+<div class="paragraph"><p>date = "2015-07-01T00:00:00+01:00"
+title = "Donate"
+type = "services"</p></div>
<div class="sect2">
<h3 id="_like_my_work_donate">Like my work? Donate!</h3>
<div class="paragraph"><p>You can donate via Paypal to reward me, Loïc Hoguin, for my
@@ -85,346 +737,12 @@ work on open source software including Cowboy and Erlang.mk.</p></div>
<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>
</div>
-
-
-</div>
-<div class="span3 sidecol">
-
-
-
-
-
-
-
-
-
-
-
-
- <div class="sect2">
-<h3 id="_like_my_work_donate">Like my work? Donate!</h3>
-<div class="paragraph"><p>You can donate via Paypal to reward me, Loïc Hoguin, for my
-work on open source software including Cowboy and Erlang.mk.</p></div>
-<form action="https://www.paypal.com/cgi-bin/webscr" method="post" style="display:inline">
-<input type="hidden" name="cmd" value="_donations">
-<input type="hidden" name="business" value="[email protected]">
-<input type="hidden" name="lc" value="FR">
-<input type="hidden" name="item_name" value="Loic Hoguin">
-<input type="hidden" name="item_number" value="99s">
-<input type="hidden" name="currency_code" value="EUR">
-<input type="hidden" name="bn" value="PP-DonationsBF:btn_donate_LG.gif:NonHosted">
-<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
-<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
-</form>
</div>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-</div>
-</div>
-</div>
-</div>
-
- <footer>
- <div class="container">
- <div class="row">
- <div class="span6">
- <p id="scroll-top"><a href="#">↑ Scroll to top</a></p>
- <nav>
- <ul>
- <li><a href="mailto:[email protected]" title="Contact us">Contact us</a></li><li><a href="https://github.com/ninenines/ninenines.github.io" title="Github repository">Contribute to this site</a></li>
- </ul>
- </nav>
- </div>
- <div class="span6 credits">
- <p><img src="/img/footer_logo.png"></p>
- <p>Copyright &copy; Loïc Hoguin 2012-2016</p>
- </div>
- </div>
- </div>
- </footer>
-
-
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
- <script src="/js/bootstrap-carousel.js"></script>
- <script src="/js/bootstrap-dropdown.js"></script>
- <script src="/js/custom.js"></script>
- </body>
-</html>
-
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2016-11-22 14:25:44 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/index.html b/index.html
index f18618dd..330f2997 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines</title>
@@ -224,10 +224,10 @@
<a class="btn btn-large" href="https://github.com/ninenines/ranch">Source Code</a>
- <a class="btn btn-large" href="/docs/en/ranch/1.2/guide/">User Guide</a>
+ <a class="btn btn-large" href="/docs/en/ranch/1.3/guide/">User Guide</a>
- <a class="btn btn-large" href="/docs/en/ranch/1.2/manual/">Manual</a>
+ <a class="btn btn-large" href="/docs/en/ranch/1.3/manual/">Manual</a>
</p>
@@ -536,6 +536,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
</div>
</div>
diff --git a/index.xml b/index.xml
index 8383c4de..75374ef3 100644
--- a/index.xml
+++ b/index.xml
@@ -2,7 +2,7 @@
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Nine Nines</title>
- <link>https://ninenines.eu/</link>
+ <link>https://ninenines.eu/index.xml</link>
<description>Recent content on Nine Nines</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
@@ -383,8 +383,8 @@ change in the way the code validates UTF-8 data&lt;/a&gt;
&lt;div class=&#34;paragraph&#34;&gt;&lt;p&gt;When looking into why the permessage-deflate tests
in autobahntestsuite were taking such a long time, I
found that autobahn is using an adaptation of the
-algorithm named &amp;lt;a href=&#34;http://bjoern.hoehrmann.de/utf-8/decoder/dfa/&#34;&amp;gt;Flexible
-and Economical UTF-8 Decoder&amp;lt;/a&amp;gt;. This is the C99
+algorithm named &lt;a href=&#34;http://bjoern.hoehrmann.de/utf-8/decoder/dfa/&#34;&gt;Flexible
+and Economical UTF-8 Decoder&lt;/a&gt;. This is the C99
implementation:&lt;/p&gt;&lt;/div&gt;
&lt;div class=&#34;listingblock&#34;&gt;
&lt;div class=&#34;content&#34;&gt;&lt;!-- Generator: GNU source-highlight 3.1.8
diff --git a/services/index.html b/services/index.html
index 4f6fbcc0..2631776a 100644
--- a/services/index.html
+++ b/services/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Consulting &amp; Training</title>
@@ -242,6 +242,807 @@ work on open source software including Cowboy and Erlang.mk.</p></div>
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 8.6.9" />
+<title></title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overriden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="article">
+<div id="header">
+</div>
+<div id="content">
+<div class="paragraph"><p>date = "2015-07-01T00:00:00+01:00"
+title = "Donate"
+type = "services"</p></div>
+<div class="sect2">
+<h3 id="_like_my_work_donate">Like my work? Donate!</h3>
+<div class="paragraph"><p>You can donate via Paypal to reward me, Loïc Hoguin, for my
+work on open source software including Cowboy and Erlang.mk.</p></div>
+<form action="https://www.paypal.com/cgi-bin/webscr" method="post" style="display:inline">
+<input type="hidden" name="cmd" value="_donations">
+<input type="hidden" name="business" value="[email protected]">
+<input type="hidden" name="lc" value="FR">
+<input type="hidden" name="item_name" value="Loic Hoguin">
+<input type="hidden" name="item_number" value="99s">
+<input type="hidden" name="currency_code" value="EUR">
+<input type="hidden" name="bn" value="PP-DonationsBF:btn_donate_LG.gif:NonHosted">
+<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
+<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
+</form>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated 2016-11-22 14:25:44 CET
+</div>
+</div>
+</body>
+</html>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sitemap.xml b/sitemap.xml
index deae3832..9eb04154 100644
--- a/sitemap.xml
+++ b/sitemap.xml
@@ -127,6 +127,10 @@
</url>
<url>
+ <loc>https://ninenines.eu/donate/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/cowboy/2.0/manual/</loc>
</url>
@@ -155,10 +159,18 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/manual/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/ranch/1.2/guide/</loc>
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/guide/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/cowboy/2.0/guide/overview/</loc>
</url>
@@ -319,26 +331,50 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/manual/ranch/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/ranch/1.2/manual/ranch_app/</loc>
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/manual/ranch_app/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/ranch/1.2/manual/ranch_protocol/</loc>
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/manual/ranch_protocol/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/ranch/1.2/manual/ranch_ssl/</loc>
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/manual/ranch_ssl/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/ranch/1.2/manual/ranch_tcp/</loc>
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/manual/ranch_tcp/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/ranch/1.2/manual/ranch_transport/</loc>
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/manual/ranch_transport/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/erlang.mk/1/guide/installation/</loc>
</url>
@@ -351,6 +387,10 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/guide/introduction/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/cowboy/2.0/guide/modern_web/</loc>
</url>
@@ -367,6 +407,10 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/guide/listeners/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/gun/1.0/guide/start/</loc>
</url>
@@ -383,6 +427,10 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/guide/transports/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/erlang.mk/1/guide/overview/</loc>
</url>
@@ -395,6 +443,10 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/guide/protocols/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/cowboy/2.0/guide/getting_started/</loc>
</url>
@@ -411,6 +463,10 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/guide/embedded/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/erlang.mk/1/guide/limitations/</loc>
</url>
@@ -427,6 +483,10 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/guide/parsers/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/erlang.mk/1/guide/app/</loc>
</url>
@@ -439,6 +499,10 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/guide/ssl_auth/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/erlang.mk/1/guide/deps/</loc>
</url>
@@ -451,6 +515,10 @@
</url>
<url>
+ <loc>https://ninenines.eu/docs/en/ranch/1.3/guide/internals/</loc>
+ </url>
+
+ <url>
<loc>https://ninenines.eu/docs/en/cowboy/2.0/guide/routing/</loc>
</url>
diff --git a/slogan/index.html b/slogan/index.html
index 2373ca21..7c11f9e9 100644
--- a/slogan/index.html
+++ b/slogan/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Slogan</title>
diff --git a/support/index.html b/support/index.html
index 03f066bf..ca1b17c3 100644
--- a/support/index.html
+++ b/support/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/services/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/services/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/services/</title><link rel="canonical" href="https://ninenines.eu/services/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/services/" /></head></html> \ No newline at end of file
diff --git a/tags/index.html b/tags/index.html
index 1068a90b..27fb4f82 100644
--- a/tags/index.html
+++ b/tags/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Tags</title>
diff --git a/talks/index.html b/talks/index.html
index 96363798..6607c13f 100644
--- a/talks/index.html
+++ b/talks/index.html
@@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="Loïc Hoguin based on a design from (Soft10) Pol Cámara">
- <meta name="generator" content="Hugo 0.16" />
+ <meta name="generator" content="Hugo 0.17" />
<title>Nine Nines: Public talks</title>
diff --git a/training/index.html b/training/index.html
index 03f066bf..ca1b17c3 100644
--- a/training/index.html
+++ b/training/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html><head><link rel="canonical" href="https://ninenines.eu/services/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0;url=https://ninenines.eu/services/" /></head></html> \ No newline at end of file
+<!DOCTYPE html><html><head><title>https://ninenines.eu/services/</title><link rel="canonical" href="https://ninenines.eu/services/"/><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=https://ninenines.eu/services/" /></head></html> \ No newline at end of file