ghttp

package
v1.5.2 Latest Latest
Warning

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

Go to latest
Published: Aug 27, 2023 License: MIT Imports: 9 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// 和 GET 一樣,只是 HEAD 只會讀取 HTTP Header 的資料。
	MethodHead = "HEAD"
	// 讀取資料
	MethodGet = "GET"
	// 新增一項資料。(如果存在會新增一個新的)
	MethodPost = "POST"
	// 新增一項資料,如果存在就覆蓋過去(還是只有一筆資料)。因為是直接覆蓋,因此資料必須是完整的。
	// 如果沒有傳,則會被更新為空值。
	MethodPut = "PUT"
	// 附加新的資料在已經存在的資料後面(資料必須已經存在,PATCH 會擴充/更新這項資料)。
	// 類似 PUT 方法,但沒有資料的欄位則不會更新,可以更新結構中的一部份。
	MethodPatch = "PATCH"
	// 刪除資料。
	MethodDelete = "DELETE"
	// 返回伺服器支援的方法。
	MethodOptions = "OPTIONS"
	COLON         = ":"
	// ==================================================
	// CORS
	// ==================================================
	HeaderOrigin            = "Origin"
	HeaderCorsOrigin        = "Access-Control-Allow-Origin"
	HeaderCorsMaxAge        = "Access-Control-Max-Age"
	HeaderCorsMethods       = "Access-Control-Allow-Methods"
	HeaderCorsCredentials   = "Access-Control-Allow-Credentials"
	HeaderCorsAllowHeaders  = "Access-Control-Allow-Headers"
	HeaderCorsExposeHeaders = "Access-Control-Expose-Headers"
	// Header Name
	HeaderAccept          = "Accept"
	HeaderAcceptLanguage  = "Accept-Language"
	HeaderAcceptEncoding  = "Accept-Encoding"
	HeaderContentLanguage = "Content-Language"
	HeaderContentType     = "Content-Type"
	HeaderCacheControl    = "Cache-Control"
	HeaderDPR             = "DPR"
	HeaderDownlink        = "Downlink"
	HeaderExpires         = "Expires"
	HeaderLastModified    = "Last-Modified"
	HeaderPragma          = "Pragma"
	HeaderSaveData        = "Save-Data"
	HeaderViewportWidth   = "Viewport-Width"
	HeaderWidth           = "Width"
	HeaderHost            = "Host"
	HeaderContentLength   = "Content-Length"
	HeaderUserAgent       = "User-Agent"
)
View Source
const (
	StatusContinue           = 100 // RFC 9110, 15.2.1
	StatusSwitchingProtocols = 101 // RFC 9110, 15.2.2
	StatusProcessing         = 102 // RFC 2518, 10.1
	StatusEarlyHints         = 103 // RFC 8297

	StatusOK                   = 200 // RFC 9110, 15.3.1
	StatusCreated              = 201 // RFC 9110, 15.3.2
	StatusAccepted             = 202 // RFC 9110, 15.3.3
	StatusNonAuthoritativeInfo = 203 // RFC 9110, 15.3.4
	StatusNoContent            = 204 // RFC 9110, 15.3.5
	StatusResetContent         = 205 // RFC 9110, 15.3.6
	StatusPartialContent       = 206 // RFC 9110, 15.3.7
	StatusMultiStatus          = 207 // RFC 4918, 11.1
	StatusAlreadyReported      = 208 // RFC 5842, 7.1
	StatusIMUsed               = 226 // RFC 3229, 10.4.1

	StatusMultipleChoices  = 300 // RFC 9110, 15.4.1
	StatusMovedPermanently = 301 // RFC 9110, 15.4.2
	StatusFound            = 302 // RFC 9110, 15.4.3
	StatusSeeOther         = 303 // RFC 9110, 15.4.4
	StatusNotModified      = 304 // RFC 9110, 15.4.5
	StatusUseProxy         = 305 // RFC 9110, 15.4.6

	StatusTemporaryRedirect = 307 // RFC 9110, 15.4.8
	StatusPermanentRedirect = 308 // RFC 9110, 15.4.9

	StatusBadRequest                   = 400 // RFC 9110, 15.5.1
	StatusUnauthorized                 = 401 // RFC 9110, 15.5.2
	StatusPaymentRequired              = 402 // RFC 9110, 15.5.3
	StatusForbidden                    = 403 // RFC 9110, 15.5.4
	StatusNotFound                     = 404 // RFC 9110, 15.5.5
	StatusMethodNotAllowed             = 405 // RFC 9110, 15.5.6
	StatusNotAcceptable                = 406 // RFC 9110, 15.5.7
	StatusProxyAuthRequired            = 407 // RFC 9110, 15.5.8
	StatusRequestTimeout               = 408 // RFC 9110, 15.5.9
	StatusConflict                     = 409 // RFC 9110, 15.5.10
	StatusGone                         = 410 // RFC 9110, 15.5.11
	StatusLengthRequired               = 411 // RFC 9110, 15.5.12
	StatusPreconditionFailed           = 412 // RFC 9110, 15.5.13
	StatusRequestEntityTooLarge        = 413 // RFC 9110, 15.5.14
	StatusRequestURITooLong            = 414 // RFC 9110, 15.5.15
	StatusUnsupportedMediaType         = 415 // RFC 9110, 15.5.16
	StatusRequestedRangeNotSatisfiable = 416 // RFC 9110, 15.5.17
	StatusExpectationFailed            = 417 // RFC 9110, 15.5.18
	StatusTeapot                       = 418 // RFC 9110, 15.5.19 (Unused)
	StatusMisdirectedRequest           = 421 // RFC 9110, 15.5.20
	StatusUnprocessableEntity          = 422 // RFC 9110, 15.5.21
	StatusLocked                       = 423 // RFC 4918, 11.3
	StatusFailedDependency             = 424 // RFC 4918, 11.4
	StatusTooEarly                     = 425 // RFC 8470, 5.2.
	StatusUpgradeRequired              = 426 // RFC 9110, 15.5.22
	StatusPreconditionRequired         = 428 // RFC 6585, 3
	StatusTooManyRequests              = 429 // RFC 6585, 4
	StatusRequestHeaderFieldsTooLarge  = 431 // RFC 6585, 5
	StatusUnavailableForLegalReasons   = 451 // RFC 7725, 3

	StatusInternalServerError           = 500 // RFC 9110, 15.6.1
	StatusNotImplemented                = 501 // RFC 9110, 15.6.2
	StatusBadGateway                    = 502 // RFC 9110, 15.6.3
	StatusServiceUnavailable            = 503 // RFC 9110, 15.6.4
	StatusGatewayTimeout                = 504 // RFC 9110, 15.6.5
	StatusHTTPVersionNotSupported       = 505 // RFC 9110, 15.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

Variables

This section is empty.

Functions

func CapitalString added in v1.5.2

func CapitalString(input string) string

func CheckWriteHeaderCode

func CheckWriteHeaderCode(code int)

func StatusText

func StatusText(code int32) string

StatusText returns a text for the HTTP status code. It returns the empty string if the code is unknown.

Types

type Context

type Context struct {

	// 對應 連線結構 的 id
	Cid int32
	// 對應 工作結構 的 id
	Wid int32
	// 工作流程當前階段
	State ContextState
	*Request
	*Response
	// contains filtered or unexported fields
}

Request 和 Response 的 Header 應該分開來,因為端點函式中既會讀取 Request 的 Header,也會寫出 Response 的 Header。 透過不同函式來讀寫即可,記得保留 Context 送出 Request 的能力。

func NewContext

func NewContext(id int32) *Context

func (*Context) GetId added in v1.1.0

func (c *Context) GetId() int32

func (*Context) Json

func (c *Context) Json(code int32, obj any)

func (Context) ReadBytes added in v1.2.3

func (c Context) ReadBytes() []byte

func (Context) ReadJson added in v1.2.3

func (c Context) ReadJson(obj any) (string, error)

func (*Context) Release added in v1.5.0

func (c *Context) Release()

type ContextState added in v1.5.0

type ContextState int8
const (
	// 讀取第一行
	READ_FIRST_LINE ContextState = iota
	// 讀取 Header
	READ_HEADER
	// 讀取 Data
	READ_BODY
	// 等待數據寫出(Response)
	WRITE_RESPONSE
	// 完成數據複製到寫出緩存
	FINISH_RESPONSE
)

HTTP 工作流程按照下方順序執行

func (ContextState) String added in v1.5.0

func (cs ContextState) String() string

type H

type H map[string]any

type HandlerFunc

type HandlerFunc func(*Context)

工作完成時的 Callback 函式

type Header map[string][]string

type MIMEHeader

type MIMEHeader map[string][]string

A MIMEHeader represents a MIME-style header mapping keys to sets of values.

type Request

type Request struct {
	// ex: GET
	Method string
	// ex: /user/get
	Query string
	// ex: HTTP/1.1
	Proto  string
	Params map[string]string
	Values map[string]any

	Header

	// 讀取長度
	ReadLength int32

	// Body 數據
	// NOTE: Body 和 BodyLength 之後將改為私有變數,要存取的話需透過函式來操作。
	Body       []byte
	BodyLength int32
}

==================================================================================================== Request ====================================================================================================

func NewRequest

func NewRequest(method string, uri string, params map[string]string) (*Request, error)

func (*Request) FormRequest

func (r *Request) FormRequest(method string, uri string, params map[string]string)

func (Request) GetParam

func (r Request) GetParam(key string) (bool, string)

func (Request) GetValue added in v1.3.0

func (r Request) GetValue(key string) any

func (*Request) HasEnoughData

func (r *Request) HasEnoughData(buffer *[]byte, i int32, o int32, length int32) bool

func (*Request) HasLineData

func (r *Request) HasLineData(buffer *[]byte, i int32, o int32, length int32) bool

檢查是否有一行數據(以換行符 '\n' 來區分)

func (*Request) Json

func (r *Request) Json(obj any)

func (*Request) ParseFirstReqLine

func (r *Request) ParseFirstReqLine(line string) bool

解析第一行數據 parseRequestLine parses "GET /foo HTTP/1.1" into its three parts.

func (*Request) ParseParams

func (r *Request) ParseParams(params string) error

解析第一行數據中的請求路徑中的 GET 參數

func (*Request) ParseQuery

func (r *Request) ParseQuery() (bool, error)

解析第一行數據中的請求路徑

func (*Request) Release

func (r *Request) Release()

func (*Request) SetBody added in v1.5.0

func (r *Request) SetBody(data []byte, length int32)

供 Request 設置 Body 數據

func (*Request) SetContentLength added in v1.5.0

func (r *Request) SetContentLength()

協助設置標頭檔的 Content-Length

func (Request) ToRequestData

func (r Request) ToRequestData() []byte

type Response

type Response struct {
	Code    int32
	Message string
	Proto   string

	Header

	// 讀取長度
	ReadLength int32

	// Body 數據
	// NOTE: Body 和 BodyLength 之後將改為私有變數,要存取的話需透過函式來操作。
	Body       []byte
	BodyLength int32
}

==================================================================================================== Response ====================================================================================================

func (*Response) GetHeader added in v1.5.1

func (r *Response) GetHeader(key string) ([]string, bool)

func (*Response) Json

func (r *Response) Json(code int32, obj any)

func (*Response) ParseFirstResLine

func (r *Response) ParseFirstResLine(line string) bool

解析第一行數據 parseRequestLine parses "HTTP/1.1 200 OK" into its three parts.

func (*Response) Release added in v1.5.0

func (r *Response) Release()

func (*Response) SetBody added in v1.5.0

func (r *Response) SetBody(data []byte, length int32)

供 Request 設置 Body 數據

func (*Response) SetContentLength added in v1.5.0

func (r *Response) SetContentLength()

func (*Response) SetHeader added in v1.5.0

func (r *Response) SetHeader(key string, value string)

func (*Response) Status

func (r *Response) Status(code int32)

Status sets the HTTP response code.

func (Response) ToResponseData

func (r Response) ToResponseData() []byte

生成 Response message

Jump to

Keyboard shortcuts

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