JuliaWeb/HTTP.jl

HTTP.get fails on julia 1.11.0-alpha1

Closed this issue · 3 comments

Versions:

  • Julia 1.11.10-alpha1
  • HTTP.jl 1.10.2
  • MbedTLS.jl 1.1.9

As reported in PerezHz/HORIZONS.jl#37, we have some code which runs fine on julia1.10, but fails on julia1.11.0-alpha1. We managed to reproduce the issue with the following MWE:

julia> using HTTP

julia> HTTP.get("https://ssd.jpl.nasa.gov/api/horizons.api", query=Dict("COMMAND"=>"1"))

The produced error is:

ERROR: HTTP.RequestError:
HTTP.Request:
HTTP.Messages.Request:
"""
GET /api/horizons.api?COMMAND=1 HTTP/1.1
Host: ssd.jpl.nasa.gov
Accept: */*
User-Agent: HTTP.jl/1.11.0-alpha1
Content-Length: 0
Accept-Encoding: gzip

"""Underlying error:
MethodError: Cannot `convert` an object of type 
  SubArray{UInt8,1,Memory{UInt8},Tuple{UnitRange{Int64}},true} to an object of type 
  SubArray{UInt8,1,Vector{UInt8},Tuple{UnitRange{Int64}},true}
The function `convert` exists, but no method is defined for this combination of argument types.

Closest candidates are:
  SubArray{T, N, P, I, L}(::Any, ::Any, ::Any, ::Any) where {T, N, P, I, L}
   @ Base subarray.jl:19
  convert(::Type{T}, ::LinearAlgebra.Factorization) where T<:AbstractArray
   @ LinearAlgebra /Applications/Julia-1.11.app/Contents/Resources/julia/share/julia/stdlib/v1.11/LinearAlgebra/src/factorization.jl:104
  convert(::Type{T}, ::T) where T
   @ Base Base.jl:126
  ...

Stacktrace:
  [1] (::HTTP.ConnectionRequest.var"#connections#4"{})(req::HTTP.Messages.Request; proxy::Nothing, socket_type::Type, socket_type_tls::Type, readtimeout::Int64, connect_timeout::Int64, logerrors::Bool, logtag::Nothing, kw::@Kwargs{})
    @ HTTP.ConnectionRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/ConnectionRequest.jl:140
  [2] (::Base.var"#103#105"{Base.var"#103#104#106"{}})(args::HTTP.Messages.Request; kwargs::@Kwargs{iofunction::Nothing, decompress::Nothing, verbose::Int64})
    @ Base ./error.jl:298
  [3] (::HTTP.RetryRequest.var"#manageretries#3"{})(req::HTTP.Messages.Request; retry::Bool, retries::Int64, retry_delays::ExponentialBackOff, retry_check::Function, retry_non_idempotent::Bool, kw::@Kwargs{})
    @ HTTP.RetryRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/RetryRequest.jl:75
  [4] manageretries
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/RetryRequest.jl:30 [inlined]
  [5] (::HTTP.CookieRequest.var"#managecookies#4"{})(req::HTTP.Messages.Request; cookies::Bool, cookiejar::HTTP.Cookies.CookieJar, kw::@Kwargs{})
    @ HTTP.CookieRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/CookieRequest.jl:42
  [6] managecookies
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/CookieRequest.jl:19 [inlined]
  [7] (::HTTP.HeadersRequest.var"#defaultheaders#2"{})(req::HTTP.Messages.Request; iofunction::Nothing, decompress::Nothing, basicauth::Bool, detect_content_type::Bool, canonicalize_headers::Bool, kw::@Kwargs{})
    @ HTTP.HeadersRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/HeadersRequest.jl:71
  [8] defaultheaders
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/HeadersRequest.jl:14 [inlined]
  [9] (::HTTP.RedirectRequest.var"#redirects#3"{})(req::HTTP.Messages.Request; redirect::Bool, redirect_limit::Int64, redirect_method::Nothing, forwardheaders::Bool, response_stream::Nothing, kw::@Kwargs{})
    @ HTTP.RedirectRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/RedirectRequest.jl:25
 [10] redirects
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/RedirectRequest.jl:14 [inlined]
 [11] (::HTTP.MessageRequest.var"#makerequest#3"{})(method::String, url::URIs.URI, headers::Nothing, body::Vector{…}; copyheaders::Bool, response_stream::Nothing, http_version::HTTP.Strings.HTTPVersion, verbose::Int64, kw::@Kwargs{})
    @ HTTP.MessageRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/MessageRequest.jl:35
 [12] makerequest
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/MessageRequest.jl:24 [inlined]
 [13] request(stack::HTTP.MessageRequest.var"#makerequest#3"{}, method::String, url::String, h::Nothing, b::Vector{…}, q::Dict{…}; headers::Nothing, body::Vector{…}, query::Dict{…}, kw::@Kwargs{})
    @ HTTP ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:457
 [14] request(stack::Function, method::String, url::String, h::Nothing, b::Vector{UInt8}, q::Dict{String, String})
    @ HTTP ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:455
 [15] #request#20
    @ ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:315 [inlined]
 [16] request (repeats 2 times)
    @ ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:313 [inlined]
 [17] #get#38
    @ ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:518 [inlined]
 [18] top-level scope
    @ REPL[3]:1

caused by: TaskFailedException

    nested task error: MethodError: Cannot `convert` an object of type 
      SubArray{UInt8,1,Memory{UInt8},Tuple{UnitRange{Int64}},true} to an object of type 
      SubArray{UInt8,1,Vector{UInt8},Tuple{UnitRange{Int64}},true}
    The function `convert` exists, but no method is defined for this combination of argument types.
    
    Closest candidates are:
      SubArray{T, N, P, I, L}(::Any, ::Any, ::Any, ::Any) where {T, N, P, I, L}
       @ Base subarray.jl:19
      convert(::Type{T}, ::LinearAlgebra.Factorization) where T<:AbstractArray
       @ LinearAlgebra /Applications/Julia-1.11.app/Contents/Resources/julia/share/julia/stdlib/v1.11/LinearAlgebra/src/factorization.jl:104
      convert(::Type{T}, ::T) where T
       @ Base Base.jl:126
      ...
    
    Stacktrace:
     [1] readuntil
       @ ~/.julia/packages/HTTP/1EWL3/src/IOExtras.jl:125 [inlined]
     [2] readuntil(c::HTTP.Connections.Connection{…}, f::typeof(HTTP.Parsers.find_end_of_header), sizehint::Int64)
       @ HTTP.Connections ~/.julia/packages/HTTP/1EWL3/src/Connections.jl:242
     [3] readuntil(c::HTTP.Connections.Connection{OpenSSL.SSLStream}, f::typeof(HTTP.Parsers.find_end_of_header))
       @ HTTP.Connections ~/.julia/packages/HTTP/1EWL3/src/Connections.jl:238
     [4] readheaders(io::HTTP.Connections.Connection{OpenSSL.SSLStream}, message::HTTP.Messages.Response)
       @ HTTP.Messages ~/.julia/packages/HTTP/1EWL3/src/Messages.jl:533
     [5] startread(http::HTTP.Streams.Stream{HTTP.Messages.Response, HTTP.Connections.Connection{OpenSSL.SSLStream}})
       @ HTTP.Streams ~/.julia/packages/HTTP/1EWL3/src/Streams.jl:153
     [6] eof
       @ ~/.julia/packages/HTTP/1EWL3/src/Streams.jl:186 [inlined]
     [7] macro expansion
       @ ~/.julia/packages/HTTP/1EWL3/src/Exceptions.jl:19 [inlined]
     [8] closeread(http::HTTP.Streams.Stream{HTTP.Messages.Response, HTTP.Connections.Connection{OpenSSL.SSLStream}})
       @ HTTP.Streams ~/.julia/packages/HTTP/1EWL3/src/Streams.jl:375
     [9] (::HTTP.StreamRequest.var"#3#5"{})()
       @ HTTP.StreamRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/StreamRequest.jl:60
    
    caused by: MethodError: Cannot `convert` an object of type 
      SubArray{UInt8,1,Memory{UInt8},Tuple{UnitRange{Int64}},true} to an object of type 
      SubArray{UInt8,1,Vector{UInt8},Tuple{UnitRange{Int64}},true}
    The function `convert` exists, but no method is defined for this combination of argument types.
    
    Closest candidates are:
      SubArray{T, N, P, I, L}(::Any, ::Any, ::Any, ::Any) where {T, N, P, I, L}
       @ Base subarray.jl:19
      convert(::Type{T}, ::LinearAlgebra.Factorization) where T<:AbstractArray
       @ LinearAlgebra /Applications/Julia-1.11.app/Contents/Resources/julia/share/julia/stdlib/v1.11/LinearAlgebra/src/factorization.jl:104
      convert(::Type{T}, ::T) where T
       @ Base Base.jl:126
      ...
    
    Stacktrace:
     [1] readuntil
       @ ~/.julia/packages/HTTP/1EWL3/src/IOExtras.jl:125 [inlined]
     [2] readuntil(c::HTTP.Connections.Connection{…}, f::typeof(HTTP.Parsers.find_end_of_header), sizehint::Int64)
       @ HTTP.Connections ~/.julia/packages/HTTP/1EWL3/src/Connections.jl:242
     [3] readuntil(c::HTTP.Connections.Connection{OpenSSL.SSLStream}, f::typeof(HTTP.Parsers.find_end_of_header))
       @ HTTP.Connections ~/.julia/packages/HTTP/1EWL3/src/Connections.jl:238
     [4] readheaders(io::HTTP.Connections.Connection{OpenSSL.SSLStream}, message::HTTP.Messages.Response)
       @ HTTP.Messages ~/.julia/packages/HTTP/1EWL3/src/Messages.jl:533
     [5] startread(http::HTTP.Streams.Stream{HTTP.Messages.Response, HTTP.Connections.Connection{OpenSSL.SSLStream}})
       @ HTTP.Streams ~/.julia/packages/HTTP/1EWL3/src/Streams.jl:153
     [6] (::HTTP.StreamRequest.var"#3#5"{})()
       @ HTTP.StreamRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/StreamRequest.jl:51
