mirror of
https://github.com/chubin/wttr.in
synced 2025-01-12 12:08:47 +00:00
89 lines
1.9 KiB
Go
89 lines
1.9 KiB
Go
package processor
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func getAny(req *http.Request, tr1, tr2, tr3 *http.Transport) (*ResponseWithHeader, error) {
|
|
uri := strings.ReplaceAll(req.URL.RequestURI(), "%", "%25")
|
|
|
|
u, err := url.Parse(uri)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
format := u.Query().Get("format")
|
|
|
|
if format == "j1" {
|
|
return getJ1(req, tr1)
|
|
} else if format != "" {
|
|
return getFormat(req, tr2)
|
|
}
|
|
|
|
// log.Println(req.URL.Query())
|
|
// log.Println()
|
|
|
|
return getDefault(req, tr3)
|
|
}
|
|
|
|
func getJ1(req *http.Request, transport *http.Transport) (*ResponseWithHeader, error) {
|
|
return getUpstream(req, transport)
|
|
}
|
|
|
|
func getFormat(req *http.Request, transport *http.Transport) (*ResponseWithHeader, error) {
|
|
return getUpstream(req, transport)
|
|
}
|
|
|
|
func getDefault(req *http.Request, transport *http.Transport) (*ResponseWithHeader, error) {
|
|
return getUpstream(req, transport)
|
|
}
|
|
|
|
func getUpstream(req *http.Request, transport *http.Transport) (*ResponseWithHeader, error) {
|
|
client := &http.Client{
|
|
Transport: transport,
|
|
}
|
|
|
|
queryURL := fmt.Sprintf("http://%s%s", req.Host, req.RequestURI)
|
|
|
|
proxyReq, err := http.NewRequest(req.Method, queryURL, req.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// proxyReq.Header.Set("Host", req.Host)
|
|
// proxyReq.Header.Set("X-Forwarded-For", req.RemoteAddr)
|
|
|
|
for header, values := range req.Header {
|
|
for _, value := range values {
|
|
proxyReq.Header.Add(header, value)
|
|
}
|
|
}
|
|
|
|
if proxyReq.Header.Get("X-Forwarded-For") == "" {
|
|
proxyReq.Header.Set("X-Forwarded-For", ipFromAddr(req.RemoteAddr))
|
|
}
|
|
|
|
res, err := client.Do(proxyReq)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
body, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &ResponseWithHeader{
|
|
InProgress: false,
|
|
Expires: time.Now().Add(time.Duration(randInt(1000, 1500)) * time.Second),
|
|
Body: body,
|
|
Header: res.Header,
|
|
StatusCode: res.StatusCode,
|
|
}, nil
|
|
}
|