๐Ÿ’พ Archived View for source.community โ€บ ckaznocha โ€บ gemini โ€บ blob โ€บ main โ€บ url.go captured on 2024-05-10 at 11:04:41. Gemini links have been rewritten to link to archived content

View Raw

More Information

โฌ…๏ธ Previous capture (2024-02-05)

-=-=-=-=-=-=-

                                                         .
,-. ,-. . . ,-. ,-. ,-.    ,-. ,-. ,-,-. ,-,-. . . ,-. . |- . .
`-. | | | | |   |   |-'    |   | | | | | | | | | | | | | |  | |
`-' `-' `-^ '   `-' `-' :: `-' `-' ' ' ' ' ' ' `-^ ' ' ' `' `-|
                                                             /|
                                                            `-'

Profile for ckaznocha

ckaznocha / gemini

git clone https://source.community/ckaznocha/gemini.git

Branches

Log

Tree

/url.go (main)

โ†‘ /

blob

View raw contents of /url.go (main)

โ”€โ”€โ”€โ”€โ•ฎ
   1โ”‚ package gemini
   2โ”‚ 
   3โ”‚ import (
   4โ”‚ 	"fmt"
   5โ”‚ 	"net/url"
   6โ”‚ 	"unicode/utf8"
   7โ”‚ )
   8โ”‚ 
   9โ”‚ // URI represents a Gemini URI.
  10โ”‚ //
  11โ”‚ // Resources hosted via Gemini are identified using URIs with the scheme
  12โ”‚ // "gemini".  This scheme is syntactically compatible with the generic URI
  13โ”‚ // syntax defined in RFC 3986, but does not support all components of the
  14โ”‚ // generic syntax.  In particular, the authority component is allowed and
  15โ”‚ // required, but its userinfo subcomponent is NOT allowed.  The host
  16โ”‚ // subcomponent is required.  The port subcomponent is optional, with a default
  17โ”‚ // value of 1965.  The path, query and fragment components are allowed and have
  18โ”‚ // no special meanings beyond those defined by the generic syntax.  Spaces in
  19โ”‚ // gemini URIs should be encoded as %20, not +.
  20โ”‚ type URI struct {
  21โ”‚ 	url *url.URL
  22โ”‚ 
  23โ”‚ 	Host     string
  24โ”‚ 	Port     string
  25โ”‚ 	Path     string
  26โ”‚ 	Fragment string
  27โ”‚ 
  28โ”‚ 	// Query is the decoded query section. The original query is stored in
  29โ”‚ 	// RawQuery.
  30โ”‚ 	Query string
  31โ”‚ 
  32โ”‚ 	// RawQuery is the original query section as received by the server. Use
  33โ”‚ 	// this in the event you need to parse a query section into a url.Values.
  34โ”‚ 	RawQuery string
  35โ”‚ }
  36โ”‚ 
  37โ”‚ // ParseRequestURI parses a raw URI string into a Gemini URI. It returns an error if
  38โ”‚ // the URI is invalid.
  39โ”‚ func ParseRequestURI(rawURI string) (*URI, error) {
  40โ”‚ 	if !utf8.ValidString(rawURI) {
  41โ”‚ 		return nil, fmt.Errorf("%w: request URI must be valid utf-8", ErrMalformedURI)
  42โ”‚ 	}
  43โ”‚ 
  44โ”‚ 	uri, err := url.ParseRequestURI(rawURI)
  45โ”‚ 	if err != nil {
  46โ”‚ 		return nil, fmt.Errorf("%w: %s", ErrMalformedURI, err)
  47โ”‚ 	}
  48โ”‚ 
  49โ”‚ 	if !uri.IsAbs() {
  50โ”‚ 		return nil, fmt.Errorf("%w: request URI cannot be relative", ErrMalformedURI)
  51โ”‚ 	}
  52โ”‚ 
  53โ”‚ 	if uri.User != nil {
  54โ”‚ 		return nil, fmt.Errorf("%w: URI cannot have a user", ErrMalformedURI)
  55โ”‚ 	}
  56โ”‚ 
  57โ”‚ 	if uri.Host == "" {
  58โ”‚ 		return nil, fmt.Errorf("%w: URI must have a host", ErrMalformedURI)
  59โ”‚ 	}
  60โ”‚ 
  61โ”‚ 	query, err := url.PathUnescape(uri.RawQuery)
  62โ”‚ 	if err != nil {
  63โ”‚ 		return nil, fmt.Errorf("%w: URI has a malformed query section: %s", ErrMalformedURI, err)
  64โ”‚ 	}
  65โ”‚ 
  66โ”‚ 	return &URI{
  67โ”‚ 		Host:     uri.Hostname(),
  68โ”‚ 		Port:     uri.Port(),
  69โ”‚ 		Path:     uri.Path,
  70โ”‚ 		Fragment: uri.Fragment,
  71โ”‚ 		Query:    query,
  72โ”‚ 		RawQuery: uri.RawQuery,
  73โ”‚ 		url:      uri,
  74โ”‚ 	}, nil
  75โ”‚ }
  76โ”‚ 
  77โ”‚ func (u *URI) String() string {
  78โ”‚ 	if u.url == nil {
  79โ”‚ 		u.url = &url.URL{
  80โ”‚ 			Scheme:   "gemini",
  81โ”‚ 			Host:     u.Host,
  82โ”‚ 			Path:     u.Path,
  83โ”‚ 			RawQuery: u.RawQuery,
  84โ”‚ 			Fragment: u.Fragment,
  85โ”‚ 		}
  86โ”‚ 	}
  87โ”‚ 
  88โ”‚ 	return u.url.String()
  89โ”‚ }
โ”€โ”€โ”€โ”€โ•ฏ

ยท ยท ยท

๐Ÿก Home

FAQs

Privacy Policy

Terms & Conditions

Official Gemlog

info@source.community

ยฉ 2024 source.community