Skip to content

Commit fb0cbd4

Browse files
committed
fix: handle {:more, L} from decode_packet
1 parent 230c89f commit fb0cbd4

File tree

1 file changed

+20
-9
lines changed
  • lib/gen_lsp/communication

1 file changed

+20
-9
lines changed

lib/gen_lsp/communication/tcp.ex

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ defmodule GenLSP.Communication.TCP do
6060
end
6161

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

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

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

83-
defp read_headers(packet) do
83+
defp read_headers(packet, socket) do
8484
packet
85-
|> decode_header()
86-
|> read_headers(Map.new())
85+
|> decode_header(socket)
86+
|> read_headers(Map.new(), socket)
8787
end
8888

89-
defp read_headers({:ok, :http_eoh, body}, headers) do
89+
defp read_headers({:ok, :http_eoh, body}, headers, _socket) do
9090
{headers, body}
9191
end
9292

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

9696
more
97-
|> decode_header()
98-
|> read_headers(headers)
97+
|> decode_header(socket)
98+
|> read_headers(headers, socket)
9999
end
100100

101-
defp decode_header(packet), do: :erlang.decode_packet(:httph_bin, packet, [])
101+
defp decode_header(packet, socket) do
102+
case :erlang.decode_packet(:httph_bin, packet, []) do
103+
{:more, size} ->
104+
size = if size == :undefined, do: 0, else: size
105+
{:ok, more} = :gen_tcp.recv(socket, size)
106+
107+
decode_header(packet <> more, socket)
108+
109+
other ->
110+
other
111+
end
112+
end
102113
end

0 commit comments

Comments
 (0)