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.
what-is-my-ip/server.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)
}