Files
apinto/node/http-context/request-reader.go
huangmengzhu 638dcaccdc 解决real ip
2023-05-25 17:16:07 +08:00

120 lines
2.3 KiB
Go

package http_context
import (
"bytes"
"strings"
http_service "github.com/eolinker/eosc/eocontext/http-context"
"github.com/valyala/fasthttp"
)
var _ http_service.IRequestReader = (*RequestReader)(nil)
type RequestReader struct {
body BodyRequestHandler
req *fasthttp.Request
headers RequestHeader
uri URIRequest
remoteAddr string
remotePort string
realIP string
length int
}
func (r *RequestReader) ContentLength() int {
return r.length
}
func (r *RequestReader) ContentType() string {
return string(r.req.Header.ContentType())
}
func (r *RequestReader) String() string {
return r.req.String()
}
func (r *RequestReader) Method() string {
return string(r.req.Header.Method())
}
func (r *RequestReader) Header() http_service.IHeaderReader {
return &r.headers
}
func (r *RequestReader) Body() http_service.IBodyDataReader {
return &r.body
}
func (r *RequestReader) URI() http_service.IURIReader {
return &r.uri
}
func (r *RequestReader) RealIp() string {
if r.realIP == "" {
realIP := r.headers.GetHeader("x-real-ip")
if realIP == "" {
realIP = r.remoteAddr
}
r.realIP = realIP
}
return r.realIP
}
func (r *RequestReader) ForwardIP() string {
return r.headers.GetHeader("x-forwarded-for")
}
func (r *RequestReader) RemoteAddr() string {
return r.remoteAddr
}
func (r *RequestReader) RemotePort() string {
return r.remotePort
}
func (r *RequestReader) Finish() error {
r.req = nil
r.body.reset(nil)
r.headers.reset(nil)
r.uri.reset(nil)
return nil
}
func (r *RequestReader) reset(req *fasthttp.Request, remoteAddr string) {
r.req = req
r.remoteAddr = remoteAddr
r.body.reset(req)
r.headers.reset(&req.Header)
r.uri.uri = req.URI()
idx := strings.LastIndex(remoteAddr, ":")
if idx != -1 {
r.remoteAddr = remoteAddr[:idx]
r.remotePort = remoteAddr[idx+1:]
}
length := r.req.Header.ContentLength()
if length > 0 {
r.length = length
}
if realIp := r.req.Header.Peek("x-real-ip"); len(realIp) == 0 {
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)
}
} else {
r.realIP = r.remoteAddr
}
} else {
r.realIP = string(realIp)
}
}
func (r *RequestReader) Request() *fasthttp.Request {
return r.req
}