fix: error handling and vendor
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
20
vendor/github.com/peterhellberg/link/LICENSE
generated
vendored
Normal file
20
vendor/github.com/peterhellberg/link/LICENSE
generated
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
Copyright (c) 2015-2022 Peter Hellberg https://c7.se
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
||||
OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
82
vendor/github.com/peterhellberg/link/README.md
generated
vendored
Normal file
82
vendor/github.com/peterhellberg/link/README.md
generated
vendored
Normal file
@ -0,0 +1,82 @@
|
||||
# link
|
||||
|
||||
[](https://github.com/peterhellberg/link/actions/workflows/test.yml)
|
||||
[](https://goreportcard.com/report/github.com/peterhellberg/link)
|
||||
[](https://pkg.go.dev/github.com/peterhellberg/link)
|
||||
[](https://github.com/peterhellberg/link#license-mit)
|
||||
|
||||
Parses **Link** headers used for pagination, as defined in [RFC 5988](https://tools.ietf.org/html/rfc5988).
|
||||
|
||||
This package was originally based on <https://github.com/swhite24/link>, but **Parse** takes a `string` instead of `*http.Request` in this version.
|
||||
It also has the convenience functions **ParseHeader**, **ParseRequest** and **ParseResponse**.
|
||||
|
||||
## Installation
|
||||
|
||||
go get -u github.com/peterhellberg/link
|
||||
|
||||
## Exported functions
|
||||
|
||||
- [Parse(s string) Group](https://godoc.org/github.com/peterhellberg/link#Parse)
|
||||
- [ParseHeader(h http.Header) Group](https://godoc.org/github.com/peterhellberg/link#ParseHeader)
|
||||
- [ParseRequest(req \*http.Request) Group](https://godoc.org/github.com/peterhellberg/link#ParseRequest)
|
||||
- [ParseResponse(resp \*http.Response) Group](https://godoc.org/github.com/peterhellberg/link#ParseResponse)
|
||||
|
||||
## Usage
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/peterhellberg/link"
|
||||
)
|
||||
|
||||
func main() {
|
||||
for _, l := range link.Parse(`<https://example.com/?page=2>; rel="next"; foo="bar"`) {
|
||||
fmt.Printf("URI: %q, Rel: %q, Extra: %+v\n", l.URI, l.Rel, l.Extra)
|
||||
// URI: "https://example.com/?page=2", Rel: "next", Extra: map[foo:bar]
|
||||
}
|
||||
|
||||
if resp, err := http.Get("https://api.github.com/search/code?q=Println+user:golang"); err == nil {
|
||||
for _, l := range link.ParseResponse(resp) {
|
||||
fmt.Printf("URI: %q, Rel: %q, Extra: %+v\n", l.URI, l.Rel, l.Extra)
|
||||
// URI: "https://api.github.com/search/code?q=Println+user%3Agolang&page=2", Rel: "next", Extra: map[]
|
||||
// URI: "https://api.github.com/search/code?q=Println+user%3Agolang&page=34", Rel: "last", Extra: map[]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Not supported
|
||||
|
||||
- Extended notation ([RFC 5987](https://tools.ietf.org/html/rfc5987))
|
||||
|
||||
## Alternatives to this package
|
||||
|
||||
- [github.com/tent/http-link-go](https://github.com/tent/http-link-go)
|
||||
- [github.com/swhite24/link](https://github.com/swhite24/link)
|
||||
|
||||
## License (MIT)
|
||||
|
||||
Copyright (c) 2015-2022 [Peter Hellberg](https://c7.se)
|
||||
|
||||
> Permission is hereby granted, free of charge, to any person obtaining
|
||||
> a copy of this software and associated documentation files (the
|
||||
> "Software"), to deal in the Software without restriction, including
|
||||
> without limitation the rights to use, copy, modify, merge, publish,
|
||||
> distribute, sublicense, and/or sell copies of the Software, and to
|
||||
> permit persons to whom the Software is furnished to do so, subject to
|
||||
> the following conditions:
|
||||
|
||||
> The above copyright notice and this permission notice shall be
|
||||
> included in all copies or substantial portions of the Software.
|
||||
|
||||
> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
> WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
38
vendor/github.com/peterhellberg/link/doc.go
generated
vendored
Normal file
38
vendor/github.com/peterhellberg/link/doc.go
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
Package link parses Link headers used for pagination, as defined in RFC 5988
|
||||
|
||||
# Installation
|
||||
|
||||
Just go get the package:
|
||||
|
||||
go get -u github.com/peterhellberg/link
|
||||
|
||||
# Usage
|
||||
|
||||
A small usage example
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/peterhellberg/link"
|
||||
)
|
||||
|
||||
func main() {
|
||||
for _, l := range link.Parse(`<https://example.com/?page=2>; rel="next"; foo="bar"`) {
|
||||
fmt.Printf("URI: %q, Rel: %q, Extra: %+v\n", l.URI, l.Rel, l.Extra)
|
||||
// URI: "https://example.com/?page=2", Rel: "next", Extra: map[foo:bar]
|
||||
}
|
||||
|
||||
if resp, err := http.Get("https://api.github.com/search/code?q=Println+user:golang"); err == nil {
|
||||
for _, l := range link.ParseResponse(resp) {
|
||||
fmt.Printf("URI: %q, Rel: %q, Extra: %+v\n", l.URI, l.Rel, l.Extra)
|
||||
// URI: "https://api.github.com/search/code?q=Println+user%3Agolang&page=2", Rel: "next", Extra: map[]
|
||||
// URI: "https://api.github.com/search/code?q=Println+user%3Agolang&page=34", Rel: "last", Extra: map[]
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
package link
|
120
vendor/github.com/peterhellberg/link/link.go
generated
vendored
Normal file
120
vendor/github.com/peterhellberg/link/link.go
generated
vendored
Normal file
@ -0,0 +1,120 @@
|
||||
package link
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
commaRegexp = regexp.MustCompile(`,\s{0,}`)
|
||||
valueCommaRegexp = regexp.MustCompile(`([^"]),`)
|
||||
equalRegexp = regexp.MustCompile(` *= *`)
|
||||
keyRegexp = regexp.MustCompile(`[a-z*]+`)
|
||||
linkRegexp = regexp.MustCompile(`\A<(.+)>;(.+)\z`)
|
||||
semiRegexp = regexp.MustCompile(`;\s{0,}`)
|
||||
valRegexp = regexp.MustCompile(`"+([^"]+)"+`)
|
||||
)
|
||||
|
||||
// Group returned by Parse, contains multiple links indexed by "rel".
|
||||
type Group map[string]*Link
|
||||
|
||||
// Link contains a Link item with URI, Rel, and other non-URI components in Extra.
|
||||
type Link struct {
|
||||
URI string
|
||||
Rel string
|
||||
Extra map[string]string
|
||||
}
|
||||
|
||||
// String returns the URI.
|
||||
func (l *Link) String() string {
|
||||
return l.URI
|
||||
}
|
||||
|
||||
// ParseRequest parses the provided *http.Request into a Group.
|
||||
func ParseRequest(req *http.Request) Group {
|
||||
if req == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return ParseHeader(req.Header)
|
||||
}
|
||||
|
||||
// ParseResponse parses the provided *http.Response into a Group.
|
||||
func ParseResponse(resp *http.Response) Group {
|
||||
if resp == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return ParseHeader(resp.Header)
|
||||
}
|
||||
|
||||
// ParseHeader retrieves the Link header from the provided http.Header and parses it into a Group.
|
||||
func ParseHeader(h http.Header) Group {
|
||||
if headers, found := h["Link"]; found {
|
||||
return Parse(strings.Join(headers, ", "))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Parse parses the provided string into a Group.
|
||||
func Parse(s string) Group {
|
||||
if s == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
s = valueCommaRegexp.ReplaceAllString(s, "$1")
|
||||
|
||||
group := Group{}
|
||||
|
||||
for _, l := range commaRegexp.Split(s, -1) {
|
||||
linkMatches := linkRegexp.FindAllStringSubmatch(l, -1)
|
||||
|
||||
if len(linkMatches) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
pieces := linkMatches[0]
|
||||
|
||||
link := &Link{URI: pieces[1], Extra: map[string]string{}}
|
||||
|
||||
for _, extra := range semiRegexp.Split(pieces[2], -1) {
|
||||
vals := equalRegexp.Split(extra, -1)
|
||||
|
||||
if len(vals) != 2 {
|
||||
continue
|
||||
}
|
||||
|
||||
val := strings.TrimSpace(vals[1])
|
||||
key := keyRegexp.FindString(vals[0])
|
||||
vsm := valRegexp.FindStringSubmatch(vals[1])
|
||||
|
||||
if len(vsm) == 2 {
|
||||
val = vsm[1]
|
||||
}
|
||||
|
||||
if key == "rel" {
|
||||
vals := strings.Split(val, " ")
|
||||
rels := []string{vals[0]}
|
||||
|
||||
if len(vals) > 1 {
|
||||
for _, v := range vals[1:] {
|
||||
if !strings.HasPrefix(v, "http") {
|
||||
rels = append(rels, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rel := strings.Join(rels, " ")
|
||||
|
||||
link.Rel = rel
|
||||
group[rel] = link
|
||||
} else {
|
||||
link.Extra[key] = val
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return group
|
||||
}
|
Reference in New Issue
Block a user