in api/internal/handler/route_online_debug/route_online_debug.go [95:172]
func (h *HTTPProtocolSupport) RequestForwarding(c droplet.Context) (interface{}, error) {
input := c.Input().(*DebugOnlineInput)
url := input.URL
method := input.Method
body := input.Body
contentType := input.ContentType
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.DisableCompression = true
client := &http.Client{
Transport: transport,
Timeout: 5 * time.Second,
}
var tempMap map[string][]string
err := json.Unmarshal([]byte(input.HeaderParams), &tempMap)
if err != nil {
return &data.SpecCodeResponse{StatusCode: http.StatusBadRequest}, fmt.Errorf("can not get header")
}
req, err := http.NewRequest(strings.ToUpper(method), url, bytes.NewReader(body))
if err != nil {
return &data.SpecCodeResponse{StatusCode: http.StatusBadRequest}, err
}
req.Header.Add("Content-Type", contentType)
for k, v := range tempMap {
for _, v1 := range v {
if !strings.EqualFold(k, "Content-Type") {
req.Header.Add(k, v1)
} else {
req.Header.Set(k, v1)
}
}
}
resp, err := client.Do(req)
if err != nil {
return &data.SpecCodeResponse{StatusCode: http.StatusInternalServerError}, err
}
defer resp.Body.Close()
// handle gzip content encoding
var reader io.ReadCloser
switch resp.Header.Get("Content-Encoding") {
case "gzip":
reader, err = gzip.NewReader(resp.Body)
if err != nil {
return &data.SpecCodeResponse{StatusCode: http.StatusInternalServerError}, err
}
defer reader.Close()
default:
reader = resp.Body
}
_body, err := ioutil.ReadAll(reader)
if err != nil {
return &data.SpecCodeResponse{StatusCode: http.StatusInternalServerError}, err
}
returnData := make(map[string]interface{})
result := &Result{}
err = json.Unmarshal(_body, &returnData)
if err != nil {
result.Code = resp.StatusCode
result.Header = resp.Header
result.Message = resp.Status
result.Data = string(_body)
} else {
result.Code = resp.StatusCode
result.Header = resp.Header
result.Message = resp.Status
result.Data = returnData
}
return result, nil
}