From 0baef8e6ea9995f3bc75a1f28417e95f9dfe2d15 Mon Sep 17 00:00:00 2001 From: Dominik Picheta Date: Sat, 24 Sep 2016 20:33:00 +0200 Subject: [PATCH] Implements getContent and postContent for (Async)HttpClient. --- lib/pure/httpclient.nim | 37 +++++++++++++++++++++++++++++++++++- tests/stdlib/thttpclient.nim | 19 ++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index 5eeb54f327..043bfc4237 100644 --- a/lib/pure/httpclient.nim +++ b/lib/pure/httpclient.nim @@ -950,10 +950,13 @@ proc request*(client: HttpClient | AsyncHttpClient, url: string, ## Connects to the hostname specified by the URL and performs a request ## using the method specified. ## - ## Connection will kept alive. Further requests on the same ``client`` to + ## Connection will be kept alive. Further requests on the same ``client`` to ## the same hostname will not require a new connection to be made. The ## connection can be closed by using the ``close`` procedure. ## + ## When a request is made to a different hostname, the current connection will + ## be closed. + ## ## The returned future will complete once the request is completed. result = await request(client, url, $httpMethod, body) @@ -973,6 +976,21 @@ proc get*(client: HttpClient | AsyncHttpClient, result = await client.request(redirectTo, HttpGET) lastURL = redirectTo +proc getContent*(client: HttpClient | AsyncHttpClient, + url: string): Future[string] {.multisync.} = + ## Connects to the hostname specified by the URL and performs a GET request. + ## + ## This procedure will follow redirects up to a maximum number of redirects + ## specified in ``client.maxRedirects``. + ## + ## A ``HttpRequestError`` will be raised if the server responds with a + ## client error (status code 4xx) or a server error (status code 5xx). + let resp = await get(client, url) + if resp.code.is4xx or resp.code.is5xx: + raise newException(HttpRequestError, resp.status) + else: + return resp.body + proc post*(client: HttpClient | AsyncHttpClient, url: string, body = "", multipart: MultipartData = nil): Future[Response] {.multisync.} = ## Connects to the hostname specified by the URL and performs a POST request. @@ -1000,3 +1018,20 @@ proc post*(client: HttpClient | AsyncHttpClient, url: string, body = "", var meth = if result.status != "307": HttpGet else: HttpPost result = await client.request(redirectTo, meth, xb) lastURL = redirectTo + +proc postContent*(client: HttpClient | AsyncHttpClient, url: string, + body = "", + multipart: MultipartData = nil): Future[string] + {.multisync.} = + ## Connects to the hostname specified by the URL and performs a POST request. + ## + ## This procedure will follow redirects up to a maximum number of redirects + ## specified in ``client.maxRedirects``. + ## + ## A ``HttpRequestError`` will be raised if the server responds with a + ## client error (status code 4xx) or a server error (status code 5xx). + let resp = await post(client, url, body, multipart) + if resp.code.is4xx or resp.code.is5xx: + raise newException(HttpRequestError, resp.status) + else: + return resp.body diff --git a/tests/stdlib/thttpclient.nim b/tests/stdlib/thttpclient.nim index 29590d9cfc..9cce7af82b 100644 --- a/tests/stdlib/thttpclient.nim +++ b/tests/stdlib/thttpclient.nim @@ -21,6 +21,16 @@ proc asyncTest() {.async.} = resp = await client.request("https://google.com/") doAssert(resp.code.is2xx or resp.code.is3xx) + # getContent + try: + discard await client.getContent("https://google.com/404") + doAssert(false, "HttpRequestError should have been raised") + except HttpRequestError: + discard + except: + doAssert(false, "HttpRequestError should have been raised") + + # Multipart test. var data = newMultipartData() data["output"] = "soap12" @@ -50,6 +60,15 @@ proc syncTest() = resp = client.request("https://google.com/") doAssert(resp.code.is2xx or resp.code.is3xx) + # getContent + try: + discard client.getContent("https://google.com/404") + doAssert(false, "HttpRequestError should have been raised") + except HttpRequestError: + discard + except: + doAssert(false, "HttpRequestError should have been raised") + # Multipart test. var data = newMultipartData() data["output"] = "soap12"