74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
package httpServer
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
"tunnel_pls/session"
|
|
)
|
|
|
|
func Listen() {
|
|
server := http.Server{
|
|
Addr: ":80",
|
|
}
|
|
|
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
var rawRequest string
|
|
slug := strings.Split(r.Host, ".")[0]
|
|
if slug == "" {
|
|
http.Error(w, "You fuck up man", http.StatusBadRequest)
|
|
return
|
|
}
|
|
sshSession, ok := session.Clients[slug]
|
|
if !ok {
|
|
http.Error(w, "Bad Gateway", http.StatusBadGateway)
|
|
return
|
|
}
|
|
rawRequest += fmt.Sprintf("%s %s %s\r\n", r.Method, r.URL.RequestURI(), r.Proto)
|
|
rawRequest += fmt.Sprintf("Host: %s\r\n", r.Host)
|
|
for k, v := range r.Header {
|
|
rawRequest += fmt.Sprintf("%s: %s\r\n", k, v[0])
|
|
}
|
|
rawRequest += "\r\n"
|
|
|
|
if r.Body != nil {
|
|
body, err := io.ReadAll(r.Body)
|
|
if err != nil {
|
|
log.Println("Error reading request body:", err)
|
|
} else {
|
|
rawRequest += string(body)
|
|
}
|
|
}
|
|
payload := []byte(rawRequest)
|
|
|
|
host, originPort := session.ParseAddr(r.RemoteAddr)
|
|
data := sshSession.GetForwardedConnection(host, sshSession.Connection, payload, originPort, 80)
|
|
|
|
response, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(data)), r)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var isServerSet = false
|
|
for k, v := range response.Header {
|
|
if k == "Server" {
|
|
isServerSet = true
|
|
w.Header().Set(k, fmt.Sprintf("Tunnel_Pls/%v", response.Header[k][0]))
|
|
continue
|
|
}
|
|
w.Header().Set(k, v[0])
|
|
}
|
|
if !isServerSet {
|
|
w.Header().Set("Server", "Tunnel_Pls")
|
|
}
|
|
w.WriteHeader(response.StatusCode)
|
|
io.Copy(w, response.Body)
|
|
})
|
|
|
|
fmt.Println("Listening on port 80")
|
|
server.ListenAndServe()
|
|
}
|