mirror of
https://github.com/telanflow/mps.git
synced 2025-10-08 09:40:05 +08:00
101 lines
2.3 KiB
Go
101 lines
2.3 KiB
Go
package mps
|
|
|
|
import (
|
|
"context"
|
|
"crypto/tls"
|
|
"net/http"
|
|
)
|
|
|
|
type Context struct {
|
|
Context context.Context
|
|
Request *http.Request
|
|
Response *http.Response
|
|
Transport *http.Transport
|
|
|
|
// In some cases it is not always necessary to remove the Proxy Header.
|
|
// For example, cascade proxy
|
|
KeepHeader bool
|
|
|
|
// KeepDestinationHeaders indicates the proxy should retain any headers
|
|
// present in the http.Response before proxying
|
|
KeepDestinationHeaders bool
|
|
|
|
// requests Middleware
|
|
mi int
|
|
middlewares []Middleware
|
|
}
|
|
|
|
func NewContext() *Context {
|
|
return &Context{
|
|
Context: context.Background(),
|
|
Transport: &http.Transport{
|
|
//DialContext: (&net.Dialer{
|
|
// Timeout: 15 * time.Second,
|
|
// KeepAlive: 30 * time.Second,
|
|
// DualStack: true,
|
|
//}).DialContext,
|
|
////ForceAttemptHTTP2: true,
|
|
//MaxIdleConns: 100,
|
|
//IdleConnTimeout: 90 * time.Second,
|
|
//TLSHandshakeTimeout: 10 * time.Second,
|
|
//ExpectContinueTimeout: 1 * time.Second,
|
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
|
|
Proxy: http.ProxyFromEnvironment,
|
|
},
|
|
Request: nil,
|
|
Response: nil,
|
|
KeepHeader: false,
|
|
KeepDestinationHeaders: false,
|
|
mi: -1,
|
|
middlewares: make([]Middleware, 0),
|
|
}
|
|
}
|
|
|
|
func (ctx *Context) Use(middleware ...Middleware) {
|
|
if ctx.middlewares == nil {
|
|
ctx.middlewares = make([]Middleware, 0)
|
|
}
|
|
|
|
ctx.middlewares = append(ctx.middlewares, middleware...)
|
|
}
|
|
|
|
func (ctx *Context) UseFunc(fns ...MiddlewareFunc) {
|
|
if ctx.middlewares == nil {
|
|
ctx.middlewares = make([]Middleware, 0)
|
|
}
|
|
|
|
for _, fn := range fns {
|
|
ctx.middlewares = append(ctx.middlewares, fn)
|
|
}
|
|
}
|
|
|
|
func (ctx *Context) Next(req *http.Request) (*http.Response, error) {
|
|
var (
|
|
err error
|
|
total = len(ctx.middlewares)
|
|
)
|
|
ctx.mi++
|
|
if ctx.mi >= total {
|
|
ctx.mi = -1
|
|
return ctx.Transport.RoundTrip(req)
|
|
}
|
|
|
|
middleware := ctx.middlewares[ctx.mi]
|
|
ctx.Response, err = middleware.Handle(req, ctx)
|
|
ctx.mi = -1
|
|
return ctx.Response, err
|
|
}
|
|
|
|
func (ctx *Context) Copy() *Context {
|
|
return &Context{
|
|
Context: context.Background(),
|
|
Request: nil,
|
|
Response: nil,
|
|
KeepHeader: false,
|
|
KeepDestinationHeaders: false,
|
|
Transport: ctx.Transport,
|
|
mi: -1,
|
|
middlewares: ctx.middlewares,
|
|
}
|
|
}
|