<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="79055" data-post-id="79055">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="tmbb" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  tmbb
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="OvermindDL1" data-post="25" data-topic="9380">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/overminddl1/48/2677_2.png" class="avatar"> OvermindDL1:</div>
<blockquote>
<p>Basically I think conn should be a state monad threaded through all of its calls, every single call regardless of if used or not.</p>
</blockquote>
</aside>
<p><a href="https://github.com/expede/witchcraft" rel="noopener nofollow ugc">Needs more type classes…</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="79055" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/32">Post #31</a>
	                </div>
	            </div>
              <div id="likers-container-79055" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="79055"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #31"></div>
  </section>
</div>
    <div class="postbit" id="79257" data-post-id="79257">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Crowdhailer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Crowdhailer/120/2438_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Crowdhailer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Raxx</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I like this. I have looked wrapping a session up in a state monad.</p>
<pre><code>Session.for request do
  value &lt;- get(:user_id)
  _ &lt;- set(csrf: new_token)
after
  response
end
</code></pre>
<p>This is dreamcoding no implementation in the works yet</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="79257" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/33">Post #32</a>
	                </div>
	            </div>
              <div id="likers-container-79257" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="79257"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #32"></div>
  </section>
</div>
    <div class="postbit" id="82270" data-post-id="82270">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Crowdhailer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Crowdhailer/120/2438_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Crowdhailer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Raxx</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h3><a name="p-82270-better-erlang-support-in-0154httpshexpmpackagesraxx-release-1" class="anchor" href="#p-82270-better-erlang-support-in-0154httpshexpmpackagesraxx-release-1" aria-label="Heading link" rel="nofollow"></a>Better erlang support in <a href="https://hex.pm/packages/raxx" rel="nofollow">0.15.4</a> release.</h3>
<p>The main module now has a parallel Erlang friendly implementation. anyone wanting to try to use Ace + Raxx in erlang can now use handlers like this.</p>
<pre data-code-wrap="erlang"><code class="lang-erlang">-module(greetings_www).

-behaviour('Elixir.Raxx.Server').

-export ([handle_head/2]).

handle_head(_Request, _Config) -&gt;
  Response = raxx:response(ok),
  raxx:set_body(Response, &lt;&lt;"Hello, World"&gt;&gt;).
</code></pre>
<h3><a name="p-82270-implementation-2" class="anchor" href="#p-82270-implementation-2" aria-label="Heading link" rel="nofollow"></a>Implementation.</h3>
<p>The whole <code>:raxx</code> module simply delegates every function in the <code>Raxx</code> module</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule :raxx do
  @moduledoc false
  # A module that is clean to call in erlang code with the same functionality as `Raxx`.

  for {name, arity} &lt;- Raxx.__info__(:functions) do
    args = for i &lt;- 0..arity, i &gt; 0, do: Macro.var(:"#{i}", nil)
    defdelegate unquote(name)(unquote_splicing(args)), to: Raxx
  end
end
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="82270" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/34">Post #33</a>
	                </div>
	            </div>
              <div id="likers-container-82270" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="82270"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #33"></div>
  </section>
</div>
    <div class="postbit" id="91179" data-post-id="91179">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Crowdhailer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Crowdhailer/120/2438_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Crowdhailer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Raxx</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h3><a name="p-91179-extra-helpers-for-fetching-port-and-host-information-from-a-request-added-0155httpshexpmpackagesraxx0155-1" class="anchor" href="#p-91179-extra-helpers-for-fetching-port-and-host-information-from-a-request-added-0155httpshexpmpackagesraxx0155-1" aria-label="Heading link" rel="nofollow"></a>Extra helpers for fetching port and host information from a request added: <a href="https://hex.pm/packages/raxx/0.15.5" rel="nofollow">0.15.5</a></h3>
<pre><code>iex&gt; Raxx.request(:GET, "http://www.example.com/hello")
...&gt; |&gt; Raxx.request_host()
"www.example.com"

iex&gt; Raxx.request(:GET, "http://www.example.com:1234/hello")
...&gt; |&gt; Raxx.request_host()
"www.example.com"

iex&gt; Raxx.request(:GET, "http://www.example.com:1234/hello")
...&gt; |&gt; Raxx.request_port()
1234

