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