           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} ->

      ...> |> :erlang.iolist_to_binary()
      "HTTP/1.1 204 No Content\\r\\nconnection: keep-alive\\r\\nfoo: bar\\r\\n\\r\\n"
  """
  @spec serialize_response(Raxx.Response.t(), [{:connection, :close | :keepalive}]) ::
          {iolist, {:complete, iodata} | {:bytes, non_neg_integer() | :chunked}}
  def serialize_response(response = %Raxx.Response{}, options \\ []) do
    {payload_headers, body} = payload(response)
    connection_headers = connection_headers(Keyword.get(options, :connection))

      ...> |> 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] ->
