httpapi

package
v2.10.2 Latest Latest
Warning

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

Go to latest
Published: Apr 22, 2024 License: AGPL-3.0 Imports: 24 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// XForwardedHostHeader is a header used by proxies to indicate the
	// original host of the request.
	XForwardedHostHeader = "X-Forwarded-Host"
)

Variables

View Source
var ResourceNotFoundResponse = codersdk.Response{Message: "Resource not found or you do not have access to this resource"}
View Source
var (
	UsernameValidRegex = regexp.MustCompile("^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$")
)
View Source
var Validate *validator.Validate

Functions

func Forbidden

func Forbidden(rw http.ResponseWriter)

func Heartbeat

func Heartbeat(ctx context.Context, conn *websocket.Conn)

Heartbeat loops to ping a WebSocket to keep it alive. Default idle connection timeouts are typically 60 seconds. See: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#connection-idle-timeout

func HeartbeatClose

func HeartbeatClose(ctx context.Context, logger slog.Logger, exit func(), conn *websocket.Conn)

Heartbeat loops to ping a WebSocket to keep it alive. It calls `exit` on ping failure.

func InternalServerError

func InternalServerError(rw http.ResponseWriter, err error)

func Is404Error

func Is404Error(err error) bool

Is404Error returns true if the given error should return a 404 status code. Both actual 404s and unauthorized errors should return 404s to not leak information about the existence of resources.

func IsWebsocketUpgrade

func IsWebsocketUpgrade(r *http.Request) bool

func NameValid

func NameValid(str string) error

NameValid returns whether the input string is a valid name. It is a generic validator for any name (user, workspace, template, etc.).

func ParseCustom

func ParseCustom[T any](parser *QueryParamParser, vals url.Values, def T, queryParam string, parseFunc func(v string) (T, error)) T

ParseCustom has to be a function, not a method on QueryParamParser because generics cannot be used on struct methods.

func ParseCustomList

func ParseCustomList[T any](parser *QueryParamParser, vals url.Values, def []T, queryParam string, parseFunc func(v string) (T, error)) []T

ParseCustomList is a function that handles csv query params or multiple values for a query param. Csv is supported as it is a common way to pass multiple values in a query param. Multiple values is supported (key=value&key=value2) for feature parity with GitHub issue search.

func ParseEnum

func ParseEnum[T ValidEnum](term string) (T, error)

ParseEnum is a function that can be passed into ParseCustom that handles enum validation.

func Read

func Read(ctx context.Context, rw http.ResponseWriter, r *http.Request, value interface{}) bool

Read decodes JSON from the HTTP request into the value provided. It uses go-validator to validate the incoming request body. ctx is used for tracing and can be nil. Although tracing this function isn't likely too helpful, it was done to be consistent with Write.

func RequestHost

func RequestHost(r *http.Request) string

RequestHost returns the name of the host from the request. It prioritizes 'X-Forwarded-Host' over r.Host since most requests are being proxied.

func ResourceNotFound

func ResourceNotFound(rw http.ResponseWriter)

ResourceNotFound is intentionally vague. All 404 responses should be identical to prevent leaking existence of resources.

func RouteNotFound

func RouteNotFound(rw http.ResponseWriter)

func ServerSentEventSender

func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (sendEvent func(ctx context.Context, sse codersdk.ServerSentEvent) error, closed chan struct{}, err error)

func StripCoderCookies

func StripCoderCookies(header string) string

StripCoderCookies removes the session token from the cookie header provided.

func TemplateDisplayNameValid

func TemplateDisplayNameValid(str string) error

TemplateDisplayNameValid returns whether the input string is a valid template display name.

func TemplateVersionNameValid

func TemplateVersionNameValid(str string) error

TemplateVersionNameValid returns whether the input string is a valid template version name.

func UserRealNameValid added in v2.7.0

func UserRealNameValid(str string) error

UserRealNameValid returns whether the input string is a valid real user name.

func UsernameFrom

func UsernameFrom(str string) string

UsernameFrom returns a best-effort username from the provided string.

It first attempts to validate the incoming string, which will be returned if it is valid. It then will attempt to extract the username from an email address. If no success happens during these steps, a random username will be returned.

func WebsocketCloseSprintf

func WebsocketCloseSprintf(format string, vars ...any) string

WebsocketCloseSprintf formats a websocket close message and ensures it is truncated to the maximum allowed length.

func Write

func Write(ctx context.Context, rw http.ResponseWriter, status int, response interface{})

Write outputs a standardized format to an HTTP response body. ctx is used for tracing and can be nil for tracing to be disabled. Tracing this function is helpful because JSON marshaling can sometimes take a non-insignificant amount of time, and could help us catch outliers. Additionally, we can enrich span data a bit more since we have access to the actual interface{} we're marshaling, such as the number of elements in an array, which could help us spot routes that need to be paginated.

