82 lines
2.2 KiB
Go
82 lines
2.2 KiB
Go
package proxy
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"math"
|
|
"math/rand"
|
|
"net"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
)
|
|
|
|
var startTime time.Time
|
|
|
|
func init() {
|
|
startTime = time.Now()
|
|
}
|
|
|
|
func (p *ForwardProxyCluster) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|
if req.Method == http.MethodConnect {
|
|
// HTTPS
|
|
p.proxyHttpsConnect(w, req)
|
|
} else {
|
|
// HTTP
|
|
if req.URL.Scheme == "" {
|
|
// When the client connects using the server as a web server.
|
|
remoteAddr, _, _ := net.SplitHostPort(req.RemoteAddr)
|
|
defer log.Infof(`%s -- %s`, remoteAddr, req.URL.Path)
|
|
if req.URL.Path == "/" {
|
|
rand.New(rand.NewSource(time.Now().Unix()))
|
|
fmt.Fprint(w, "proxy-loadbalancer <https://git.evulid.cc/cyberes/proxy-loadbalancer>\nSee /json for status info.\n\n\n\n"+retardation[rand.Intn(len(retardation))])
|
|
return
|
|
} else if req.URL.Path == "/json" {
|
|
p.mu.RLock()
|
|
response := map[string]interface{}{
|
|
"uptime": int(math.Round(time.Since(startTime).Seconds())),
|
|
"online": p.BalancerOnline.GetCount() == 0,
|
|
"proxies": map[string]interface{}{
|
|
"totalOnline": len(p.ourOnlineProxies) + len(p.thirdpartyOnlineProxies),
|
|
"ours": removeCredentials(p.ourOnlineProxies),
|
|
"thirdParty": map[string]interface{}{
|
|
"online": removeCredentials(p.thirdpartyOnlineProxies),
|
|
"broken": removeCredentials(p.thirdpartyBrokenProxies),
|
|
},
|
|
},
|
|
}
|
|
p.mu.RUnlock()
|
|
jsonResponse, err := json.MarshalIndent(response, "", " ")
|
|
if err != nil {
|
|
log.Errorln(err)
|
|
http.Error(w, "Path not found", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
w.Header().Set("Cache-Control", "no-store")
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Write(jsonResponse)
|
|
return
|
|
} else {
|
|
http.Error(w, "Path not found", http.StatusNotFound)
|
|
return
|
|
}
|
|
} else {
|
|
// When the client connects using the server as a proxy.
|
|
p.proxyHttpConnect(w, req)
|
|
}
|
|
}
|
|
}
|
|
|
|
func removeCredentials(proxyURLs []string) []string {
|
|
var newURLs []string
|
|
for _, proxyURL := range proxyURLs {
|
|
u, err := url.Parse(proxyURL)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
u.User = nil
|
|
newURLs = append(newURLs, u.String())
|
|
}
|
|
return newURLs
|
|
}
|