thttpclient.nim 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. discard """
  2. cmd: "nim c --threads:on -d:ssl $file"
  3. exitcode: 0
  4. output: "OK"
  5. disabled: "travis"
  6. disabled: "appveyor"
  7. """
  8. import strutils
  9. from net import TimeoutError
  10. import nativesockets, os, httpclient, asyncdispatch
  11. const manualTests = false
  12. proc asyncTest() {.async.} =
  13. var client = newAsyncHttpClient()
  14. var resp = await client.request("http://example.com/")
  15. doAssert(resp.code.is2xx)
  16. var body = await resp.body
  17. body = await resp.body # Test caching
  18. doAssert("<title>Example Domain</title>" in body)
  19. resp = await client.request("http://example.com/404")
  20. doAssert(resp.code.is4xx)
  21. doAssert(resp.code == Http404)
  22. doAssert(resp.status == Http404)
  23. resp = await client.request("https://google.com/")
  24. doAssert(resp.code.is2xx or resp.code.is3xx)
  25. # getContent
  26. try:
  27. discard await client.getContent("https://google.com/404")
  28. doAssert(false, "HttpRequestError should have been raised")
  29. except HttpRequestError:
  30. discard
  31. except:
  32. doAssert(false, "HttpRequestError should have been raised")
  33. when false:
  34. # w3.org now blocks travis, so disabled:
  35. # Multipart test.
  36. var data = newMultipartData()
  37. data["output"] = "soap12"
  38. data["uploaded_file"] = ("test.html", "text/html",
  39. "<html><head></head><body><p>test</p></body></html>")
  40. resp = await client.post("http://validator.w3.org/check", multipart=data)
  41. doAssert(resp.code.is2xx)
  42. # onProgressChanged
  43. when manualTests:
  44. proc onProgressChanged(total, progress, speed: BiggestInt) {.async.} =
  45. echo("Downloaded ", progress, " of ", total)
  46. echo("Current rate: ", speed div 1000, "kb/s")
  47. client.onProgressChanged = onProgressChanged
  48. await client.downloadFile("http://speedtest-ams2.digitalocean.com/100mb.test",
  49. "100mb.test")
  50. client.close()
  51. # Proxy test
  52. #when manualTests:
  53. # client = newAsyncHttpClient(proxy = newProxy("http://51.254.106.76:80/"))
  54. # var resp = await client.request("https://github.com")
  55. # echo resp
  56. proc syncTest() =
  57. var client = newHttpClient()
  58. var resp = client.request("http://example.com/")
  59. doAssert(resp.code.is2xx)
  60. doAssert("<title>Example Domain</title>" in resp.body)
  61. resp = client.request("http://example.com/404")
  62. doAssert(resp.code.is4xx)
  63. doAssert(resp.code == Http404)
  64. doAssert(resp.status == Http404)
  65. resp = client.request("https://google.com/")
  66. doAssert(resp.code.is2xx or resp.code.is3xx)
  67. # getContent
  68. try:
  69. discard client.getContent("https://google.com/404")
  70. doAssert(false, "HttpRequestError should have been raised")
  71. except HttpRequestError:
  72. discard
  73. except:
  74. doAssert(false, "HttpRequestError should have been raised")
  75. when false:
  76. # w3.org now blocks travis, so disabled:
  77. # Multipart test.
  78. var data = newMultipartData()
  79. data["output"] = "soap12"
  80. data["uploaded_file"] = ("test.html", "text/html",
  81. "<html><head></head><body><p>test</p></body></html>")
  82. resp = client.post("http://validator.w3.org/check", multipart=data)
  83. doAssert(resp.code.is2xx)
  84. # onProgressChanged
  85. when manualTests:
  86. proc onProgressChanged(total, progress, speed: BiggestInt) =
  87. echo("Downloaded ", progress, " of ", total)
  88. echo("Current rate: ", speed div 1000, "kb/s")
  89. client.onProgressChanged = onProgressChanged
  90. client.downloadFile("http://speedtest-ams2.digitalocean.com/100mb.test",
  91. "100mb.test")
  92. client.close()
  93. when false:
  94. # Disabled for now because it causes troubles with AppVeyor
  95. # Timeout test.
  96. client = newHttpClient(timeout = 1)
  97. try:
  98. resp = client.request("http://example.com/")
  99. doAssert false, "TimeoutError should have been raised."
  100. except TimeoutError:
  101. discard
  102. except:
  103. doAssert false, "TimeoutError should have been raised."
  104. proc makeIPv6HttpServer(hostname: string, port: Port): AsyncFD =
  105. let fd = newNativeSocket(AF_INET6)
  106. setSockOptInt(fd, SOL_SOCKET, SO_REUSEADDR, 1)
  107. var aiList = getAddrInfo(hostname, port, AF_INET6)
  108. if bindAddr(fd, aiList.ai_addr, aiList.ai_addrlen.Socklen) < 0'i32:
  109. freeAddrInfo(aiList)
  110. raiseOSError(osLastError())
  111. freeAddrInfo(aiList)
  112. if listen(fd) != 0:
  113. raiseOSError(osLastError())
  114. setBlocking(fd, false)
  115. var serverFd = fd.AsyncFD
  116. register(serverFd)
  117. result = serverFd
  118. proc onAccept(fut: Future[AsyncFD]) {.gcsafe.} =
  119. if not fut.failed:
  120. let clientFd = fut.read()
  121. clientFd.send("HTTP/1.1 200 OK\r\LContent-Length: 0\r\LConnection: Closed\r\L\r\L").callback = proc() =
  122. clientFd.closeSocket()
  123. serverFd.accept().callback = onAccept
  124. serverFd.accept().callback = onAccept
  125. proc ipv6Test() =
  126. var client = newAsyncHttpClient()
  127. let serverFd = makeIPv6HttpServer("::1", Port(18473))
  128. var resp = waitFor client.request("http://[::1]:18473/")
  129. doAssert(resp.status == "200 OK")
  130. serverFd.closeSocket()
  131. client.close()
  132. syncTest()
  133. waitFor(asyncTest())
  134. ipv6Test()
  135. echo "OK"