Skip to content

Commit

Permalink
fix: handle {:more, L} from decode_packet
Browse files Browse the repository at this point in the history
  • Loading branch information
mhanberg committed Feb 15, 2024
1 parent 230c89f commit fb0cbd4
Showing 1 changed file with 20 additions and 9 deletions.
29 changes: 20 additions & 9 deletions lib/gen_lsp/communication/tcp.ex
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ defmodule GenLSP.Communication.TCP do
end

def read(state, buffer) do
{%{"Content-Length" => length}, buffer} = read_headers(buffer)
{%{"Content-Length" => length}, buffer} = read_headers(buffer, state.socket)

{body, buffer} = read_body(state.socket, buffer, String.to_integer(length))

Expand All @@ -80,23 +80,34 @@ defmodule GenLSP.Communication.TCP do
read_body(socket, buffer <> packet, length)
end

defp read_headers(packet) do
defp read_headers(packet, socket) do
packet
|> decode_header()
|> read_headers(Map.new())
|> decode_header(socket)
|> read_headers(Map.new(), socket)
end

defp read_headers({:ok, :http_eoh, body}, headers) do
defp read_headers({:ok, :http_eoh, body}, headers, _socket) do
{headers, body}
end

defp read_headers({:ok, {:http_header, _, header, _header, value}, more}, headers) do
defp read_headers({:ok, {:http_header, _, header, _header, value}, more}, headers, socket) do
headers = Map.put(headers, to_string(header), value)

more
|> decode_header()
|> read_headers(headers)
|> decode_header(socket)
|> read_headers(headers, socket)
end

defp decode_header(packet), do: :erlang.decode_packet(:httph_bin, packet, [])
defp decode_header(packet, socket) do
case :erlang.decode_packet(:httph_bin, packet, []) do
{:more, size} ->
size = if size == :undefined, do: 0, else: size
{:ok, more} = :gen_tcp.recv(socket, size)

decode_header(packet <> more, socket)

other ->
other
end
end
end

0 comments on commit fb0cbd4

Please sign in to comment.