Skip to content

More strongly-typed HTTP and HTTPS URIs #162

Description

@torinnd

I find myself reaching for a more strongly typed URI when the scheme is one of "http" or "https". As per https://httpwg.org/specs/rfc9110.html#rfc.section.4.2 the following semantics need to be enforced for absolute URIs with one of these two schemes:

  • The [scheme] field must be populated with exactly "http" or "https"
  • The [userinfo] field is deprecated and must be omitted
  • The [host] field is required

One way this could be addressed is by leveraging a GADT like:

type 'a t

val host : [< `Base | `Http ] t -> string option
val host' : [ `Http ] t -> string

val scheme : [< `Base | `Http ] t -> string option
val scheme' : [ `Http ] t -> [ `Http | `Https ]

This would be a non-trivial API change for URI, of course. A smaller change could be to introduce a submodule into the MLI for an [Absolute_http.h] with appropriate conversion functions:

val of_t : t -> (h, [ `Msg of string]) result
val to_t : h -> t

... and a subset of the [Uri] MLI adapted to the constraints enforced by the scheme (e.g. [make] would require [host], omit [userinfo], and accept a more constrained set of [scheme]'s).

I have a fairly narrow understanding of other use cases for URI (for example, I see there is an old Issue #158 for Websocket support, which feels related), but imagine there are additional considerations besides what I've raised here. The big win for me personally would be a calling pattern where I could be confident that a [host] is present.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions