diff options
author | Dominik Picheta <dominikpicheta@gmail.com> | 2016-09-24 20:33:00 +0200 |
---|---|---|
committer | Dominik Picheta <dominikpicheta@gmail.com> | 2016-09-24 20:33:00 +0200 |
commit | 0baef8e6ea9995f3bc75a1f28417e95f9dfe2d15 (patch) | |
tree | 2dc9d8e67ef4b001f598379d3c8bdffb7812af25 | |
parent | fa9ec7a6b54ae1fc59674f530a0ee4a7532ca5e7 (diff) | |
download | Nim-0baef8e6ea9995f3bc75a1f28417e95f9dfe2d15.tar.gz |
Implements getContent and postContent for (Async)HttpClient.
-rw-r--r-- | lib/pure/httpclient.nim | 37 | ||||
-rw-r--r-- | tests/stdlib/thttpclient.nim | 19 |
2 files changed, 55 insertions, 1 deletions
diff --git a/lib/pure/httpclient.nim b/lib/pure/httpclient.nim index 5eeb54f32..043bfc423 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 29590d9cf..9cce7af82 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" |