iex&gt; Raxx.request(:GET, "http://www.example.com/hello")
...&gt; |&gt; Raxx.request_port()
80

iex&gt; Raxx.request(:GET, "https://www.example.com/hello")
...&gt; |&gt; Raxx.request_port()
443
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="91179" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/35">Post #34</a>
	                </div>
	            </div>
              <div id="likers-container-91179" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="91179"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #34"></div>
  </section>
</div>
    <div class="postbit" id="92986" data-post-id="92986">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Crowdhailer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Crowdhailer/120/2438_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Crowdhailer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Raxx</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h3><a name="p-92986-serialization-and-parsing-tools-added-0157httpshexpmpackagesraxx0157-1" class="anchor" href="#p-92986-serialization-and-parsing-tools-added-0157httpshexpmpackagesraxx0157-1" aria-label="Heading link" rel="nofollow"></a>Serialization and Parsing tools added <a href="https://hex.pm/packages/raxx/0.15.7" rel="nofollow">0.15.7</a></h3>
<p>These tools are part of the Raxx library as they can be used to implement both servers and clients.<br>
The Ace server and a ServerSentEvent Client library are being updated to make use of these tools.<br>
Hopefully a Raxx based client library will follow.</p>
<pre><code>iex&gt; request = Raxx.request(:GET, "http://example.com/path?qs")
...&gt; |&gt; Raxx.set_header("accept", "text/plain")
...&gt; {head, body} =  Raxx.HTTP1.serialize_request(request)
...&gt; :erlang.iolist_to_binary(head)
"GET /path?qs HTTP/1.1\r\nhost: example.com\r\naccept: text/plain\r\n\r\n"
iex&gt; body
{:complete, ""}

iex&gt; response = Raxx.response(200)
...&gt; |&gt; Raxx.set_header("content-type", "text/plain")
...&gt; |&gt; Raxx.set_body("Hello, World!")
...&gt; {head, body} =  Raxx.HTTP1.serialize_response(response)
...&gt; :erlang.iolist_to_binary(head)
"HTTP/1.1 200 OK\r\ncontent-length: 13\r\ncontent-type: text/plain\r\n\r\n"
iex&gt; body
{:complete, "Hello, World!"}
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="92986" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/36">Post #35</a>
	                </div>
	            </div>
              <div id="likers-container-92986" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="92986"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #35"></div>
  </section>
</div>
    <div class="postbit" id="94117" data-post-id="94117">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Crowdhailer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Crowdhailer/120/2438_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Crowdhailer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Raxx</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Raxx now has a simple client for HTTP/1.1</p>
<h3><a name="p-94117-examples-1" class="anchor" href="#p-94117-examples-1" aria-label="Heading link" rel="nofollow"></a>Examples</h3>
<h4><a name="p-94117-synchronous-2" class="anchor" href="#p-94117-synchronous-2" aria-label="Heading link" rel="nofollow"></a>synchronous</h4>
<pre><code>request = Raxx.request(:GET, "http://example.com")
|&gt; Raxx.set_header("accept", "text/html")

{:ok, response} = Raxx.SimpleClient.send_sync(request, 2000)
</code></pre>
<h4><a name="p-94117-asynchronous-3" class="anchor" href="#p-94117-asynchronous-3" aria-label="Heading link" rel="nofollow"></a>asynchronous</h4>
<pre><code>request = Raxx.request(:GET, "http://example.com")
|&gt; Raxx.set_header("accept", "text/html")

channel = Raxx.SimpleClient.send_async(request)
{:ok, response} = Raxx.SimpleClient.yield(channel, 2000)
</code></pre>
<h3><a name="p-94117-simple-client-4" class="anchor" href="#p-94117-simple-client-4" aria-label="Heading link" rel="nofollow"></a>Simple Client</h3>
<p>Client is simple because it makes very few assumptions about how to deal with requests and responses.</p>
<p>For example.</p>
<ul>
<li>Cookies are not managed, each request is handled in isolation</li>
<li>Connections are not limited or reused, each request gets a new connection</li>
</ul>
<p>These omissions of functionality make the client much simpler to work with and reason about.<br>
They are also not limitations in many cases. An API client probably doesn’t use cookies.</p>
<h3><a name="p-94117-composable-requests-5" class="anchor" href="#p-94117-composable-requests-5" aria-label="Heading link" rel="nofollow"></a>Composable requests</h3>
<p>Because a <code>Raxx.Request</code> is just a data structure,<br>
using this client separates the logic of building the request from the side effect of sending it.</p>
<p>This makes it very easy add custom functionality for your own clients.</p>
<pre><code> import Raxx

