๐Ÿ‘ a fluffy Gleam web server
23

Configure Feed

Select the types of activity you want to include in your feed.

release v3.0.2

vshakitskiy (Feb 23, 2026, 2:45 PM +0300) 23251e68 27b2795d

+6 -9
+1 -1
CHANGELOG.md
··· 1 1 # Changelog 2 2 3 - # Unreleased 3 + # v3.0.2 - 23.02.2026 4 4 5 5 - Gracefully handle HTTP/2 connections: h2c upgrade requests are served as HTTP/1.1, and direct HTTP/2 connections receive a GOAWAY with HTTP_1_1_REQUIRED instead of being silently dropped. 6 6 - Fixed HTTP/2 prior-knowledge detection in ffi
+1 -1
gleam.toml
··· 1 1 name = "ewe" 2 - version = "3.0.1" 2 + version = "3.0.2" 3 3 4 4 description = "๐Ÿ‘ a fluffy Gleam web server" 5 5 target = "erlang"
+1 -1
manifest.toml
··· 10 10 { name = "gleam_httpc", version = "5.0.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_http", "gleam_stdlib"], otp_app = "gleam_httpc", source = "hex", outer_checksum = "C545172618D07811494E97AAA4A0FB34DA6F6D0061FDC8041C2F8E3BE2B2E48F" }, 11 11 { name = "gleam_json", version = "3.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "44FDAA8847BE8FC48CA7A1C089706BD54BADCC4C45B237A992EDDF9F2CDB2836" }, 12 12 { name = "gleam_otp", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "BA6A294E295E428EC1562DC1C11EA7530DCB981E8359134BEABC8493B7B2258E" }, 13 - { name = "gleam_stdlib", version = "0.68.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "F7FAEBD8EF260664E86A46C8DBA23508D1D11BB3BCC6EE1B89B3BC3E5C83FF1E" }, 13 + { name = "gleam_stdlib", version = "0.69.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "AAB0962BEBFAA67A2FBEE9EEE218B057756808DC9AF77430F5182C6115B3A315" }, 14 14 { name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" }, 15 15 { name = "gleeunit", version = "1.9.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "DA9553CE58B67924B3C631F96FE3370C49EB6D6DC6B384EC4862CC4AAA718F3C" }, 16 16 { name = "glisten", version = "8.0.3", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging", "telemetry"], otp_app = "glisten", source = "hex", outer_checksum = "86B838196592D9EBDE7A1D2369AE3A51E568F7DD2D168706C463C42D17B95312" },
+1 -1
src/ewe/internal/http1.gleam
··· 1 - import ewe/internal/http1/buffer.{type Buffer, Buffer} 2 1 import ewe/internal/clock 3 2 import ewe/internal/decoder.{ 4 3 AbsPath, HttpBin, HttpEoh, HttpHeader, HttpRequest, HttphBin, More, Packet, 5 4 } 6 5 import ewe/internal/encoder 7 6 import ewe/internal/file 7 + import ewe/internal/http1/buffer.{type Buffer, Buffer} 8 8 import gleam/bit_array 9 9 import gleam/bool 10 10 import gleam/bytes_tree.{type BytesTree}
+1 -1
src/ewe/internal/http1/handler.gleam
··· 1 1 import compresso 2 - import ewe/internal/http1/buffer.{Buffer} 3 2 import ewe/internal/encoder 4 3 import ewe/internal/file 5 4 import ewe/internal/http1.{ 6 5 type Connection, type HttpVersion, type ResponseBody, BitsData, BytesData, 7 6 Chunked, Empty, File, SSE, StringTreeData, TextData, Websocket, 8 7 } as ewe_http 8 + import ewe/internal/http1/buffer.{Buffer} 9 9 import exception 10 10 import gleam/bit_array 11 11 import gleam/bytes_tree
+1 -4
test/clock.gleam
··· 2 2 import gleam/float 3 3 import gleam/int 4 4 import gleam/io 5 - import gleam/list 6 5 7 6 pub fn main() { 8 7 let iterations = 10_000_000 ··· 12 11 io.println("Getting HTTP date speed test") 13 12 14 13 let begin = now_microseconds() 15 - let _ = 16 - list.range(0, iterations) 17 - |> list.each(fn(_) { clock.get_http_date() }) 14 + int.range(0, iterations, "", fn(_, _) { clock.get_http_date() }) 18 15 let end = now_microseconds() 19 16 20 17 let total_duration = end - begin