How do I format a date for an HTTP header in gleam?

30 views Asked by At

I'm looking to set a Date header. It should be in this format:

Date: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
Date: Wed, 21 Oct 2015 07:28:00 GMT

Here's what I have so far:

import gleam/http/elli
import gleam/http/response.{type Response}
import gleam/http/request.{type Request}
import gleam/bytes_builder.{type BytesBuilder}
import birl

// Define a HTTP service
//
pub fn my_service(_request: Request(t)) -> Response(BytesBuilder) {
  let body = bytes_builder.from_string("Hello, world!")

  response.new(200)
  |> response.prepend_header("content-type", "text/plain")
  |> response.prepend_header("server", "gleam")
  |> response.prepend_header("date", birl.to_iso8601(birl.now()))
  |> response.set_body(body)
}

pub fn main() {
  elli.become(my_service, on_port: 8080)
}
2

There are 2 answers

0
Andy Fleming On BEST ANSWER

It looks like birl has a to_http function.

birl.to_http(birl.now())
0
jepozdemir On

you can use the Birl library's format_date function:

import gleam/http/elli
import gleam/http/response.{type Response}
import gleam/http/request.{type Request}
import gleam/bytes_builder.{type BytesBuilder}
import birl
import time.{Iso8601}

// Define a HTTP service
//
pub fn my_service(_request: Request(t)) -> Response(BytesBuilder) {
  let body = bytes_builder.from_string("Hello, world!")

  response.new(200)
  |> response.prepend_header("content-type", "text/plain")
  |> response.prepend_header("server", "gleam")
  |> response.prepend_header("date", format_date(birl.now()))
  |> response.set_body(body)
}

fn format_date(timestamp: Iso8601) -> String {
  let date = birl.format_date(timestamp, "EEE, dd MMM yyyy HH:mm:ss 'GMT'")
  date
}

pub fn main() {
  elli.become(my_service, on_port: 8080)
}