Skip to content

Commit c55ae23

Browse files
committed
work
1 parent 1e4af40 commit c55ae23

14 files changed

+51
-22
lines changed

src/HTTP.jl

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,32 @@ include("StatusCodes.jl") ;using .StatusCodes
4242
include("Messages.jl") ;using .Messages
4343
include("cookies.jl") ;using .Cookies
4444
include("Streams.jl") ;using .Streams
45+
46+
function observe_layer(f, cntnm, durnm, req, args...; kw...)
47+
start_time = time()
48+
req.context[cntnm] = Base.get(req.context, cntnm, 0) + 1
49+
try
50+
return f(args...; kw...)
51+
finally
52+
req.context[durnm] = Base.get(req.context, durnm, 0) + (time() - start_time) * 1000
53+
# @info "observed layer = $f, count = $(req.context[cntnm]), duration = $(req.context[durnm])"
54+
end
55+
end
56+
57+
function observe_request_layer(f)
58+
nm = nameof(f)
59+
cntnm = Symbol(nm, "_count")
60+
durnm = Symbol(nm, "_duration_ms")
61+
return (req::Request; kw...) -> observe_layer(f, cntnm, durnm, req, req; kw...)
62+
end
63+
64+
function observe_stream_layer(f)
65+
nm = nameof(f)
66+
cntnm = Symbol(nm, "_count")
67+
durnm = Symbol(nm, "_duration_ms")
68+
return (stream::Stream; kw...) -> observe_layer(f, cntnm, durnm, stream.message.request, stream; kw...)
69+
end
70+
4571
include("clientlayers/MessageRequest.jl"); using .MessageRequest
4672
include("clientlayers/RedirectRequest.jl"); using .RedirectRequest
4773
include("clientlayers/DefaultHeadersRequest.jl"); using .DefaultHeadersRequest
@@ -399,10 +425,10 @@ function stack(
399425
inner_stream_layers = streamlayers
400426
outer_stream_layers = ()
401427
end
402-
layers = foldr((x, y) -> x(y), inner_stream_layers, init=streamlayer)
403-
layers2 = foldr((x, y) -> x(y), STREAM_LAYERS, init=layers)
428+
layers = foldr((x, y) -> observe_stream_layer(x(y)), inner_stream_layers, init=observe_stream_layer(streamlayer))
429+
layers2 = foldr((x, y) -> observe_stream_layer(x(y)), STREAM_LAYERS, init=layers)
404430
if !isempty(outer_stream_layers)
405-
layers2 = foldr((x, y) -> x(y), outer_stream_layers, init=layers2)
431+
layers2 = foldr((x, y) -> observe_stream_layer(x(y)), outer_stream_layers, init=layers2)
406432
end
407433
# request layers
408434
# messagelayer must be the 1st/outermost layer to convert initial args to Request
@@ -414,7 +440,7 @@ function stack(
414440
inner_request_layers = requestlayers
415441
outer_request_layers = ()
416442
end
417-
layers3 = foldr((x, y) -> x(y), inner_request_layers; init=connectionlayer(layers2))
443+
layers3 = foldr((x, y) -> x(y), inner_request_layers; init=observe_request_layer(connectionlayer(layers2)))
418444
layers4 = foldr((x, y) -> x(y), REQUEST_LAYERS; init=layers3)
419445
if !isempty(outer_request_layers)
420446
layers4 = foldr((x, y) -> x(y), outer_request_layers, init=layers4)

src/clientlayers/BasicAuthRequest.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export basicauthlayer
1111
Add `Authorization: Basic` header using credentials from url userinfo.
1212
"""
1313
function basicauthlayer(handler)
14-
return function(req; basicauth::Bool=true, kw...)
14+
return function basicauths(req; basicauth::Bool=true, kw...)
1515
if basicauth
1616
userinfo = unescapeuri(req.url.userinfo)
1717
if !isempty(userinfo) && !hasheader(req.headers, "Authorization")

src/clientlayers/CanonicalizeRequest.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export canonicalizelayer
1010
Rewrite request and response headers in Canonical-Camel-Dash-Format.
1111
"""
1212
function canonicalizelayer(handler)
13-
return function(req; canonicalize_headers::Bool=false, kw...)
13+
return function canonicalizes(req; canonicalize_headers::Bool=false, kw...)
1414
if canonicalize_headers
1515
req.headers = canonicalizeheaders(req.headers)
1616
end

src/clientlayers/ConnectionRequest.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Close the connection if the request throws an exception.
5555
Otherwise leave it open so that it can be reused.
5656
"""
5757
function connectionlayer(handler)
58-
return function(req; proxy=getproxy(req.url.scheme, req.url.host), socket_type::Type=TCPSocket, socket_type_tls::Type=SOCKET_TYPE_TLS[], readtimeout::Int=0, logerrors::Bool=false, kw...)
58+
return function connections(req; proxy=getproxy(req.url.scheme, req.url.host), socket_type::Type=TCPSocket, socket_type_tls::Type=SOCKET_TYPE_TLS[], readtimeout::Int=0, logerrors::Bool=false, kw...)
5959
local io, stream
6060
if proxy !== nothing
6161
target_url = req.url
@@ -126,7 +126,7 @@ function connectionlayer(handler)
126126
end
127127
# if logerrors
128128
if !(e isa StatusError || e isa TimeoutError)
129-
@error sprint(showerror, e, catch_backtrace())
129+
@error "HTTP.ConnectionRequest" exception=(e, catch_backtrace()) request=req
130130
end
131131
@debugv 1 "❗️ ConnectionLayer $e. Closing: $io"
132132
shouldreuse = false

src/clientlayers/ContentTypeRequest.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export contenttypedetectionlayer
1111
Try and detect the content type of the request body and add the "Content-Type" header.
1212
"""
1313
function contenttypedetectionlayer(handler)
14-
return function(req; detect_content_type::Bool=false, kw...)
14+
return function contenttypedetections(req; detect_content_type::Bool=false, kw...)
1515
if detect_content_type && (!hasheader(req.headers, "Content-Type")
1616
&& !isa(req.body, Form)
1717
&& isbytes(req.body))

src/clientlayers/CookieRequest.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ from the `cookiejar` keyword argument (by default, a global cookiejar is used).
1616
Store "Set-Cookie" cookies from the response headers.
1717
"""
1818
function cookielayer(handler)
19-
return function(req::Request; cookies=true, cookiejar::CookieJar=COOKIEJAR, kw...)
19+
return function managecookies(req::Request; cookies=true, cookiejar::CookieJar=COOKIEJAR, kw...)
2020
if cookies === true || (cookies isa AbstractDict && !isempty(cookies))
2121
url = req.url
2222
cookiestosend = Cookies.getcookies!(cookiejar, url)

src/clientlayers/DebugRequest.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ debug logging with verbosity `verbose` for the lifetime of the request.
1313
If no `verbose` is specified, it defaults to the *HTTP.jl* global `DEBUG_LEVEL[]`.
1414
"""
1515
function debuglayer(handler)
16-
return function(request; verbose=DEBUG_LEVEL[], kw...)
16+
return function debugs(request; verbose=DEBUG_LEVEL[], kw...)
1717
# if debugging, enable by wrapping request in custom logger logic
1818
if verbose > 0
1919
LoggingExtras.withlevel(Logging.Debug; verbosity=verbose) do

src/clientlayers/DefaultHeadersRequest.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ using ..Messages, ..Forms, ..IOExtras
1010
Sets default expected headers.
1111
"""
1212
function defaultheaderslayer(handler)
13-
return function(req; iofunction=nothing, decompress=nothing, kw...)
13+
return function defaultheaders(req; iofunction=nothing, decompress=nothing, kw...)
1414
headers = req.headers
1515
if isempty(req.url.port) ||
1616
(req.url.scheme == "http" && req.url.port == "80") ||

src/clientlayers/ExceptionRequest.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ using ..IOExtras, ..Messages, ..Exceptions
1010
Throw a `StatusError` if the request returns an error response status.
1111
"""
1212
function exceptionlayer(handler)
13-
return function(stream; status_exception::Bool=true, kw...)
13+
return function exceptions(stream; status_exception::Bool=true, kw...)
1414
res = handler(stream; kw...)
1515
if status_exception && iserror(res)
1616
res.request.context[:status_errors] = get(res.request.context, :status_errors, 0) + 1
1717
e = StatusError(res.status, res.request.method, res.request.target, res)
18-
@error sprint(showerror, e, catch_backtrace())
18+
@error "HTTP.StatusError" exception=(e, catch_backtrace()) request=res.request
1919
throw(e)
2020
else
2121
return res

src/clientlayers/MessageRequest.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ function messagelayer(handler)
3333
end
3434
rethrow(e)
3535
finally
36+
dur = (time() - start_time) * 1000
37+
req.context[:total_request_duration_ms] = dur
3638
if @isdefined(resp) && iserror(resp) && haskey(resp.request.context, :response_body)
3739
if isbytes(resp.body)
3840
resp.body = resp.request.context[:response_body]
@@ -42,8 +44,8 @@ function messagelayer(handler)
4244
end
4345
if @isdefined(resp)
4446
end_time = time()
45-
rbytes = get(resp.request.context, :nbytes, 0)
46-
wbytes = get(resp.request.context, :nbytes_written, 0)
47+
rbytes = Base.get(resp.request.context, :nbytes, 0)
48+
wbytes = Base.get(resp.request.context, :nbytes_written, 0)
4749
rgbits_per_second = rbytes == 0 ? 0 : (((8 * rbytes) / 1e9) / (end_time - start_time))
4850
wgbits_per_second = wbytes == 0 ? 0 : (((8 * wbytes) / 1e9) / (end_time - start_time))
4951
@debugv 1 "Request complete with bandwidth: $(wgbits_per_second) Gbps write, $(rgbits_per_second) Gbps read"

src/clientlayers/RedirectRequest.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export redirectlayer, nredirects
1111
Redirects the request in the case of 3xx response status.
1212
"""
1313
function redirectlayer(handler)
14-
return function(req; redirect::Bool=true, redirect_limit::Int=3, redirect_method=nothing, forwardheaders::Bool=true, response_stream=nothing, kw...)
14+
return function redirects(req; redirect::Bool=true, redirect_limit::Int=3, redirect_method=nothing, forwardheaders::Bool=true, response_stream=nothing, kw...)
1515
if !redirect || redirect_limit == 0
1616
# no redirecting
1717
return handler(req; kw...)

src/clientlayers/RetryRequest.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module RetryRequest
22

33
using Sockets, LoggingExtras, MbedTLS, OpenSSL
44
using ..IOExtras, ..Messages, ..Strings, ..ExceptionRequest, ..Exceptions
5+
import ..observe_request_layer
56

67
export retrylayer
78

@@ -27,7 +28,7 @@ retry check _wouldn't_ retry, if `retry_check` returns true, then the request
2728
will be retried anyway.
2829
"""
2930
function retrylayer(handler)
30-
return function(req::Request; retry::Bool=true, retries::Int=4,
31+
return observe_request_layer(function manageretries(req::Request; retry::Bool=true, retries::Int=4,
3132
retry_delays=ExponentialBackOff(n = retries, factor=3.0), retry_check=FALSE,
3233
retry_non_idempotent::Bool=false, logerrors::Bool=false, kw...)
3334
if !retry || retries == 0
@@ -73,7 +74,7 @@ function retrylayer(handler)
7374
end
7475
)
7576
return retry_request(req; kw...)
76-
end
77+
end)
7778
end
7879

7980
const EAI_AGAIN = 2

src/clientlayers/TimeoutRequest.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export timeoutlayer
1111
Close the `HTTP.Stream` if no data has been received for `readtimeout` seconds.
1212
"""
1313
function timeoutlayer(handler)
14-
return function(stream::Stream; readtimeout::Int=0, kw...)
14+
return function timeouts(stream::Stream; readtimeout::Int=0, kw...)
1515
if readtimeout <= 0
1616
# skip
1717
return handler(stream; kw...)
@@ -22,7 +22,7 @@ function timeoutlayer(handler)
2222
end
2323
catch e
2424
if e isa TimeoutError
25-
@error sprint(showerror, e, catch_backtrace())
25+
@error "HTTP.TimeoutError" exception=(e, catch_backtrace()) request=stream.message.request
2626
req = stream.message.request
2727
req.context[:timeout_errors] = get(req.context, :timeout_errors, 0) + 1
2828
end

test/client.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ end
586586
seekstart(req_body)
587587
resp = HTTP.get("http://localhost:8080/retry"; body=req_body, response_stream=res_body, retry=false, status_exception=false)
588588
@test String(take!(res_body)) == "500 unexpected error"
589-
# even if status_exception=true, we should still get the right response body
589+
# even if StatusError, we should still get the right response body
590590
shouldfail[] = true
591591
seekstart(req_body)
592592
try

0 commit comments

Comments
 (0)