JuliaWeb / HTTP.jl

HTTP for Julia
https://juliaweb.github.io/HTTP.jl/stable/
Other
626 stars 177 forks source link

Can't send 3GB response body #1171

Closed simsurace closed 2 months ago

simsurace commented 2 months ago

Aaron Denney over on Slack commented that this may be an issue with some low-level bindings, so if this is not appropriate here, I will post the issue elsewhere (Julia?).

The following minimal example

using HTTP

function get_data(::HTTP.Request)
    data = rand(UInt8, 3_000_000_000)
    return HTTP.Response(200, data)
end

const ROUTER = HTTP.Router()
HTTP.register!(ROUTER, "GET", "/", get_data)
server = HTTP.serve!(ROUTER, "127.0.0.1", 8008)

produces the following error when a request is made:

julia> ┌ Error: handle_connection handler error. 
│ 
│ ===========================
│ HTTP Error message:
│ 
│ ERROR: IOError: write: invalid argument (EINVAL)
│ Stacktrace:
│   [1] uv_write(s::Sockets.TCPSocket, p::Ptr{UInt8}, n::UInt64)
│     @ Base ./stream.jl:1066
│   [2] unsafe_write(s::Sockets.TCPSocket, p::Ptr{UInt8}, n::UInt64)
│     @ Base ./stream.jl:1120
│   [3] unsafe_write
│     @ ~/.julia/packages/HTTP/vnQzp/src/Connections.jl:129 [inlined]
│   [4] unsafe_write(http::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.Connections.Connection{Sockets.TCPSocket}}, p::Ptr{UInt8}, n::UInt64)
│     @ HTTP.Streams ~/.julia/packages/HTTP/vnQzp/src/Streams.jl:95
│   [5] unsafe_write
│     @ ./io.jl:698 [inlined]
│   [6] write(s::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.Connections.Connection{Sockets.TCPSocket}}, a::Vector{UInt8})
│     @ Base ./io.jl:721
│   [7] (::HTTP.Handlers.var"#1#2"{HTTP.Handlers.Router{typeof(HTTP.Handlers.default404), typeof(HTTP.Handlers.default405), Nothing}})(stream::HTTP.Streams.Stream{HTTP.Messages.Request, HTTP.Connections.Connection{Sockets.TCPSocket}})
│     @ HTTP.Handlers ~/.julia/packages/HTTP/vnQzp/src/Handlers.jl:61
│   [8] #invokelatest#2
│     @ ./essentials.jl:892 [inlined]
│   [9] invokelatest
│     @ ./essentials.jl:889 [inlined]
│  [10] handle_connection(f::Function, c::HTTP.Connections.Connection{Sockets.TCPSocket}, listener::HTTP.Servers.Listener{Nothing, Sockets.TCPServer}, readtimeout::Int64, access_log::Nothing)
│     @ HTTP.Servers ~/.julia/packages/HTTP/vnQzp/src/Servers.jl:469
│  [11] (::HTTP.Servers.var"#16#17"{HTTP.Handlers.var"#1#2"{HTTP.Handlers.Router{typeof(HTTP.Handlers.default404), typeof(HTTP.Handlers.default405), Nothing}}, HTTP.Servers.Listener{Nothing, Sockets.TCPServer}, Set{HTTP.Connections.Connection}, Int64, Nothing, ReentrantLock, Base.Semaphore, HTTP.Connections.Connection{Sockets.TCPSocket}})()
│     @ HTTP.Servers ~/.julia/packages/HTTP/vnQzp/src/Servers.jl:401
└ @ HTTP.Servers ~/.julia/packages/HTTP/vnQzp/src/Servers.jl:483

Tested on