Files
apinto/node/http-context/proxy.go
2023-03-09 16:40:55 +08:00

78 lines
1.8 KiB
Go

package http_context
import (
"bytes"
"fmt"
"github.com/eolinker/eosc/log"
http_service "github.com/eolinker/eosc/eocontext/http-context"
"github.com/valyala/fasthttp"
)
var _ http_service.IRequest = (*ProxyRequest)(nil)
type ProxyRequest struct {
RequestReader
}
//func (r *ProxyRequest) clone() *ProxyRequest {
// return NewProxyRequest(r.Request(), r.remoteAddr)
//}
func (r *ProxyRequest) Finish() error {
fasthttp.ReleaseRequest(r.req)
err := r.RequestReader.Finish()
if err != nil {
log.Warn(err)
}
return nil
}
func (r *ProxyRequest) Header() http_service.IHeaderWriter {
return &r.headers
}
func (r *ProxyRequest) Body() http_service.IBodyDataWriter {
return &r.body
}
func (r *ProxyRequest) URI() http_service.IURIWriter {
return &r.uri
}
var (
xforwardedforKey = []byte("x-forwarded-for")
)
func (r *ProxyRequest) reset(request *fasthttp.Request, remoteAddr string) {
//proxyRequest := fasthttp.AcquireRequest()
//request.CopyTo(proxyRequest)
r.req = request
forwardedFor := r.req.Header.PeekBytes(xforwardedforKey)
if len(forwardedFor) > 0 {
if i := bytes.IndexByte(forwardedFor, ','); i > 0 {
r.realIP = string(forwardedFor[:i])
} else {
r.realIP = string(forwardedFor)
}
r.req.Header.Set("x-forwarded-for", fmt.Sprint(string(forwardedFor), ",", r.remoteAddr))
} else {
r.req.Header.Set("x-forwarded-for", r.remoteAddr)
r.realIP = r.remoteAddr
}
r.RequestReader.reset(r.req, remoteAddr)
}
//func NewProxyRequest(request *fasthttp.Request, remoteAddr string) *ProxyRequest {
// proxyRequest := fasthttp.AcquireRequest()
// request.CopyTo(proxyRequest)
// return &ProxyRequest{
// RequestReader: NewRequestReader(proxyRequest, remoteAddr),
// }
//}
func (r *ProxyRequest) SetMethod(s string) {
r.Request().Header.SetMethod(s)
}