diff options
author | Peter Saxton <peterhsaxton@gmail.com> | 2020-06-16 07:12:44 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2020-06-16 13:27:41 +0100 |
commit | 6855eb99857f7cd791f9b17f9435d39f31d7ea63 (patch) | |
tree | 212071b89b9b63ff125d09dbcbd2f7ce25e464d5 | |
parent | 515e85723ce88e86960989c1208b9c439610f607 (diff) | |
download | gleam_stdlib-6855eb99857f7cd791f9b17f9435d39f31d7ea63.tar.gz gleam_stdlib-6855eb99857f7cd791f9b17f9435d39f31d7ea63.zip |
add origin function
-rw-r--r-- | src/gleam/uri.gleam | 20 | ||||
-rw-r--r-- | test/gleam/uri_test.gleam | 30 |
2 files changed, 49 insertions, 1 deletions
diff --git a/src/gleam/uri.gleam b/src/gleam/uri.gleam index f92f91a..9224adf 100644 --- a/src/gleam/uri.gleam +++ b/src/gleam/uri.gleam @@ -9,7 +9,7 @@ import gleam/list import gleam/result -import gleam/option.{Option} +import gleam/option.{Option, Some, None} import gleam/string import gleam/dynamic.{Dynamic} import gleam/map.{Map} @@ -164,3 +164,21 @@ pub fn to_string(uri: Uri) -> String { |> dynamic.string |> result.unwrap("") } + +/// Fetch the origin of a url +/// +/// Return the origin of a url as defined in +/// https://tools.ietf.org/html/rfc6454 +/// +/// The supported url schemes are `http` and `https` +/// Urls without a scheme will return Error +pub fn origin(uri: Uri) -> Result(String, Nil) { + let Uri(scheme: scheme, host: host, port: port, ..) = uri + case scheme { + Some("https") | Some("http") -> { + let origin = Uri(scheme, None, host, port, "", None, None) + Ok(to_string(origin)) + } + _ -> Error(Nil) + } +} diff --git a/test/gleam/uri_test.gleam b/test/gleam/uri_test.gleam index 49b4c02..9f102e0 100644 --- a/test/gleam/uri_test.gleam +++ b/test/gleam/uri_test.gleam @@ -101,3 +101,33 @@ pub fn parse_segments_test() { should.equal(uri.path_segments("../bar"), ["bar"]) should.equal(uri.path_segments("/foo/../bar"), ["bar"]) } + +pub fn origin_test() { + let Ok(parsed) = uri.parse("http://example.test/path?foo#bar") + uri.origin(parsed) + |> should.equal(Ok("http://example.test")) + + let Ok(parsed) = uri.parse("http://example.test:8080") + uri.origin(parsed) + |> should.equal(Ok("http://example.test:8080")) + + let Ok(parsed) = uri.parse("https://example.test") + uri.origin(parsed) + |> should.equal(Ok("https://example.test")) + + let Ok(parsed) = uri.parse("http:///path") + uri.origin(parsed) + |> should.equal(Ok("http://")) + + let Ok(parsed) = uri.parse("http://") + uri.origin(parsed) + |> should.equal(Ok("http://")) + + let Ok(parsed) = uri.parse("/path") + uri.origin(parsed) + |> should.equal(Error(Nil)) + + let Ok(parsed) = uri.parse("file:///dev/null") + uri.origin(parsed) + |> should.equal(Error(Nil)) +} |