Skip to content

Commit

Permalink
[BREAKING]: Change internal layers stack to be value-based instead of…
Browse files Browse the repository at this point in the history
… type-based (#789)

Overhaul internal client-side "layers" to a more functional approach to simplify the interface for custom layers, refactor expected arguments to layers, and clarify abilities to modify the client-side stack: a more advanced option via pushlayer!/poplayer! to affect the global stack, and a more recommended @client macro to generate your own client that includes custom layers.
  • Loading branch information
quinnj committed Mar 22, 2022
1 parent f27b8fe commit 4b3c633
Show file tree
Hide file tree
Showing 34 changed files with 635 additions and 1,393 deletions.
1 change: 0 additions & 1 deletion docs/src/internal_architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ HTTP.BasicAuthLayer
HTTP.CookieLayer
HTTP.CanonicalizeLayer
HTTP.MessageLayer
HTTP.AWS4AuthLayer
HTTP.RetryLayer
HTTP.ExceptionLayer
HTTP.ConnectionPoolLayer
Expand Down
197 changes: 0 additions & 197 deletions src/AWS4AuthRequest.jl

This file was deleted.

31 changes: 13 additions & 18 deletions src/BasicAuthRequest.jl
Original file line number Diff line number Diff line change
@@ -1,32 +1,27 @@
module BasicAuthRequest

using ..Base64

import ..Layer, ..request
using URIs
using ..Pairs: getkv, setkv
import ..Messages: setheader, hasheader
import ..@debug, ..DEBUG_LEVEL

export basicauthlayer
"""
request(BasicAuthLayer, method, ::URI, headers, body) -> HTTP.Response
basicauthlayer(req) -> HTTP.Response
Add `Authorization: Basic` header using credentials from url userinfo.
"""
abstract type BasicAuthLayer{Next <: Layer} <: Layer{Next} end
export BasicAuthLayer

function request(::Type{BasicAuthLayer{Next}},
method::String, url::URI, headers, body; kw...) where Next

userinfo = unescapeuri(url.userinfo)

if !isempty(userinfo) && getkv(headers, "Authorization", "") == ""
@debug 1 "Adding Authorization: Basic header."
setkv(headers, "Authorization", "Basic $(base64encode(userinfo))")
function basicauthlayer(handler)
return function(req; basicauth::Bool=true, kw...)
if basicauth
userinfo = unescapeuri(req.url.userinfo)
if !isempty(userinfo) && !hasheader(req.headers, "Authorization")
@debug 1 "Adding Authorization: Basic header."
setheader(req.headers, "Authorization" => "Basic $(base64encode(userinfo))")
end
end
return handler(req; kw...)
end

return request(Next, method, url, headers, body; kw...)
end


end # module BasicAuthRequest
29 changes: 14 additions & 15 deletions src/CanonicalizeRequest.jl
Original file line number Diff line number Diff line change
@@ -1,27 +1,26 @@
module CanonicalizeRequest

import ..Layer, ..request
using ..Messages
using ..Strings: tocameldash

export canonicalizelayer

"""
request(CanonicalizeLayer, method, ::URI, headers, body) -> HTTP.Response
canonicalizelayer(req) -> HTTP.Response
Rewrite request and response headers in Canonical-Camel-Dash-Format.
"""
abstract type CanonicalizeLayer{Next <: Layer} <: Layer{Next} end
export CanonicalizeLayer

function request(::Type{CanonicalizeLayer{Next}},
method::String, url, headers, body; kw...) where Next

headers = canonicalizeheaders(headers)

res = request(Next, method, url, headers, body; kw...)

res.headers = canonicalizeheaders(res.headers)

return res
function canonicalizelayer(handler)
return function(req; canonicalize_headers::Bool=false, kw...)
if canonicalize_headers
req.headers = canonicalizeheaders(req.headers)
end
res = handler(req; kw...)
if canonicalize_headers
res.headers = canonicalizeheaders(res.headers)
end
return res
end
end

canonicalizeheaders(h::T) where {T} = T([tocameldash(k) => v for (k,v) in h])
Expand Down
Loading

0 comments on commit 4b3c633

Please sign in to comment.