# uri
![Lint](https://github.com/fredbi/uri/actions/workflows/01-golang-lint.yaml/badge.svg)
![CI](https://github.com/fredbi/uri/actions/workflows/02-test.yaml/badge.svg)
[![Coverage Status](https://coveralls.io/repos/github/fredbi/uri/badge.svg?branch=master)](https://coveralls.io/github/fredbi/uri?branch=master)
![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/fredbi/uri)
[![Go Reference](https://pkg.go.dev/badge/github.com/fredbi/uri.svg)](https://pkg.go.dev/github.com/fredbi/uri)
[![license](http://img.shields.io/badge/license/License-MIT-yellow.svg)](https://raw.githubusercontent.com/fredbi/uri/master/LICENSE.md)
[![Go Report Card](https://goreportcard.com/badge/github.com/fredbi/uri)](https://goreportcard.com/report/github.com/fredbi/uri)

Package uri is meant to be an RFC 3986 compliant URI builder, parser and validator for `golang`.

It supports strict RFC validation for URI and URI relative references.

## Usage

### Parsing

```go
	u, err := Parse("https://example.com:8080/path")
	if err != nil {
		fmt.Printf("Invalid URI")
	} else {
		fmt.Printf("%s", u.Scheme())
	}
	// Output: https
```

```go
	u, err := ParseReference("//example.com/path")
	if err != nil {
		fmt.Printf("Invalid URI reference")
	} else {
		fmt.Printf("%s", u.Authority().Path())
	}
	// Output: /path
```

### Validation

```go
    isValid := IsURI("urn://example.com?query=x#fragment/path") // true

    isValid= IsURI("//example.com?query=x#fragment/path") // false

    isValid= IsURIReference("//example.com?query=x#fragment/path") // true
```

### Building

(to be continued...)

## Reference specifications
- https://tools.ietf.org/html/rfc3986

Internationalization support:
- https://tools.ietf.org/html/rfc3987

IPv6 addressing scheme reference and erratum:
- https://tools.ietf.org/html/rfc6874

This allows for stricter conformance than the `net/url` in the Go standard libary,
which provides a workable but loose implementation of the RFC.

This package concentrates on RFC 3986 strictness for URI validation. 
At the moment, there is no attempt to normalize or auto-escape strings. 
For url normalization, see [PuerkitoBio/purell](https://github.com/PuerkitoBio/purell).

## Disclaimer

Not supported:
- provisions for "IPvFuture" are not implemented.

Hostnames vs domain names:
- a list of common schemes triggers the validation of hostname against domain name rules.

Example:
* ftp://host, http://host default to validating a proper hostname.

## Credits

Tests have been aggregated from test suites of URI validators from other languages:
Perl, Python, Scala, .Net. and the Go url standard library.

> This package was initially based on the work from ttacon/uri (credits: Trey Tacon).
> Extra features like MySQL URIs present in the original repo have been removed.

A lot of improvements have been brought by the incredible guys at [`fyne-io`](https://github.com/fyne-io). Thanks all.
