           scheme: :http
         }, :keepalive, {:complete, ""}, ""}}
   """
+  @spec parse_request(binary, atom) ::
+          {:ok, {Raxx.Request.t(), connection_status, body_read_state, binary}}
   def parse_request(buffer, scheme) when is_atom(scheme) do
     case :erlang.decode_packet(:http_bin, buffer, []) do
       {:ok, {:http_request, method, {:abs_path, path_and_query}, _version}, rest} ->

  - Property of serialize then decode the head should end up with the same struct
  - Propery of any number of splits in the binary should not change the output
  """

  @crlf "\r\n"


      ...> |> to_string()
      "0\\r\\n\\r\\n"
  """
  @spec serialize_chunk(iodata) :: iodata
  def serialize_chunk(data) do
    size = :erlang.iolist_size(data)
    [:erlang.integer_to_list(size, 16), "\r\n", data, "\r\n"]
  end

  @doc """
  Extract the content from a buffer with transfer encoding chunked
  """
  @spec parse_chunk(binary) :: {:ok, {binary | nil, binary}}
  def parse_chunk(buffer) do
    case String.split(buffer, "\r\n", parts: 2) do
      [base_16_size, rest] ->
