| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package fasthttpadaptor
- import (
- "bytes"
- "io"
- "net/http"
- "net/url"
- "strings"
- "github.com/valyala/fasthttp"
- )
- // ConvertRequest converts a fasthttp.Request to an http.Request.
- // forServer should be set to true when the http.Request is going to be passed to a http.Handler.
- //
- // The http.Request must not be used after the fasthttp handler has returned!
- // Memory in use by the http.Request will be reused after your handler has returned!
- func ConvertRequest(ctx *fasthttp.RequestCtx, r *http.Request, forServer bool) error {
- body := ctx.PostBody()
- strRequestURI := b2s(ctx.RequestURI())
- rURL, err := url.ParseRequestURI(strRequestURI)
- if err != nil {
- return err
- }
- r.Method = b2s(ctx.Method())
- r.Proto = b2s(ctx.Request.Header.Protocol())
- if r.Proto == "HTTP/2" {
- r.ProtoMajor = 2
- } else {
- r.ProtoMajor = 1
- }
- r.ProtoMinor = 1
- r.ContentLength = int64(len(body))
- r.RemoteAddr = ctx.RemoteAddr().String()
- r.Host = b2s(ctx.Host())
- r.TLS = ctx.TLSConnectionState()
- r.Body = io.NopCloser(bytes.NewReader(body))
- r.URL = rURL
- if forServer {
- r.RequestURI = strRequestURI
- }
- if r.Header == nil {
- r.Header = make(http.Header)
- } else if len(r.Header) > 0 {
- for k := range r.Header {
- delete(r.Header, k)
- }
- }
- ctx.Request.Header.VisitAll(func(k, v []byte) {
- sk := b2s(k)
- sv := b2s(v)
- switch sk {
- case "Transfer-Encoding":
- r.TransferEncoding = append(r.TransferEncoding, sv)
- default:
- if sk == fasthttp.HeaderCookie {
- sv = strings.Clone(sv)
- }
- r.Header.Set(sk, sv)
- }
- })
- return nil
- }
|