http

package
v0.1.22 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 8, 2021 License: MIT Imports: 20 Imported by: 9

README

HTTP

This package extends the net/http package to provide signed requests using a keys.EdX25519Key.

key := keys.GenerateEdX25519Key()

// Vault POST
content := []byte(`[{"data":"dGVzdGluZzE="},{"data":"dGVzdGluZzI="}]`)
contentHash := http.ContentHash(content)
req, err := http.NewAuthRequest("POST", "https://keys.pub/vault/"+key.ID().String(), bytes.NewReader(content), contentHash, time.Now(), key)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("curl -H \"Authorization: %s\" -d %q %q\n", req.Header["Authorization"][0], string(content), req.URL.String())

// Vault GET
req, err = http.NewAuthRequest("GET", "https://keys.pub/vault/"+key.ID().String(), nil, "", time.Now(), key)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("curl -H \"Authorization: %s\" %q\n", req.Header["Authorization"][0], req.URL.String())

Documentation

Overview

Package http provides an http client for use with checking remote signed statements.

Index

Examples

Constants

View Source
const (
	StatusContinue           = 100 // RFC 7231, 6.2.1
	StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2
	StatusProcessing         = 102 // RFC 2518, 10.1
	StatusEarlyHints         = 103 // RFC 8297

	StatusOK                   = 200 // RFC 7231, 6.3.1
	StatusCreated              = 201 // RFC 7231, 6.3.2
	StatusAccepted             = 202 // RFC 7231, 6.3.3
	StatusNonAuthoritativeInfo = 203 // RFC 7231, 6.3.4
	StatusNoContent            = 204 // RFC 7231, 6.3.5
	StatusResetContent         = 205 // RFC 7231, 6.3.6
	StatusPartialContent       = 206 // RFC 7233, 4.1
	StatusMultiStatus          = 207 // RFC 4918, 11.1
	StatusAlreadyReported      = 208 // RFC 5842, 7.1
	StatusIMUsed               = 226 // RFC 3229, 10.4.1

	StatusMultipleChoices  = 300 // RFC 7231, 6.4.1
	StatusMovedPermanently = 301 // RFC 7231, 6.4.2
	StatusFound            = 302 // RFC 7231, 6.4.3
	StatusSeeOther         = 303 // RFC 7231, 6.4.4
	StatusNotModified      = 304 // RFC 7232, 4.1
	StatusUseProxy         = 305 // RFC 7231, 6.4.5

	StatusTemporaryRedirect = 307 // RFC 7231, 6.4.7
	StatusPermanentRedirect = 308 // RFC 7538, 3

	StatusBadRequest                   = 400 // RFC 7231, 6.5.1
	StatusUnauthorized                 = 401 // RFC 7235, 3.1
	StatusPaymentRequired              = 402 // RFC 7231, 6.5.2
	StatusForbidden                    = 403 // RFC 7231, 6.5.3
	StatusNotFound                     = 404 // RFC 7231, 6.5.4
	StatusMethodNotAllowed             = 405 // RFC 7231, 6.5.5
	StatusNotAcceptable                = 406 // RFC 7231, 6.5.6
	StatusProxyAuthRequired            = 407 // RFC 7235, 3.2
	StatusRequestTimeout               = 408 // RFC 7231, 6.5.7
	StatusConflict                     = 409 // RFC 7231, 6.5.8
	StatusGone                         = 410 // RFC 7231, 6.5.9
	StatusLengthRequired               = 411 // RFC 7231, 6.5.10
	StatusPreconditionFailed           = 412 // RFC 7232, 4.2
	StatusRequestEntityTooLarge        = 413 // RFC 7231, 6.5.11
	StatusRequestURITooLong            = 414 // RFC 7231, 6.5.12
	StatusUnsupportedMediaType         = 415 // RFC 7231, 6.5.13
	StatusRequestedRangeNotSatisfiable = 416 // RFC 7233, 4.4
	StatusExpectationFailed            = 417 // RFC 7231, 6.5.14
	StatusTeapot                       = 418 // RFC 7168, 2.3.3
	StatusMisdirectedRequest           = 421 // RFC 7540, 9.1.2
	StatusUnprocessableEntity          = 422 // RFC 4918, 11.2
	StatusLocked                       = 423 // RFC 4918, 11.3
	StatusFailedDependency             = 424 // RFC 4918, 11.4
	StatusTooEarly                     = 425 // RFC 8470, 5.2.
	StatusUpgradeRequired              = 426 // RFC 7231, 6.5.15
	StatusPreconditionRequired         = 428 // RFC 6585, 3
	StatusTooManyRequests              = 429 // RFC 6585, 4
	StatusRequestHeaderFieldsTooLarge  = 431 // RFC 6585, 5
	StatusUnavailableForLegalReasons   = 451 // RFC 7725, 3

	StatusInternalServerError           = 500 // RFC 7231, 6.6.1
	StatusNotImplemented                = 501 // RFC 7231, 6.6.2
	StatusBadGateway                    = 502 // RFC 7231, 6.6.3
	StatusServiceUnavailable            = 503 // RFC 7231, 6.6.4
	StatusGatewayTimeout                = 504 // RFC 7231, 6.6.5
	StatusHTTPVersionNotSupported       = 505 // RFC 7231, 6.6.6
	StatusVariantAlsoNegotiates         = 506 // RFC 2295, 8.1
	StatusInsufficientStorage           = 507 // RFC 4918, 11.5
	StatusLoopDetected                  = 508 // RFC 5842, 7.2
	StatusNotExtended                   = 510 // RFC 2774, 7
	StatusNetworkAuthenticationRequired = 511 // RFC 6585, 6
)

