Skip to content

Asmod4n/mruby-uri-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mruby-uri-parser

WHATWG-compliant URI parser for mruby, backed by ada-url.

Features

  • WHATWG URL Standard compliant parsing
  • Zero-copy component extraction via string views into the normalized href
  • RFC 3986 percent-encoding and decoding
  • Cross-platform (Linux, macOS, Windows)

Examples

URI Parsing

uri = URI.parse("http://user:password@domain.tld:8080/path?query=string#fragment")

uri.scheme    # => "http"
uri.userinfo  # => "user:password"
uri.username  # => "user"
uri.password  # => "password"
uri.host      # => "domain.tld"
uri.hostname  # => "domain.tld"
uri.port      # => 8080
uri.path      # => "/path"
uri.query     # => "query=string"
uri.fragment  # => "fragment"
uri.origin    # => "http://domain.tld:8080"
uri.authority # => "domain.tld:8080"
uri.to_s      # => "http://user:password@domain.tld:8080/path?query=string#fragment" (original input)
uri.href      # => "http://user:password@domain.tld:8080/path?query=string#fragment" (WHATWG normalized)

Default ports are resolved via getservbyname:

uri = URI.parse("https://heise.de")
uri.port      # => 443
uri.authority # => "heise.de"

IPv6 hosts are supported:

uri = URI.parse("http://[::1]:8080/path")
uri.host      # => "[::1]"
uri.port      # => 8080

Predicate helpers:

uri.has_credentials? # => true/false
uri.has_query?       # => true/false
uri.has_fragment?    # => true/false

Equality is based on the WHATWG normalized href:

URI.parse("https://example.com") == URI.parse("https://example.com") # => true

Error Handling

URI.parse("not a url")  # raises URI::Malformed
URI.parse(123)          # raises TypeError

URI Encoding / Decoding

Encodes all characters except RFC 3986 unreserved (A-Z a-z 0-9 - . _ ~):

URI.encode("hello world/path?q=1") # => "hello%20world%2Fpath%3Fq%3D1"
URI.decode("hello%20world")        # => "hello world"
URI.decode("%2G")  # raises URI::Malformed — invalid hex digit
URI.decode("%2")   # raises URI::Malformed — incomplete sequence
URI.decode(123)    # raises TypeError
URI.encode(123)    # raises TypeError

Dependencies

License

Copyright 2016–2026 Hendrik Beskow

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

About

WHATWG compliant URI Parser for mruby

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors