You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
)
|
|
|
|
// Server that handles http responses
|
|
type Server struct {
|
|
headerNames []string
|
|
logger LoggerHandler
|
|
}
|
|
|
|
func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
|
for _, headerName := range s.headerNames {
|
|
possibleIP := req.Header.Get(headerName)
|
|
if possibleIP == "" {
|
|
continue
|
|
}
|
|
|
|
ip, err := NewIP(possibleIP)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
s.sendResponse(w, ip)
|
|
return
|
|
}
|
|
|
|
addr, _, err := net.SplitHostPort(req.RemoteAddr)
|
|
if err != nil {
|
|
s.handleError(w, http.StatusBadRequest, err, "Could not get IP address from request")
|
|
return
|
|
}
|
|
|
|
ip, err := NewIP(addr)
|
|
if err != nil {
|
|
s.handleError(w, http.StatusBadRequest, err, "Could not parse IP address"+addr)
|
|
return
|
|
}
|
|
|
|
s.sendResponse(w, ip)
|
|
}
|
|
|
|
func (s *Server) sendResponse(resp http.ResponseWriter, ip *IP) {
|
|
io.WriteString(resp, ip.String()+"\n")
|
|
s.logger.Printf("Request from %s %s\n", ip.version, ip)
|
|
}
|
|
|
|
func (s *Server) handleError(resp http.ResponseWriter, status int, err error, message string) {
|
|
resp.WriteHeader(status)
|
|
io.WriteString(resp, message)
|
|
s.logger.Printf("Error handling request: %s (%s)", message, err)
|
|
}
|