You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.4 KiB
72 lines
1.4 KiB
package app |
|
|
|
import ( |
|
"context" |
|
"net/http" |
|
"strconv" |
|
"strings" |
|
|
|
"database.orly" |
|
"lol.mleku.dev/chk" |
|
"next.orly.dev/app/config" |
|
"protocol.orly/publish" |
|
) |
|
|
|
type Server struct { |
|
mux *http.ServeMux |
|
Config *config.C |
|
Ctx context.Context |
|
remote string |
|
publishers *publish.S |
|
Admins [][]byte |
|
*database.D |
|
} |
|
|
|
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
|
// log.T.C( |
|
// func() string { |
|
// return fmt.Sprintf("path %v header %v", r.URL, r.Header) |
|
// }, |
|
// ) |
|
if r.Header.Get("Upgrade") == "websocket" { |
|
s.HandleWebsocket(w, r) |
|
} else if r.Header.Get("Accept") == "application/nostr+json" { |
|
s.HandleRelayInfo(w, r) |
|
} else { |
|
if s.mux == nil { |
|
http.Error(w, "Upgrade required", http.StatusUpgradeRequired) |
|
} else { |
|
s.mux.ServeHTTP(w, r) |
|
} |
|
} |
|
} |
|
func (s *Server) ServiceURL(req *http.Request) (st string) { |
|
host := req.Header.Get("X-Forwarded-Host") |
|
if host == "" { |
|
host = req.Host |
|
} |
|
proto := req.Header.Get("X-Forwarded-Proto") |
|
if proto == "" { |
|
if host == "localhost" { |
|
proto = "ws" |
|
} else if strings.Contains(host, ":") { |
|
// has a port number |
|
proto = "ws" |
|
} else if _, err := strconv.Atoi( |
|
strings.ReplaceAll( |
|
host, ".", |
|
"", |
|
), |
|
); chk.E(err) { |
|
// it's a naked IP |
|
proto = "ws" |
|
} else { |
|
proto = "wss" |
|
} |
|
} else if proto == "https" { |
|
proto = "wss" |
|
} else if proto == "http" { |
|
proto = "ws" |
|
} |
|
return proto + "://" + host |
|
}
|
|
|