61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
|
package utils
|
||
|
|
||
|
import (
|
||
|
"crypto/tls"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"mime/multipart"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
)
|
||
|
|
||
|
type SerializableHttpRequest struct {
|
||
|
Method string
|
||
|
URL *url.URL
|
||
|
Proto string // "HTTP/1.0"
|
||
|
ProtoMajor int // 1
|
||
|
ProtoMinor int // 0
|
||
|
Header http.Header
|
||
|
ContentLength int64
|
||
|
TransferEncoding []string
|
||
|
Host string
|
||
|
Form url.Values
|
||
|
PostForm url.Values
|
||
|
MultipartForm *multipart.Form
|
||
|
Trailer http.Header
|
||
|
RemoteAddr string
|
||
|
RequestURI string
|
||
|
TLS *tls.ConnectionState
|
||
|
}
|
||
|
|
||
|
func Clone(r *http.Request) *SerializableHttpRequest {
|
||
|
if r == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
rc := new(SerializableHttpRequest)
|
||
|
rc.Method = r.Method
|
||
|
rc.URL = r.URL
|
||
|
rc.Proto = r.Proto
|
||
|
rc.ProtoMajor = r.ProtoMajor
|
||
|
rc.ProtoMinor = r.ProtoMinor
|
||
|
rc.Header = r.Header
|
||
|
rc.ContentLength = r.ContentLength
|
||
|
rc.Host = r.Host
|
||
|
rc.RemoteAddr = r.RemoteAddr
|
||
|
rc.RequestURI = r.RequestURI
|
||
|
return rc
|
||
|
}
|
||
|
|
||
|
func (s *SerializableHttpRequest) ToJson() string {
|
||
|
if jsonVal, err := json.Marshal(s); err != nil || jsonVal == nil {
|
||
|
return fmt.Sprintf("Error marshalling SerializableHttpRequest to json: %s", err.Error())
|
||
|
} else {
|
||
|
return string(jsonVal)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func DumpHttpRequest(req *http.Request) string {
|
||
|
return fmt.Sprintf("%v", Clone(req).ToJson())
|
||
|
}
|