diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index 6acf8d9cd1988..ece2b52838756 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -210,12 +210,19 @@ import nativesockets export httpcore except parseHeader # TODO: The ``except`` doesn't work type + PreparedRequest* = object + reqMethod*: HttpMethod + headers*: HttpHeaders + url*: Uri + body*: string + Response* = ref object version*: string status*: string headers*: HttpHeaders body: string bodyStream*: Stream + request*: PreparedRequest AsyncResponse* = ref object version*: string @@ -223,6 +230,7 @@ type headers*: HttpHeaders body: string bodyStream*: FutureStream[string] + request*: PreparedRequest proc code*(response: Response | AsyncResponse): HttpCode {.raises: [ValueError, OverflowDefect].} = @@ -896,10 +904,16 @@ proc newConnection(client: HttpClient | AsyncHttpClient, connectUrl.hostname = url.hostname connectUrl.port = if url.port != "": url.port else: "443" + let newHeaders = newHttpHeaders() let proxyHeaderString = generateHeaders(connectUrl, HttpConnect, - newHttpHeaders(), client.proxy) + newHeaders, client.proxy) await client.socket.send(proxyHeaderString) let proxyResp = await parseResponse(client, false) + proxyResp.request = PreparedRequest( + reqMethod: HttpConnect, + headers: newHeaders, + url: connectUrl, + ) if not proxyResp.status.startsWith("200"): raise newException(HttpRequestError, @@ -1019,6 +1033,12 @@ proc requestAux(client: HttpClient | AsyncHttpClient, url: Uri, let getBody = httpMethod notin {HttpHead, HttpConnect} and client.getBody result = await parseResponse(client, getBody) + result.request = PreparedRequest( + reqMethod: httpMethod, + headers: newHeaders, + url: url, + body: body, + ) proc request*(client: HttpClient | AsyncHttpClient, url: Uri | string, httpMethod: HttpMethod | string = HttpGet, body = "", diff --git a/tests/stdlib/thttpclient.nim b/tests/stdlib/thttpclient.nim index 4881370eecc0b..620fc5ad36c65 100644 --- a/tests/stdlib/thttpclient.nim +++ b/tests/stdlib/thttpclient.nim @@ -8,7 +8,7 @@ discard """ import strutils from net import TimeoutError -import nativesockets, os, httpclient, asyncdispatch +import nativesockets, os, httpclient, asyncdispatch, uri const manualTests = false @@ -37,6 +37,12 @@ proc makeIPv6HttpServer(hostname: string, port: Port, serverFd.accept().callback = onAccept serverFd.accept().callback = onAccept +proc testPreparedRequest(req: PreparedRequest) = + doAssert req.reqMethod == HttpGet + doAssert $req.url == "http://example.com/" + let clientAgent = $req.headers["user-agent"] + doAssert clientAgent.contains("Nim httpclient") + proc asyncTest() {.async.} = var client = newAsyncHttpClient() var resp = await client.request("http://example.com/", HttpGet) @@ -44,6 +50,7 @@ proc asyncTest() {.async.} = var body = await resp.body body = await resp.body # Test caching doAssert("Example Domain" in body) + testPreparedRequest(resp.request) resp = await client.request("http://example.com/404") doAssert(resp.code.is4xx) @@ -105,6 +112,7 @@ proc syncTest() = var resp = client.request("http://example.com/", HttpGet) doAssert(resp.code.is2xx) doAssert("Example Domain" in resp.body) + testPreparedRequest(resp.request) resp = client.request("http://example.com/404") doAssert(resp.code.is4xx)