diff --git a/examples/complete/manifest.toml b/examples/complete/manifest.toml index a95cf3a..cc05077 100644 --- a/examples/complete/manifest.toml +++ b/examples/complete/manifest.toml @@ -2,16 +2,18 @@ # You typically do not need to edit this file packages = [ - { name = "birl", version = "1.6.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "976CFF85D34D50F7775896615A71745FBE0C325E50399787088F941B539A0497" }, + { name = "birl", version = "1.7.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "B1FA529E7BE3FF12CADF32814AB8EC7294E74CEDEE8CC734505707B929A98985" }, + { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_stdlib", version = "0.37.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "5398BD6C2ABA17338F676F42F404B9B7BABE1C8DC7380031ACB05BBE1BCF3742" }, + { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, + { name = "gramps", version = "2.0.2", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "99A1BC8462E502282097D92CD7053043B714B91DC78E8AEB7D86AB8FF71E016F" }, { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, { name = "logging", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "logging", source = "hex", outer_checksum = "A996064F04EF6E67F0668FD0ACFB309830B05D0EE3A0C11BBBD2D4464334F792" }, - { name = "mist", version = "1.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "hpack_erl", "logging"], source = "local", path = "../.." }, + { name = "mist", version = "1.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_erlang", "gleam_http", "gleam_otp", "gleam_stdlib", "glisten", "gramps", "hpack_erl", "logging"], source = "local", path = "../.." }, { name = "ranger", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "ranger", source = "hex", outer_checksum = "1566C272B1D141B3BBA38B25CB761EF56E312E79EC0E2DFD4D3C19FB0CC1F98C" }, ] diff --git a/examples/complete/src/complete.gleam b/examples/complete/src/complete.gleam index 12aa283..fdd2b14 100644 --- a/examples/complete/src/complete.gleam +++ b/examples/complete/src/complete.gleam @@ -45,6 +45,8 @@ pub fn main() { case request.path_segments(req) { [] -> response.new(200) + |> response.prepend_header("my-value", "abc") + |> response.prepend_header("my-value", "123") |> response.set_body(mist.Bytes(bytes_builder.from_string(index))) ["ws"] -> mist.websocket( @@ -78,7 +80,8 @@ fn handle_ws_message(state, conn, message) { let assert Ok(_) = mist.send_text_frame(conn, "pong") actor.continue(state) } - mist.Text(_) | mist.Binary(_) -> { + mist.Text(_) + | mist.Binary(_) -> { actor.continue(state) } mist.Custom(Broadcast(text)) -> { diff --git a/manifest.toml b/manifest.toml index 5f8b1c7..0c109d9 100644 --- a/manifest.toml +++ b/manifest.toml @@ -2,17 +2,17 @@ # You typically do not need to edit this file packages = [ - { name = "birl", version = "1.6.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "976CFF85D34D50F7775896615A71745FBE0C325E50399787088F941B539A0497" }, + { name = "birl", version = "1.7.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "B1FA529E7BE3FF12CADF32814AB8EC7294E74CEDEE8CC734505707B929A98985" }, { name = "certifi", version = "2.12.0", build_tools = ["rebar3"], requirements = [], otp_app = "certifi", source = "hex", outer_checksum = "EE68D85DF22E554040CDB4BE100F33873AC6051387BAF6A8F6CE82272340FF1C" }, { name = "gleam_crypto", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_crypto", source = "hex", outer_checksum = "ADD058DEDE8F0341F1ADE3AAC492A224F15700829D9A3A3F9ADF370F875C51B7" }, { name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" }, { name = "gleam_hackney", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_http", "gleam_stdlib", "hackney"], otp_app = "gleam_hackney", source = "hex", outer_checksum = "066B1A55D37DBD61CC72A1C4EDE43C6015B1797FAF3818C16FE476534C7B6505" }, { name = "gleam_http", version = "3.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_http", source = "hex", outer_checksum = "8C07DF9DF8CC7F054C650839A51C30A7D3C26482AC241C899C1CEA86B22DBE51" }, { name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" }, - { name = "gleam_stdlib", version = "0.37.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "5398BD6C2ABA17338F676F42F404B9B7BABE1C8DC7380031ACB05BBE1BCF3742" }, + { name = "gleam_stdlib", version = "0.38.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "663CF11861179AF415A625307447775C09404E752FF99A24E2057C835319F1BE" }, { name = "gleeunit", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "72CDC3D3F719478F26C4E2C5FED3E657AC81EC14A47D2D2DEBB8693CA3220C3B" }, { name = "glisten", version = "2.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib"], otp_app = "glisten", source = "hex", outer_checksum = "CF3A9383E9BA4A8CBAF2F7B799716290D02F2AC34E7A77556B49376B662B9314" }, - { name = "gramps", version = "2.0.1", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "FBB7EA641C8A1EF02C0E938B6045A1360B925E5E65BAD0E228C4AEF6C6933722" }, + { name = "gramps", version = "2.0.2", build_tools = ["gleam"], requirements = ["gleam_crypto", "gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gramps", source = "hex", outer_checksum = "99A1BC8462E502282097D92CD7053043B714B91DC78E8AEB7D86AB8FF71E016F" }, { name = "hackney", version = "1.20.1", build_tools = ["rebar3"], requirements = ["certifi", "idna", "metrics", "mimerl", "parse_trans", "ssl_verify_fun", "unicode_util_compat"], otp_app = "hackney", source = "hex", outer_checksum = "FE9094E5F1A2A2C0A7D10918FEE36BFEC0EC2A979994CFF8CFE8058CD9AF38E3" }, { name = "hpack_erl", version = "0.3.0", build_tools = ["rebar3"], requirements = [], otp_app = "hpack", source = "hex", outer_checksum = "D6137D7079169D8C485C6962DFE261AF5B9EF60FBC557344511C1E65E3D95FB0" }, { name = "idna", version = "6.1.1", build_tools = ["rebar3"], requirements = ["unicode_util_compat"], otp_app = "idna", source = "hex", outer_checksum = "92376EB7894412ED19AC475E4A86F7B413C1B9FBB5BD16DCCD57934157944CEA" }, diff --git a/src/mist/internal/http.gleam b/src/mist/internal/http.gleam index 7633132..a8107d8 100644 --- a/src/mist/internal/http.gleam +++ b/src/mist/internal/http.gleam @@ -1,5 +1,4 @@ import gleam/bit_array -import gleam/bool import gleam/bytes_builder.{type BytesBuilder} import gleam/dict.{type Dict} import gleam/dynamic.{type Dynamic} @@ -223,7 +222,8 @@ fn read_chunk( } } } - <<>> as data, _ | data, Error(Nil) -> { + <<>> as data, _ + | data, Error(Nil) -> { use next <- result.then(read_data( socket, transport, @@ -383,7 +383,9 @@ pub fn read_body( data: data, remaining: remaining, attempts: attempts, - ) if remaining > 0 -> { + ) + if remaining > 0 + -> { let res = selector |> process.select(1000) diff --git a/src/mist/internal/http/handler.gleam b/src/mist/internal/http/handler.gleam index 438d573..745ef01 100644 --- a/src/mist/internal/http/handler.gleam +++ b/src/mist/internal/http/handler.gleam @@ -1,5 +1,4 @@ import gleam/bytes_builder.{type BytesBuilder} -import gleam/dynamic import gleam/erlang.{Errored, Exited, Thrown, rescue} import gleam/erlang/process.{type Subject} import gleam/http as ghttp @@ -65,7 +64,9 @@ fn log_and_error( req: Request(Connection), ) -> process.ExitReason { case error { - Exited(msg) | Thrown(msg) | Errored(msg) -> { + Exited(msg) + | Thrown(msg) + | Errored(msg) -> { logging.log(logging.Error, string.inspect(error)) let _ = response.new(500) @@ -77,7 +78,7 @@ fn log_and_error( |> encoder.to_bytes_builder |> transport.send(transport, socket, _) let _ = transport.close(transport, socket) - process.Abnormal(dynamic.unsafe_coerce(msg)) + process.Abnormal(string.inspect(msg)) } } } diff --git a/src/mist/internal/http2.gleam b/src/mist/internal/http2.gleam index 6f511d6..99d99f0 100644 --- a/src/mist/internal/http2.gleam +++ b/src/mist/internal/http2.gleam @@ -1,7 +1,7 @@ import gleam/bytes_builder.{type BytesBuilder} import gleam/erlang import gleam/erlang/process -import gleam/http.{type Header} as ghttp +import gleam/http.{type Header} as _ghttp import gleam/http/response.{type Response} import gleam/int import gleam/list @@ -138,12 +138,16 @@ pub fn send_bytes_builder( 0 -> send_headers(context, conn, headers, True, id) _ -> { send_headers(context, conn, headers, False, id) - |> result.then(fn(context) { - // TODO: this should be broken up by window size - // TODO: fix end_stream - send_data(conn, bytes_builder.to_bit_array(resp.body), id, True) - |> result.replace(context) - }) + |> result.then( + fn( + context, + // TODO: this should be broken up by window size + // TODO: fix end_stream + ) { + send_data(conn, bytes_builder.to_bit_array(resp.body), id, True) + |> result.replace(context) + }, + ) } } } diff --git a/test/http1_test.gleam b/test/http1_test.gleam index a623fb6..26f5577 100644 --- a/test/http1_test.gleam +++ b/test/http1_test.gleam @@ -239,8 +239,3 @@ pub fn it_sends_back_chunked_responses_test() { should.equal(resp.status, 200) should.equal(resp.body, string.repeat("a", 1000)) } - -pub fn it_allows_multiple_headers_test() { - // TODO: fix - should.equal(False, True) -}