def set_request_id(request, request_id) do
  request
  |&gt; set_header("x-request-id", request_id)
end

def set_json_payload(request, json) do
  request
  |&gt; set_header("content-type", "application/json")
  |&gt; set_body(Poison.encode!(json))
end

# later
request = Raxx.request(:POST, "http://api.com/create_user")
|&gt; set_request_id("12345")
|&gt; set_json_payload(%{"username" =&gt; "alice"})
</code></pre>
<p>The value of this separation for me in my own projects has been with testing.<br>
It’s now very easy to create invalid requests. just forget to set a request_id and then send it to the API.</p>
<h3><a name="p-94117-raxx-0158httpshexpmpackagesraxx0158-adds-raxxsimpleclient-6" class="anchor" href="#p-94117-raxx-0158httpshexpmpackagesraxx0158-adds-raxxsimpleclient-6" aria-label="Heading link" rel="nofollow"></a><a href="https://hex.pm/packages/raxx/0.15.8" rel="nofollow">Raxx 0.15.8</a> adds <code>Raxx.SimpleClient</code></h3> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="94117" data-batch-url="/posts/batch_likers">
                        6
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/37">Post #36</a>
	                </div>
	            </div>
              <div id="likers-container-94117" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="94117"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #36"></div>
  </section>
</div>
    <div class="postbit" id="94837" data-post-id="94837">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Crowdhailer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Crowdhailer/120/2438_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Crowdhailer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Raxx</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h1><a name="p-94837-raxxview-and-raxxlayout-added-in-0159httpshexpmpackagesraxx0159-1" class="anchor" href="#p-94837-raxxview-and-raxxlayout-added-in-0159httpshexpmpackagesraxx0159-1" aria-label="Heading link" rel="nofollow"></a>Raxx.View and Raxx.Layout added in <a href="https://hex.pm/packages/raxx/0.15.9" rel="nofollow">0.15.9</a>.</h1>
<p><strong>These changes include an <code>EEx.HTMLEngine</code>, this module will be moved to a separate project at somepoint.</strong></p>
<h1><a name="p-94837-raxxlayout-2" class="anchor" href="#p-94837-raxxlayout-2" aria-label="Heading link" rel="nofollow"></a>Raxx.Layout</h1>
<h3><a name="p-94837-creating-a-new-layout-3" class="anchor" href="#p-94837-creating-a-new-layout-3" aria-label="Heading link" rel="nofollow"></a>Creating a new layout</h3>
<pre><code># www/layout.html.eex
&lt;h1&gt;My Site&lt;/h1&gt;
&lt;%= __content__ %&gt;

# www/layout.ex
defmodule WWW.Layout do
  use Raxx.Layout,
    layout: "layout.html.eex"

  def format_datetime(datetime) do
    DateTime.to_iso8601(datetime)
  end
end
</code></pre>
<h3><a name="p-94837-creating-a-view-4" class="anchor" href="#p-94837-creating-a-view-4" aria-label="Heading link" rel="nofollow"></a>Creating a view</h3>
<pre><code># www/show_user.html.eex
&lt;h2&gt;&lt;%= user.username %&gt;&lt;/h2&gt;
&lt;p&gt;signed up at &lt;%= format_datetime(user.interted_at) %&gt;&lt;/p&gt;

# www/show_user.ex
defmodule WWW.ShowUser do
  use Raxx.Server
  use WWW.Layout,
    template: "show_user.html.eex",
    arguments: [:user]

  @impl Raxx.Server
  def handle_request(_request, _state) do
    user = # fetch user somehow

    response(:ok)
    |&gt; render(user)
  end
