http

package
v0.1.18 Latest Latest
Warning

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

Go to latest
Published: Dec 21, 2020 License: MIT Imports: 17 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 NewAuthRequest

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

NewAuthRequest returns new authorized/signed HTTP request from keys.

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 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 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, headers []Header) ([]byte, error)
	SetProxy(urs string, fn ProxyFn)
}

Client for HTTP.

func NewClient added in v0.1.18

func NewClient() Client

NewClient creates a Requestor for HTTP URLs.

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 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 Error added in v0.1.18

type Error struct {
	StatusCode int
}

Error is an HTTP Error.

func (Error) Error added in v0.1.18

func (e Error) Error() string

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, headers []Header) 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 Response

type Response = http.Response

Response alias

type ResponseWriter

type ResponseWriter = http.ResponseWriter

ResponseWriter alias

type Transport

type Transport = http.Transport

Transport alias

Jump to

Keyboard shortcuts

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