init
This commit is contained in:
		
						commit
						e1a9246b1a
					
				
							
								
								
									
										118
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								main.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,118 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"net/netip"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// @title My IP
 | 
			
		||||
// @version 0.1
 | 
			
		||||
// @description Get the requseters Real IP, based on HTTP Requests
 | 
			
		||||
func main() {
 | 
			
		||||
    handler := http.NewServeMux()
 | 
			
		||||
    handler.HandleFunc("/", handleRoot)
 | 
			
		||||
 | 
			
		||||
    log.Fatal(http.ListenAndServe(":8080", handler))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ResponseType string
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
    TEXT ResponseType = "TEXT"
 | 
			
		||||
    JSON ResponseType = "JSON"
 | 
			
		||||
    DEFAULT ResponseType = TEXT
 | 
			
		||||
) 
 | 
			
		||||
 | 
			
		||||
func (r *ResponseType) IsValid() bool {
 | 
			
		||||
 | 
			
		||||
    // This is pretty ugly
 | 
			
		||||
    // TODO: Comapre with ignore-case
 | 
			
		||||
    if *r == TEXT {
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if *r == JSON {
 | 
			
		||||
        return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func handleRoot(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
    if r.Method != "GET" {
 | 
			
		||||
        w.WriteHeader(http.StatusBadRequest)
 | 
			
		||||
    }
 | 
			
		||||
    var Type ResponseType
 | 
			
		||||
    Type = ResponseType(r.URL.Query().Get("t"))
 | 
			
		||||
    
 | 
			
		||||
    if !Type.IsValid() {
 | 
			
		||||
        // Using defualt    
 | 
			
		||||
        Type = DEFAULT
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    log.Printf("Type: %v\n", Type)
 | 
			
		||||
    ip := determineRealIP(r)
 | 
			
		||||
 | 
			
		||||
    w.WriteHeader(http.StatusOK)
 | 
			
		||||
    err := writeFormattedIP(w, Type, ip)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Println(err.Error())
 | 
			
		||||
        w.WriteHeader(http.StatusInternalServerError)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func determineRealIP(r *http.Request) string {
 | 
			
		||||
    ip := r.RemoteAddr
 | 
			
		||||
 | 
			
		||||
    xRealIP := r.Header.Get("X-Real-IP")
 | 
			
		||||
    if xRealIP != "" {
 | 
			
		||||
        ip = xRealIP
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ipPort, err := netip.ParseAddrPort(ip)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Println("Error while parsing AddrPort:", err.Error())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ipAddrPort := ipPort.Addr().String()
 | 
			
		||||
    if ipAddrPort == "invalid IP" {
 | 
			
		||||
        ipAddr, err := netip.ParseAddr(ip)
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            // Last resort
 | 
			
		||||
            log.Println("Error while parsing Addr:", err.Error())
 | 
			
		||||
            return ip
 | 
			
		||||
        }
 | 
			
		||||
        ip = ipAddr.String()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ip
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func writeFormattedIP(w http.ResponseWriter, Type ResponseType, ip string)  error {
 | 
			
		||||
    if Type == TEXT {
 | 
			
		||||
        _, err := w.Write([]byte(ip))
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            return err
 | 
			
		||||
        }
 | 
			
		||||
        return nil
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if Type == JSON {
 | 
			
		||||
        // TODO: Use MarshalIndent
 | 
			
		||||
        jsonResponse, err := json.Marshal(map[string]string{"ip": ip})
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            return err
 | 
			
		||||
        }
 | 
			
		||||
        _, err = w.Write(jsonResponse)
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            return err
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user