end
</code></pre>
<h1><a name="p-94837-raxxview-5" class="anchor" href="#p-94837-raxxview-5" aria-label="Heading link" rel="nofollow"></a>Raxx.View</h1>
<h3><a name="p-94837-example-6" class="anchor" href="#p-94837-example-6" aria-label="Heading link" rel="nofollow"></a>Example</h3>
<pre><code># greet.html.eex
&lt;p&gt;Hello, &lt;%= name %&gt;&lt;/p&gt;

# layout.html.eex
&lt;h1&gt;Greetings&lt;/h1&gt;
&lt;%= __content__ %&gt;

# greet.ex
defmodule Greet do
  use Raxx.View,
    arguments: [:name],
    layout: "layout.html.eex"
end

# iex -S mix
Greet.html("Alice")
# =&gt; "&lt;h1&gt;Greetings&lt;/h1&gt;\n&lt;p&gt;Hello, Alice&lt;/p&gt;"

Raxx.response(:ok)
|&gt; Greet.render("Bob")
# =&gt; %Raxx.Response{
#      status: 200,
#      headers: [{"content-type", "text/html"}],
#      body: "&lt;h1&gt;Greetings&lt;/h1&gt;\n&lt;p&gt;Hello, Alice&lt;/p&gt;"
#    }
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="94837" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/38">Post #37</a>
	                </div>
	            </div>
              <div id="likers-container-94837" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="94837"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #37"></div>
  </section>
</div>
    <div class="postbit" id="96413" data-post-id="96413">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Crowdhailer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Crowdhailer/120/2438_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Crowdhailer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Raxx</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h2><a name="p-96413-h-0160-a-bucket-of-changes-focused-around-adding-utilities-and-improving-error-cases-1" class="anchor" href="#p-96413-h-0160-a-bucket-of-changes-focused-around-adding-utilities-and-improving-error-cases-1" aria-label="Heading link" rel="nofollow"></a><a rel="nofollow">0.16.0</a> A Bucket of changes, focused around adding utilities and improving error cases.</h2>
<p><strong>Includes BREAKING CHANGE</strong>:</p>
<ul>
<li><code>set_body</code> automatically adds the content length.</li>
<li><code>set_body</code> raises exception for responses that cannot have a body.</li>
<li><code>html_escape</code> moved to <code>EExHTML</code> project.</li>
</ul>
<h2><a name="p-96413-changelog-2" class="anchor" href="#p-96413-changelog-2" aria-label="Heading link" rel="nofollow"></a>CHANGELOG</h2>
<h3><a name="p-96413-added-3" class="anchor" href="#p-96413-added-3" aria-label="Heading link" rel="nofollow"></a>Added</h3>
<ul>
<li><code>:maximum_body_length</code> options when using <code>Raxx.Server</code> so protect against bad clients.</li>
<li><code>Raxx.set_content_length/3</code> to set the content length of a request or response.</li>
<li><code>Raxx.get_content_length/2</code> to get the integer value for the content length of a message.</li>
<li><code>Raxx.set_attachment/2</code> helper to tell the browser the response should be stored on disk rather than displayed in the browser.</li>
<li><code>Raxx.safe?/1</code> to check if request method marks it as safe.</li>
<li><code>Raxx.idempotent?/1</code> to check if request method marks it as idempotent.</li>
<li><code>Raxx.get_query/1</code> replacement for <code>Raxx.fetch_query/1</code> because it never returns error case.</li>
</ul>
<h3><a name="p-96413-changed-4" class="anchor" href="#p-96413-changed-4" aria-label="Heading link" rel="nofollow"></a>Changed</h3>
<ul>
<li><code>Raxx.set_body/2</code> will raise an exception for responses that cannot have a body.</li>
<li><code>Raxx.set_body/2</code> automatically adds the “content-length” if it is able.</li>
<li>Requests and Responses now work with iodata.
<ul>
<li><code>Raxx.body</code> spec changed to include iodata.</li>
<li>Improved error message when using invalid iolist in a view.</li>
<li><code>Raxx.NotFound</code> works with iodata for temporary body during buffering.</li>
<li><code>render</code> function generated by <code>Raxx.View</code> sets body to iodata from view,<br>
without turning into a binary.</li>
</ul>
</li>
<li><code>Raxx.set_header/2</code> now raises when setting connection specific headers.</li>
</ul>
<h3><a name="p-96413-removed-5" class="anchor" href="#p-96413-removed-5" aria-label="Heading link" rel="nofollow"></a>Removed</h3>
<ul>
<li><code>EEx.HTML</code> replaced by <code>EExHTML</code> from the <code>eex_html</code> hex package.</li>
<li><code>Raxx.html_escape/1</code> replaced by <code>EExHTML.escape_to_binary/1</code>.</li>
</ul>
<h3><a name="p-96413-fixed-6" class="anchor" href="#p-96413-fixed-6" aria-label="Heading link" rel="nofollow"></a>Fixed</h3>
<ul>
<li><code>Raxx.HTTP1.parse_request/1</code> and <code>Raxx.HTTP1.parse_response/1</code> handle more error cases.
<ul>
<li>response/request sent when request/response expected.</li>
<li>multiple “host” headers in message.</li>
<li>invalid “content-length” header.</li>
<li>multiple “content-length” headers in message.</li>
<li>invalid “connection” header.</li>
<li>multiple “connection” headers in message.</li>
</ul>
</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="96413" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/39">Post #38</a>
	                </div>
	            </div>
              <div id="likers-container-96413" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="96413"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #38"></div>
  </section>
