Use distinct range for HttpCode as suggested by @nigredo-tori.

This commit is contained in:
Dominik Picheta
2016-09-19 20:58:27 +02:00
parent 1fb5dd2477
commit cfd187d16e
3 changed files with 121 additions and 55 deletions

View File

@@ -93,12 +93,13 @@ type
headers*: HttpHeaders
body*: string
proc code*(response: Response): HttpCode {.raises: [ValueError].} =
proc code*(response: Response): HttpCode
{.raises: [ValueError, OverflowError].} =
## Retrieves the specified response's ``HttpCode``.
##
## Raises a ``ValueError`` if the response's ``status`` does not have a
## corresponding ``HttpCode``.
return parseEnum[HttpCode](response.status)
return response.status[0 .. 2].parseInt.HttpCode
type
Proxy* = ref object

View File

@@ -18,54 +18,7 @@ type
HttpHeaderValues* = distinct seq[string]
HttpCode* = enum
Http100 = "100 Continue",
Http101 = "101 Switching Protocols",
Http200 = "200 OK",
Http201 = "201 Created",
Http202 = "202 Accepted",
Http203 = "203 Non-Authoritative Information",
Http204 = "204 No Content",
Http205 = "205 Reset Content",
Http206 = "206 Partial Content",
Http300 = "300 Multiple Choices",
Http301 = "301 Moved Permanently",
Http302 = "302 Found",
Http303 = "303 See Other",
Http304 = "304 Not Modified",
Http305 = "305 Use Proxy",
Http307 = "307 Temporary Redirect",
Http400 = "400 Bad Request",
Http401 = "401 Unauthorized",
Http403 = "403 Forbidden",
Http404 = "404 Not Found",
Http405 = "405 Method Not Allowed",
Http406 = "406 Not Acceptable",
Http407 = "407 Proxy Authentication Required",
Http408 = "408 Request Timeout",
Http409 = "409 Conflict",
Http410 = "410 Gone",
Http411 = "411 Length Required",
Http412 = "412 Precondition Failed",
Http413 = "413 Request Entity Too Large",
Http414 = "414 Request-URI Too Long",
Http415 = "415 Unsupported Media Type",
Http416 = "416 Requested Range Not Satisfiable",
Http417 = "417 Expectation Failed",
Http418 = "418 I'm a teapot",
Http421 = "421 Misdirected Request",
Http422 = "422 Unprocessable Entity",
Http426 = "426 Upgrade Required",
Http428 = "428 Precondition Required",
Http429 = "429 Too Many Requests",
Http431 = "431 Request Header Fields Too Large",
Http451 = "451 Unavailable For Legal Reasons",
Http500 = "500 Internal Server Error",
Http501 = "501 Not Implemented",
Http502 = "502 Bad Gateway",
Http503 = "503 Service Unavailable",
Http504 = "504 Gateway Timeout",
Http505 = "505 HTTP Version Not Supported"
HttpCode* = distinct range[100 .. 599]
HttpVersion* = enum
HttpVer11,
@@ -93,6 +46,56 @@ type
httpPut: HttpPut, httpDelete: HttpDelete, httpTrace: HttpTrace,
httpOptions: HttpOptions, httpConnect: HttpConnect].}
const
Http100* = HttpCode(100)
Http101* = HttpCode(101)
Http200* = HttpCode(200)
Http201* = HttpCode(201)
Http202* = HttpCode(202)
Http203* = HttpCode(203)
Http204* = HttpCode(204)
Http205* = HttpCode(205)
Http206* = HttpCode(206)
Http300* = HttpCode(300)
Http301* = HttpCode(301)
Http302* = HttpCode(302)
Http303* = HttpCode(303)
Http304* = HttpCode(304)
Http305* = HttpCode(305)
Http307* = HttpCode(307)
Http400* = HttpCode(400)
Http401* = HttpCode(401)
Http403* = HttpCode(403)
Http404* = HttpCode(404)
Http405* = HttpCode(405)
Http406* = HttpCode(406)
Http407* = HttpCode(407)
Http408* = HttpCode(408)
Http409* = HttpCode(409)
Http410* = HttpCode(410)
Http411* = HttpCode(411)
Http412* = HttpCode(412)
Http413* = HttpCode(413)
Http414* = HttpCode(414)
Http415* = HttpCode(415)
Http416* = HttpCode(416)
Http417* = HttpCode(417)
Http418* = HttpCode(418)
Http421* = HttpCode(421)
Http422* = HttpCode(422)
Http426* = HttpCode(426)
Http428* = HttpCode(428)
Http429* = HttpCode(429)
Http431* = HttpCode(431)
Http451* = HttpCode(451)
Http500* = HttpCode(500)
Http501* = HttpCode(501)
Http502* = HttpCode(502)
Http503* = HttpCode(503)
Http504* = HttpCode(504)
Http505* = HttpCode(505)
const headerLimit* = 10_000
proc newHttpHeaders*(): HttpHeaders =
@@ -213,24 +216,83 @@ proc `==`*(protocol: tuple[orig: string, major, minor: int],
proc contains*(methods: set[HttpMethod], x: string): bool =
return parseEnum[HttpMethod](x) in methods
proc status*(code: HttpCode): string =
## Converts the specified ``HttpCode`` into a HTTP status.
##
## For example:
##
## .. code-block:: nim
## doAssert(Http404.status == "404 Not Found")
case code.int
of 100: "100 Continue"
of 101: "101 Switching Protocols"
of 200: "200 OK"
of 201: "201 Created"
of 202: "202 Accepted"
of 203: "203 Non-Authoritative Information"
of 204: "204 No Content"
of 205: "205 Reset Content"
of 206: "206 Partial Content"
of 300: "300 Multiple Choices"
of 301: "301 Moved Permanently"
of 302: "302 Found"
of 303: "303 See Other"
of 304: "304 Not Modified"
of 305: "305 Use Proxy"
of 307: "307 Temporary Redirect"
of 400: "400 Bad Request"
of 401: "401 Unauthorized"
of 403: "403 Forbidden"
of 404: "404 Not Found"
of 405: "405 Method Not Allowed"
of 406: "406 Not Acceptable"
of 407: "407 Proxy Authentication Required"
of 408: "408 Request Timeout"
of 409: "409 Conflict"
of 410: "410 Gone"
of 411: "411 Length Required"
of 412: "412 Precondition Failed"
of 413: "413 Request Entity Too Large"
of 414: "414 Request-URI Too Long"
of 415: "415 Unsupported Media Type"
of 416: "416 Requested Range Not Satisfiable"
of 417: "417 Expectation Failed"
of 418: "418 I'm a teapot"
of 421: "421 Misdirected Request"
of 422: "422 Unprocessable Entity"
of 426: "426 Upgrade Required"
of 428: "428 Precondition Required"
of 429: "429 Too Many Requests"
of 431: "431 Request Header Fields Too Large"
of 451: "451 Unavailable For Legal Reasons"
of 500: "500 Internal Server Error"
of 501: "501 Not Implemented"
of 502: "502 Bad Gateway"
of 503: "503 Service Unavailable"
of 504: "504 Gateway Timeout"
of 505: "505 HTTP Version Not Supported"
else: $(int(code))
proc `==`*(a, b: HttpCode): bool {.borrow.}
proc `==`*(rawCode: string, code: HttpCode): bool =
return rawCode.toLower() == ($code).toLower()
return rawCode.toLower() == code.status.toLower()
proc is2xx*(code: HttpCode): bool =
## Determines whether ``code`` is a 2xx HTTP status code.
return ($code).startsWith("2")
return code.int in {200 .. 299}
proc is3xx*(code: HttpCode): bool =
## Determines whether ``code`` is a 3xx HTTP status code.
return ($code).startsWith("3")
return code.int in {300 .. 399}
proc is4xx*(code: HttpCode): bool =
## Determines whether ``code`` is a 4xx HTTP status code.
return ($code).startsWith("4")
return code.int in {400 .. 499}
proc is5xx*(code: HttpCode): bool =
## Determines whether ``code`` is a 5xx HTTP status code.
return ($code).startsWith("5")
return code.int in {500 .. 599}
when isMainModule:
var test = newHttpHeaders()

View File

@@ -65,6 +65,9 @@ that have tuple name:
- ``AsyncHttpClient.headers`` type is now ``HttpHeaders``.
- The `$` operator for ``HttpCode`` no longer exists, use the ``status``
procedure to get the code's status message.
Library Additions
-----------------