Stacktrace:
  [1] sync_end(c::Channel{Any})
    @ Base ./task.jl:459
  [2] macro expansion
    @ ./task.jl:492 [inlined]
  [3] streamlayer(stream::HTTP.Streams.Stream{…}; iofunction::Nothing, decompress::Nothing, logerrors::Bool, logtag::Nothing, timedout::Nothing, kw::@Kwargs{})
    @ HTTP.StreamRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/StreamRequest.jl:34
  [4] streamlayer
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/StreamRequest.jl:20 [inlined]
  [5] (::HTTP.ExceptionRequest.var"#exceptions#2"{})(stream::HTTP.Streams.Stream{…}; status_exception::Bool, timedout::Nothing, logerrors::Bool, logtag::Nothing, kw::@Kwargs{})
    @ HTTP.ExceptionRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/ExceptionRequest.jl:14
  [6] exceptions
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/ExceptionRequest.jl:13 [inlined]
  [7] (::HTTP.TimeoutRequest.var"#timeouts#3"{})(stream::HTTP.Streams.Stream{…}; readtimeout::Int64, logerrors::Bool, logtag::Nothing, kw::@Kwargs{})
    @ HTTP.TimeoutRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/TimeoutRequest.jl:18
  [8] (::HTTP.ConnectionRequest.var"#connections#4"{})(req::HTTP.Messages.Request; proxy::Nothing, socket_type::Type, socket_type_tls::Type, readtimeout::Int64, connect_timeout::Int64, logerrors::Bool, logtag::Nothing, kw::@Kwargs{})
    @ HTTP.ConnectionRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/ConnectionRequest.jl:119
  [9] (::Base.var"#103#105"{Base.var"#103#104#106"{}})(args::HTTP.Messages.Request; kwargs::@Kwargs{iofunction::Nothing, decompress::Nothing, verbose::Int64})
    @ Base ./error.jl:298
 [10] (::HTTP.RetryRequest.var"#manageretries#3"{})(req::HTTP.Messages.Request; retry::Bool, retries::Int64, retry_delays::ExponentialBackOff, retry_check::Function, retry_non_idempotent::Bool, kw::@Kwargs{})
    @ HTTP.RetryRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/RetryRequest.jl:75
 [11] manageretries
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/RetryRequest.jl:30 [inlined]
 [12] (::HTTP.CookieRequest.var"#managecookies#4"{})(req::HTTP.Messages.Request; cookies::Bool, cookiejar::HTTP.Cookies.CookieJar, kw::@Kwargs{})
    @ HTTP.CookieRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/CookieRequest.jl:42
 [13] managecookies
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/CookieRequest.jl:19 [inlined]
 [14] (::HTTP.HeadersRequest.var"#defaultheaders#2"{})(req::HTTP.Messages.Request; iofunction::Nothing, decompress::Nothing, basicauth::Bool, detect_content_type::Bool, canonicalize_headers::Bool, kw::@Kwargs{})
    @ HTTP.HeadersRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/HeadersRequest.jl:71
 [15] defaultheaders
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/HeadersRequest.jl:14 [inlined]
 [16] (::HTTP.RedirectRequest.var"#redirects#3"{})(req::HTTP.Messages.Request; redirect::Bool, redirect_limit::Int64, redirect_method::Nothing, forwardheaders::Bool, response_stream::Nothing, kw::@Kwargs{})
    @ HTTP.RedirectRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/RedirectRequest.jl:25
 [17] redirects
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/RedirectRequest.jl:14 [inlined]
 [18] (::HTTP.MessageRequest.var"#makerequest#3"{})(method::String, url::URIs.URI, headers::Nothing, body::Vector{…}; copyheaders::Bool, response_stream::Nothing, http_version::HTTP.Strings.HTTPVersion, verbose::Int64, kw::@Kwargs{})
    @ HTTP.MessageRequest ~/.julia/packages/HTTP/1EWL3/src/clientlayers/MessageRequest.jl:35
 [19] makerequest
    @ ~/.julia/packages/HTTP/1EWL3/src/clientlayers/MessageRequest.jl:24 [inlined]
 [20] request(stack::HTTP.MessageRequest.var"#makerequest#3"{}, method::String, url::String, h::Nothing, b::Vector{…}, q::Dict{…}; headers::Nothing, body::Vector{…}, query::Dict{…}, kw::@Kwargs{})
    @ HTTP ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:457
 [21] request(stack::Function, method::String, url::String, h::Nothing, b::Vector{UInt8}, q::Dict{String, String})
    @ HTTP ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:455
 [22] #request#20
    @ ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:315 [inlined]
 [23] request (repeats 2 times)
    @ ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:313 [inlined]
 [24] #get#38
    @ ~/.julia/packages/HTTP/1EWL3/src/HTTP.jl:518 [inlined]
 [25] top-level scope
    @ REPL[3]:1
Some type information was truncated. Use `show(err)` to see complete types.

Ah, wasn't aware of that, many thanks for pointing us to it @mortenpi!

HTTP.jl v1.10.3 solves this issue, many thanks!