Skip to content

Headers

Prologue provides two types of headers. One is the headers of request which carries information from the client. The other is the headers of response which carries information sent to the client.

The headers of the request

The client will send headers to our HTTP server. You may want to check whether some keys are in the headers. If existing, you could get the values of them. The return type of ctx.request.getHeader is seq[string]. You often only need the first element of the sequence.

The following code first checks whether the key exists in headers. If true, retrieve the sequence of values and display them in the browser.

proc hello(ctx: Context) {.async.} =
  if ctx.request.hasHeader("cookie"):
    let values = ctx.request.getHeader("cookie")
    resp $values
  elif ctx.request.hasHeader("content-type"):
    let values = ctx.request.getHeaderOrDefault("content")
    resp $values

The headers of the response

Prologue also sends HTTP headers to the client. It uses ResponseHeaders to store them. It has similar API like the headers of the request. First, Prologue initializes ctx.response with initResponseHeaders. Then users could use hasHeader, addHeader or setHeader to do what they want.

Notes that, addHeader will append values to existing keys in headers. setHeader will reset the values of key no matter whether key is in the headers.

proc hello(ctx: Context) {.async.} =
  ctx.response.addHeader("Content-Type", "text/plain")

  doAssert ctx.response.getHeader("CONTENT-TYPE") == @[
        "text/html; charset=UTF-8", "text/plain"]

  ctx.response.setHeader("Content-Type", "text/plain")

  doAssert ctx.response.getHeader("CONTENT-TYPE") == @[
      "text/html; charset=UTF-8", "text/plain"]