HTTP status codes as registered with IANA. See: https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

View Source
const TimeFormat = http.TimeFormat

TimeFormat alias

Variables

View Source
var NewRequest = http.NewRequest

NewRequest alias.

View Source
var NewRequestWithContext = http.NewRequestWithContext

NewRequestWithContext alias.

View Source
var NotFound = http.NotFound

NotFound alias

View Source
var Redirect = http.Redirect

Redirect alias

View Source
var SetCookie = http.SetCookie

SetCookie alias

Functions

func ContentHash

func ContentHash(b []byte) string

ContentHash returns base64 encoded sha256 hash.

func JSON added in v0.1.20

func JSON(req *Request, v interface{}) error

JSON request.

func NewAuthRequest

func NewAuthRequest(method string, urs string, body io.Reader, contentHash string, ts time.Time, key *keys.EdX25519Key) (*http.Request, error)

NewAuthRequest returns new authorized/signed HTTP request using auth key.

Example
package main

import (
	"bytes"
	"log"
	"time"

	"github.com/keys-pub/keys"
	"github.com/keys-pub/keys/http"
)

func main() {
	key := keys.GenerateEdX25519Key()

	// Vault POST
	content := []byte(`[{"data":"dGVzdGluZzE="},{"data":"dGVzdGluZzI="}]`)
	contentHash := http.ContentHash(content)
	req, err := http.NewAuthRequest("POST", "https://keys.pub/vault/"+key.ID().String(), bytes.NewReader(content), contentHash, time.Now(), key)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("curl -H \"Authorization: %s\" -d %q %q\n", req.Header["Authorization"][0], string(content), req.URL.String())

	// Vault GET
	req, err = http.NewAuthRequest("GET", "https://keys.pub/vault/"+key.ID().String(), nil, "", time.Now(), key)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("curl -H \"Authorization: %s\" %q\n", req.Header["Authorization"][0], req.URL.String())

}
Output:

func NewAuthsRequest added in v0.1.22

func NewAuthsRequest(method string, urs string, body io.Reader, contentHash string, ts time.Time, auths []AuthHeader) (*http.Request, error)

func NewJSONRequest added in v0.1.20

func NewJSONRequest(method string, urs string, i interface{}, opt ...RequestOption) (*http.Request, error)

NewJSONRequest ...

func SetLogger added in v0.1.18

func SetLogger(l Logger)

SetLogger sets logger for the package.

Types

type Auth

type Auth struct {
	KID         keys.ID
	Method      string
	URL         *url.URL
	Sig         string
	BytesToSign string
}

Auth describes auth for an HTTP request.

func NewAuth

func NewAuth(method string, urs string, contentHash string, tm time.Time, key *keys.EdX25519Key) (*Auth, error)

NewAuth returns auth for an HTTP request. The url shouldn't have ? or &.

func (Auth) Header

func (a Auth) Header() string

Header is header value.

type AuthHeader added in v0.1.22

type AuthHeader struct {
	Header string
	Key    *keys.EdX25519Key
}

type AuthRequest added in v0.1.18

type AuthRequest struct {
	Method      string
	URL         string
	ContentHash string

	KID  keys.ID
	Auth string

	Now        time.Time
	NonceCheck NonceCheck
}

AuthRequest describes an auth request.

type AuthResult

type AuthResult struct {
	KID       keys.ID
	URL       *url.URL
	Nonce     string
	Timestamp time.Time
}

AuthResult is the result of an auth check.

func Authorize added in v0.1.18

func Authorize(ctx context.Context, auth *AuthRequest) (*AuthResult, error)

Authorize checks request authorization. Nonce check should fail if there is a collision across different requests.

type Client

type Client interface {
	Request(ctx context.Context, req *Request) ([]byte, error)
	SetProxy(urs string, fn ProxyFn)
}

Client for HTTP.

func NewClient added in v0.1.18

func NewClient(opt ...ClientOption) Client

NewClient creates a Requestor for HTTP URLs.

type ClientOption added in v0.1.21

type ClientOption func(*clientOptions)

ClientOption ...

func WithHTTPClient added in v0.1.21