</div>
    <div class="postbit" id="101934" data-post-id="101934">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Crowdhailer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Crowdhailer/120/2438_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Crowdhailer
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Raxx</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<h3><a name="p-101934-breaking-changes-to-separate-the-streaming-interface-from-the-simple-interface-are-coming-in-the-next-version-1" class="anchor" href="#p-101934-breaking-changes-to-separate-the-streaming-interface-from-the-simple-interface-are-coming-in-the-next-version-1" aria-label="Heading link" rel="nofollow"></a>Breaking changes to separate the Streaming interface from the Simple interface are coming in the next version.</h3>
<p><a href="https://github.com/CrowdHailer/raxx/pull/143" class="onebox" target="_blank" rel="noopener nofollow ugc">https://github.com/CrowdHailer/raxx/pull/143</a></p>
<p>This pull request introduces the changes as well as linking to one project for an example of upgrading.<br>
Feedback invited on the PR, or in <a href="https://elixir-lang.slack.com/messages/C56H3TBH8/convo/C56H3TBH8-1540541691.004600/" rel="noopener nofollow ugc">slack</a></p>
<p>The reason for these changes is to lay the groundwork for adding better middleware.</p>
<aside class="quote no-group" data-username="michalmuskala" data-post="6" data-topic="9380">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/michalmuskala/48/20288_2.png" class="avatar"> michalmuskala:</div>
<blockquote>
<p>I wonder about the decision to make middlewares compile-time. I generally consider the fact that plugs are compile-time the biggest design flaw for plug - it’s often very limiting and annoying</p>
</blockquote>
</aside>
<p>For example the new middleware will be able to be configured at Runtime.</p>
<aside class="quote no-group" data-username="Qqwy" data-post="18" data-topic="9380">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/qqwy/48/1349_2.png" class="avatar"> Qqwy:</div>
<blockquote>
<p>However, I am not really happy with how the middlewares currently work, since they ‘decorate’ the original <code>handle_xxxx</code> call with their own wrapper at compile time which may result in performant code, but it makes the middleware code itself quite hard to read.</p>
</blockquote>
</aside>
<p>New middleware will also not require the use of Macros.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="101934" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/40">Post #39</a>
	                </div>
	            </div>
              <div id="likers-container-101934" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="101934"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #39"></div>
  </section>
</div>
    <div class="postbit" id="101943" data-post-id="101943">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="tmbb" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  tmbb
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>It seems like it would be cool to integrate with my <code>Vampyre</code> package when it’s done for <em>even faster</em> templates <img src="https://forum.elixirforum.com/images/emoji/apple/smile.png?v=15" title=":smile:" class="emoji" alt=":smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="101943" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/raxx-interface-for-http-webservers-frameworks-and-clients-1-0-now-released/9380/41">Post #40</a>
	                </div>
	            </div>
              <div id="likers-container-101943" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="101943"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #40"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/9380/load_more?page=5">Load more posts (14 remaining)</a>
</div></template></turbo-stream>