func WriteIndent

func WriteIndent(ctx context.Context, rw http.ResponseWriter, status int, response interface{})

Types

type Duration

type Duration time.Duration

Duration wraps time.Duration and provides better JSON marshaling and unmarshalling. The default time.Duration marshals as an integer and only accepts integers when unmarshalling, which is not very user friendly as users cannot write durations like "1h30m".

This type marshals as a string like "1h30m", and unmarshals from either a string or an integer.

func (Duration) MarshalJSON

func (d Duration) MarshalJSON() ([]byte, error)

MarshalJSON implements json.Marshaler.

func (*Duration) UnmarshalJSON

func (d *Duration) UnmarshalJSON(b []byte) error

UnmarshalJSON implements json.Unmarshaler.

type QueryParamParser

type QueryParamParser struct {
	// Errors is the set of errors to return via the API. If the length
	// of this set is 0, there are no errors!.
	Errors []codersdk.ValidationError
	// Parsed is a map of all query params that were parsed. This is useful
	// for checking if extra query params were passed in.
	Parsed map[string]bool
	// RequiredNotEmptyParams is a map of all query params that are required. This is useful
	// for forcing a value to be provided.
	RequiredNotEmptyParams map[string]bool
}

QueryParamParser is a helper for parsing all query params and gathering all errors in 1 sweep. This means all invalid fields are returned at once, rather than only returning the first error

func NewQueryParamParser

func NewQueryParamParser() *QueryParamParser

func (*QueryParamParser) Boolean added in v2.3.0

func (p *QueryParamParser) Boolean(vals url.Values, def bool, queryParam string) bool

func (*QueryParamParser) ErrorExcessParams

func (p *QueryParamParser) ErrorExcessParams(values url.Values)

ErrorExcessParams checks if any query params were passed in that were not parsed. If so, it adds an error to the parser as these values are not valid query parameters.

func (*QueryParamParser) Int

func (p *QueryParamParser) Int(vals url.Values, def int, queryParam string) int

func (*QueryParamParser) PositiveInt32 added in v2.9.0

func (p *QueryParamParser) PositiveInt32(vals url.Values, def int32, queryParam string) int32

PositiveInt32 function checks if the given value is 32-bit and positive.

We can't use `uint32` as the value must be within the range <0,2147483647> as database expects it. Otherwise, the database query fails with `pq: OFFSET must not be negative`.

func (*QueryParamParser) RedirectURL added in v2.9.0

func (p *QueryParamParser) RedirectURL(vals url.Values, base *url.URL, queryParam string) *url.URL

func (*QueryParamParser) RequiredNotEmpty added in v2.9.0

func (p *QueryParamParser) RequiredNotEmpty(queryParam ...string) *QueryParamParser

func (*QueryParamParser) String

func (p *QueryParamParser) String(vals url.Values, def string, queryParam string) string

func (*QueryParamParser) Strings

func (p *QueryParamParser) Strings(vals url.Values, def []string, queryParam string) []string

func (*QueryParamParser) Time

func (p *QueryParamParser) Time(vals url.Values, def time.Time, queryParam, layout string) time.Time

func (*QueryParamParser) Time3339Nano

func (p *QueryParamParser) Time3339Nano(vals url.Values, def time.Time, queryParam string) time.Time

Time uses the default time format of RFC3339Nano and always returns a UTC time.

func (*QueryParamParser) UInt

func (p *QueryParamParser) UInt(vals url.Values, def uint64, queryParam string) uint64

func (*QueryParamParser) UUID

func (p *QueryParamParser) UUID(vals url.Values, def uuid.UUID, queryParam string) uuid.UUID

func (*QueryParamParser) UUIDorMe

func (p *QueryParamParser) UUIDorMe(vals url.Values, def uuid.UUID, me uuid.UUID, queryParam string) uuid.UUID

func (*QueryParamParser) UUIDs

func (p *QueryParamParser) UUIDs(vals url.Values, def []uuid.UUID, queryParam string) []uuid.UUID

type ValidEnum

type ValidEnum interface {
	~string

	// Valid is required on the enum type to be used with ParseEnum.
	Valid() bool
}

ValidEnum represents an enum that can be parsed and validated.

Directories

Path Synopsis
Package httpapiconstraints contain types that can be used and implemented across the application to return specific HTTP status codes without pulling in large dependency trees.
Package httpapiconstraints contain types that can be used and implemented across the application to return specific HTTP status codes without pulling in large dependency trees.

Jump to

Keyboard shortcuts

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