func WithHTTPClient(httpClient *http.Client) ClientOption

WithHTTPClient to override http.Client.

type ContextLogger added in v0.1.18

type ContextLogger interface {
	Debugf(ctx context.Context, format string, args ...interface{})
	Infof(ctx context.Context, format string, args ...interface{})
	Warningf(ctx context.Context, format string, args ...interface{})
	Errorf(ctx context.Context, format string, args ...interface{})
}

ContextLogger interface used in this package with request context.

func NewContextLogger added in v0.1.18

func NewContextLogger(lev LogLevel) ContextLogger

NewContextLogger ...

type Cookie = http.Cookie

Cookie alias

type Err added in v0.1.20

type Err struct {
	Code    int
	Message string
}

Err is an HTTP Error.

func (Err) Error added in v0.1.20

func (e Err) Error() string

type ErrTemporary added in v0.1.18

type ErrTemporary struct {
	// contains filtered or unexported fields
}

ErrTemporary means there was a temporary error

func NewErrTemporary added in v0.1.18

func NewErrTemporary(msg string) ErrTemporary

NewErrTemporary creates temporary error.

func (ErrTemporary) Error added in v0.1.18

func (e ErrTemporary) Error() string

func (ErrTemporary) Temporary added in v0.1.18

func (e ErrTemporary) Temporary() bool

Temporary returns true.

type ErrTimeout added in v0.1.18

type ErrTimeout struct {
	// contains filtered or unexported fields
}

ErrTimeout is a timeout error.

type Handler

type Handler = http.Handler

Handler alias

type Header struct {
	Name  string
	Value string
}

Header for request.

type LogLevel added in v0.1.18

type LogLevel int

LogLevel ...

const (
	// DebugLevel ...
	DebugLevel LogLevel = 3
	// InfoLevel ...
	InfoLevel LogLevel = 2
	// WarnLevel ...
	WarnLevel LogLevel = 1
	// ErrLevel ...
	ErrLevel LogLevel = 0
)

func (LogLevel) String added in v0.1.18

func (l LogLevel) String() string

type Logger added in v0.1.18

type Logger interface {
	Debugf(format string, args ...interface{})
	Infof(format string, args ...interface{})
	Warningf(format string, args ...interface{})
	Errorf(format string, args ...interface{})
	Fatalf(format string, args ...interface{})
}

Logger interface used in this package.

func NewLogger added in v0.1.18

func NewLogger(lev LogLevel) Logger

NewLogger ...

type Mem added in v0.1.18

type Mem struct {
	sync.Mutex
	// contains filtered or unexported fields
}

Mem is a in memory key value store.

func NewMem added in v0.1.18

func NewMem(clock tsutil.Clock) *Mem

NewMem creates a Mem key value store.

func (*Mem) Delete added in v0.1.18

func (m *Mem) Delete(ctx context.Context, k string) error

Delete ..

func (*Mem) Expire added in v0.1.18

func (m *Mem) Expire(ctx context.Context, k string, dt time.Duration) error

Expire ...

func (*Mem) Get added in v0.1.18

func (m *Mem) Get(ctx context.Context, k string) (string, error)

Get ...

func (*Mem) Increment added in v0.1.18

func (m *Mem) Increment(ctx context.Context, k string) (int64, error)

Increment ...

func (*Mem) NonceCheck added in v0.1.18

func (m *Mem) NonceCheck(ctx context.Context, nonce string) error

NonceCheck ...

func (*Mem) Set added in v0.1.18

func (m *Mem) Set(ctx context.Context, k string, v string) error

Set ...

type NonceCheck added in v0.1.18

type NonceCheck func(ctx context.Context, nonce string) error

NonceCheck checks for nonce.

type ProxyFn added in v0.1.18

type ProxyFn func(ctx context.Context, req *Request) ProxyResponse

ProxyFn for proxy.

type ProxyResponse added in v0.1.18

type ProxyResponse struct {
	Skip bool
	Body []byte
	Err  error
}

ProxyResponse ...

type Request

type Request = http.Request

Request alias

type RequestOption added in v0.1.20

type RequestOption func(*RequestOptions)

RequestOption ...

func SignedWith added in v0.1.20

func SignedWith(key *keys.EdX25519Key) RequestOption

SignedWith key.

func WithTimestamp added in v0.1.20

func WithTimestamp(ts time.Time) RequestOption

WithTimestamp to overwride timestamp.

type RequestOptions added in v0.1.20

type RequestOptions struct {
	Timestamp time.Time
	Key       *keys.EdX25519Key
}

RequestOptions ...

func NewRequestOptions added in v0.1.20

func NewRequestOptions(opts ...RequestOption) RequestOptions

NewRequestOptions parses RequestOption.

type Response

type Response = http.Response

Response alias

type ResponseWriter

type ResponseWriter = http.ResponseWriter

ResponseWriter alias

type Transport

type Transport = http.Transport

Transport alias

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL