http

package
v1.3.0 Latest Latest
Warning

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

Go to latest
Published: Nov 27, 2022 License: MIT Imports: 15 Imported by: 1

Documentation

Overview

Package http defines category of HTTP I/O, "do"-notation becomes

http.Join(
  ø...,
  ø...,

  ƒ...,
  ƒ...,
)

Symbol `ø` (option + o) is an convenient alias to module gurl/http/send, which defines writer morphism that focuses inside and reshapes HTTP protocol request. The writer morphism is used to declare HTTP method, destination URL, request headers and payload.

Symbol `ƒ` (option + f) is an convenient alias to module gurl/http/recv, which defines reader morphism that focuses into side-effect, HTTP protocol response. The reader morphism is a pattern matcher, is used to match HTTP response code, headers and response payload. It helps us to declare our expectations on the response. The evaluation of "program" fails if expectations do not match actual response.

Let's look on step-by-step usage of the category.

**Method and URL** are mandatory. It has to be a first element in the construction.

http.Join(
  ø.GET("http://example.com"),
  ...
)

Definition of **request headers** is an optional. You can list as many headers as needed. Either using string literals or variables. Some frequently used headers implements aliases (e.g. ø.ContentJSON(), ...)

http.Join(
  ...
  ø.Header("Accept").Is("application/json"),
  ø.Header("Authorization").Val(&token),
  ...
)

The **request payload** is also an optional. You can also use native Golang data types as egress payload. The library implicitly encodes input structures to binary using Content-Type as a hint.

http.Join(
  ...
  ø.Send(MyType{Hello: "World"}),
  ...
)

The declaration of expected response is always starts with mandatory HTTP **status code**. The execution fails if peer responds with other than specified value.

http.Join(
  ...
  ƒ.Code(http.StatusCodeOK),
  ...
)

It is possible to match presence of header in the response, match its entire content or lift the header value to a variable. The execution fails if HTTP response do not match the expectation.

http.Join(
  ...
  ƒ.Header("Content-Type").Is("application/json"),
  ...
)

The library is able to **decode payload** into Golang native data structure using Content-Type header as a hint.

var data MyType
http.Join(
  ...
  ƒ.Recv(&data)
  ...
)

Please note, the library implements lenses to inline assert of decoded content. See the documentation of gurl/http/recv module.

Index

Constants

View Source
const (
	//
	StatusContinue           = StatusCode(http.StatusContinue)
	StatusSwitchingProtocols = StatusCode(http.StatusSwitchingProtocols)
	StatusProcessing         = StatusCode(http.StatusProcessing)
	StatusEarlyHints         = StatusCode(http.StatusEarlyHints)

	//
	StatusOK                   = StatusCode(http.StatusOK)
	StatusCreated              = StatusCode(http.StatusCreated)
	StatusAccepted             = StatusCode(http.StatusAccepted)
	StatusNonAuthoritativeInfo = StatusCode(http.StatusNonAuthoritativeInfo)
	StatusNoContent            = StatusCode(http.StatusNoContent)
	StatusResetContent         = StatusCode(http.StatusResetContent)
	StatusPartialContent       = StatusCode(http.StatusPartialContent)
	StatusMultiStatus          = StatusCode(http.StatusMultiStatus)
	StatusAlreadyReported      = StatusCode(http.StatusAlreadyReported)
	StatusIMUsed               = StatusCode(http.StatusIMUsed)

	//
	StatusMultipleChoices   = StatusCode(http.StatusMultipleChoices)
	StatusMovedPermanently  = StatusCode(http.StatusMovedPermanently)
	StatusFound             = StatusCode(http.StatusFound)
	StatusSeeOther          = StatusCode(http.StatusSeeOther)
	StatusNotModified       = StatusCode(http.StatusNotModified)
	StatusUseProxy          = StatusCode(http.StatusUseProxy)
	StatusTemporaryRedirect = StatusCode(http.StatusTemporaryRedirect)
	StatusPermanentRedirect = StatusCode(http.StatusPermanentRedirect)

	//
	StatusBadRequest                   = StatusCode(http.StatusBadRequest)
	StatusUnauthorized                 = StatusCode(http.StatusUnauthorized)
	StatusPaymentRequired              = StatusCode(http.StatusPaymentRequired)
	StatusForbidden                    = StatusCode(http.StatusForbidden)
	StatusNotFound                     = StatusCode(http.StatusNotFound)
	StatusMethodNotAllowed             = StatusCode(http.StatusMethodNotAllowed)
	StatusNotAcceptable                = StatusCode(http.StatusNotAcceptable)
	StatusProxyAuthRequired            = StatusCode(http.StatusProxyAuthRequired)
	StatusRequestTimeout               = StatusCode(http.StatusRequestTimeout)
	StatusConflict                     = StatusCode(http.StatusConflict)
	StatusGone                         = StatusCode(http.StatusGone)
	StatusLengthRequired               = StatusCode(http.StatusLengthRequired)
	StatusPreconditionFailed           = StatusCode(http.StatusPreconditionFailed)
	StatusRequestEntityTooLarge        = StatusCode(http.StatusRequestEntityTooLarge)
	StatusRequestURITooLong            = StatusCode(http.StatusRequestURITooLong)
	StatusUnsupportedMediaType         = StatusCode(http.StatusUnsupportedMediaType)
	StatusRequestedRangeNotSatisfiable = StatusCode(http.StatusRequestedRangeNotSatisfiable)
	StatusExpectationFailed            = StatusCode(http.StatusExpectationFailed)
	StatusTeapot                       = StatusCode(http.StatusTeapot)
	StatusMisdirectedRequest           = StatusCode(http.StatusMisdirectedRequest)
	StatusUnprocessableEntity          = StatusCode(http.StatusUnprocessableEntity)
	StatusLocked                       = StatusCode(http.StatusLocked)
	StatusFailedDependency             = StatusCode(http.StatusFailedDependency)
	StatusTooEarly                     = StatusCode(http.StatusTooEarly)
	StatusUpgradeRequired              = StatusCode(http.StatusUpgradeRequired)
	StatusPreconditionRequired         = StatusCode(http.StatusPreconditionRequired)
	StatusTooManyRequests              = StatusCode(http.StatusTooManyRequests)
	StatusRequestHeaderFieldsTooLarge  = StatusCode(http.StatusRequestHeaderFieldsTooLarge)
	StatusUnavailableForLegalReasons   = StatusCode(http.StatusUnavailableForLegalReasons)

	//
	StatusInternalServerError           = StatusCode(http.StatusInternalServerError)
	StatusNotImplemented                = StatusCode(http.StatusNotImplemented)
	StatusBadGateway                    = StatusCode(http.StatusBadGateway)
	StatusServiceUnavailable            = StatusCode(http.StatusServiceUnavailable)
	StatusGatewayTimeout                = StatusCode(http.StatusGatewayTimeout)
	StatusHTTPVersionNotSupported       = StatusCode(http.StatusHTTPVersionNotSupported)
	StatusVariantAlsoNegotiates         = StatusCode(http.StatusVariantAlsoNegotiates)
	StatusInsufficientStorage           = StatusCode(http.StatusInsufficientStorage)
	StatusLoopDetected                  = StatusCode(http.StatusLoopDetected)
	StatusNotExtended                   = StatusCode(http.StatusNotExtended)
	StatusNetworkAuthenticationRequired = StatusCode(http.StatusNetworkAuthenticationRequired)
)

Variables

This section is empty.

Functions

func Client added in v1.0.2

func Client() *http.Client

Client Default HTTP client

func IO added in v1.1.0

func IO[T any](ctx *Context, arrows ...Arrow) (*T, error)

IO executes protocol operations

func NewRequest added in v1.3.0

func NewRequest(method, url string) (*http.Request, error)

Types

type Arrow

type Arrow func(*Context) error

Arrow is a morphism applied to HTTP protocol stack

func Join

func Join(arrows ...Arrow) Arrow

Join composes HTTP arrows to high-order function (a ⟼ b, b ⟼ c, c ⟼ d) ⤇ a ⟼ d

type Config added in v1.0.2

type Config func(*Protocol)

Config for HTTP client

func CookieJar added in v1.0.2

func CookieJar() Config

CookieJar enables cookie handlings

func InsecureTLS added in v1.0.2

func InsecureTLS() Config

InsecureTLS disables certificates validation

func LogPayload added in v1.1.0

func LogPayload() Config

LogResponse enables debug logging for requests

func LogRequest added in v1.1.0

func LogRequest() Config

LogRequest enables debug logging for requests

func LogResponse added in v1.1.0

func LogResponse() Config

LogResponse enables debug logging for requests

func WithClient added in v1.1.0

func WithClient(client *http.Client) Config

WithClient replaces default client with custom instance

type Context added in v1.1.0

type Context struct {
	*Protocol

	// Context of Request / Response
	context.Context
	*http.Request
	*http.Response
}

Context defines the category of HTTP I/O

func (*Context) IO added in v1.1.0

func (ctx *Context) IO(arrows ...Arrow) error

IO executes protocol operations

func (*Context) Unsafe added in v1.1.0

func (ctx *Context) Unsafe() error

Unsafe evaluates current context of HTTP I/O

type Protocol added in v1.1.0

type Protocol struct {
	*http.Client
	LogLevel int
}

Protocol is an instance of Stack

func (*Protocol) IO added in v1.1.0

func (cat *Protocol) IO(ctx context.Context, arrows ...Arrow) error

IO executes protocol operations

func (*Protocol) WithContext added in v1.1.0

func (cat *Protocol) WithContext(ctx context.Context) *Context

WithContext create instance of I/O Context

type Stack

type Stack interface {
	WithContext(context.Context) *Context
	IO(context.Context, ...Arrow) error
}

Stack is HTTP protocol stack

func New added in v1.1.0

func New(opts ...Config) Stack

New instantiates category of HTTP I/O

type StatusCode

type StatusCode int

StatusCode is a base type for typesafe HTTP status codes. The library advertises a usage of "pattern-matching" on HTTP status handling, which helps developers to catch mismatch of HTTP statuses along with other side-effect failures.

The final values of HTTP statuses embeds StatusCode type. It makes them to look like a "sum-types" and be compatible with any other error (side effect failures) within IO category. Use final type instances in the error handling routines.

Use type switch for error handling "branches"

switch err := cat.Fail.(type) {
case nil:
  // Nothing
case StatusCode:
  switch err {
  case http.StatusOK:
    // HTTP 200 OK
  case http.StatusNotFound:
    // HTTP 404 NotFound
  default:
    // any other HTTP errors
  }
default:
  // any other errors
}

Conditional error handling on expected HTTP Status

if errors.Is(cat.Fail, http.StatusNotFound) {
}

Conditional error handling on any HTTP Status

if _, ok := cat.Fail.(gurl.StatusCode); ok {
}

func NewStatusCode

func NewStatusCode(code int, required ...StatusCode) StatusCode

NewStatusCode transforms integer codes to types

func (StatusCode) Error

func (e StatusCode) Error() string

Error makes StatusCode to be error

func (StatusCode) Is

func (e StatusCode) Is(err error) bool

Is compares wrapped errors

func (StatusCode) Required

func (e StatusCode) Required() int

Required returns (expected, required) HTTP status

func (StatusCode) Value

func (e StatusCode) Value() int

Value transforms StatusCode type to integer value: StatusCode ⟼ int

Directories

Path Synopsis
Package recv defines a pure computations to compose HTTP response receivers
Package recv defines a pure computations to compose HTTP response receivers
Package send defines a pure computations to compose HTTP request senders
Package send defines a pure computations to compose HTTP request senders

Jump to

Keyboard shortcuts

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