Created
March 3, 2020 13:55
-
-
Save maesoser/89d1f5d7ffcd2de7430963afbdfaea49 to your computer and use it in GitHub Desktop.
Plain and simple http/https test server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package main | |
| import ( | |
| "fmt" | |
| "net/http" | |
| "log" | |
| "time" | |
| "flag" | |
| "os" | |
| "strings" | |
| "crypto/tls" | |
| ) | |
| func GetEnvStr(name, value string) string { | |
| if os.Getenv(name) != "" { | |
| return os.Getenv(name) | |
| } | |
| return value | |
| } | |
| func Run(addr string, sslAddr string, ssl map[string]string) chan error { | |
| errs := make(chan error) | |
| // Starting HTTP server | |
| go func() { | |
| log.Printf("Staring HTTP service on %s ...", addr) | |
| if err := http.ListenAndServe(addr, nil); err != nil { | |
| errs <- err | |
| } | |
| }() | |
| // Starting HTTPS server | |
| go func() { | |
| log.Printf("Staring HTTPS service on %s ...", sslAddr) | |
| if err := http.ListenAndServeTLS(sslAddr, ssl["cert"], ssl["key"], nil); err != nil { | |
| errs <- err | |
| } | |
| }() | |
| return errs | |
| } | |
| func main() { | |
| Port := flag.String("port", GetEnvStr("SERVER_HTTP_PORT", "8080"), "Server Port") | |
| TLSPort := flag.String("tls_port", GetEnvStr("SERVER__HTTPS_PORT", "8443"), "Secure Server Port") | |
| KeyArg := flag.String("key", GetEnvStr("SERVER_KEY", "data/key.pem"), "Server Key") | |
| CertArg := flag.String("cert", GetEnvStr("SERVER_CERT", "data/certificate.pem"), "Server Certificate") | |
| //Verbose := flag.Bool("save", false, "Save NSG data to json file.") | |
| flag.Parse() | |
| log.Printf("Using:\n\tKey: %s\n\tCert: %s\n", *KeyArg, *CertArg) | |
| http.HandleFunc("/", HelloServer) | |
| http.HandleFunc("/wait", Wait) | |
| errs := Run(":" + *Port, ":" + *TLSPort, map[string]string{ | |
| "cert": *CertArg, | |
| "key": *KeyArg, | |
| }) | |
| // This will run forever until channel receives error | |
| for{ | |
| select { | |
| case err := <-errs: | |
| log.Printf("Error! %s", err) | |
| } | |
| } | |
| } | |
| func TLSVersionName(version uint16) string{ | |
| switch version{ | |
| case 0x0300: | |
| return "SSLv3.0" | |
| case 0x0301: | |
| return "TLSv1.0" | |
| case 0x0302: | |
| return "TLSv1.1" | |
| case 0x0303: | |
| return "TLSv1.2" | |
| case 0x0304: | |
| return "TLSv1.3" | |
| } | |
| return fmt.Sprintf("%d", version) | |
| } | |
| func GetInfo(r *http.Request) string{ | |
| output := "" | |
| output += fmt.Sprintf("[%s] %s %s\n", r.Method, r.Proto, r.URL.Path) | |
| output += fmt.Sprintf("\tConnection: %s to %s\n", r.RemoteAddr, r.Host) | |
| output += fmt.Sprintf("\tHeaders:\n") | |
| for k, v := range r.Header { | |
| if k == "Cookie" { | |
| for _ , c := range(v){ | |
| output += fmt.Sprintf("\t\tCookie: %s\n", c) | |
| } | |
| }else{ | |
| output += fmt.Sprintf("\t\t%s: %s\n", k, strings.Join(v, ",")) | |
| } | |
| } | |
| if r.TLS != nil{ | |
| output += fmt.Sprintf("\tTLS:\n\t\tVersion: %s\n", TLSVersionName(r.TLS.Version)) | |
| output += fmt.Sprintf("\t\tCipherSuite: %s\n", tls.CipherSuiteName(r.TLS.CipherSuite)) | |
| } | |
| return output | |
| } | |
| func HelloServer(w http.ResponseWriter, r *http.Request) { | |
| output := GetInfo(r) | |
| log.Println(output) | |
| fmt.Fprintf(w, output) | |
| } | |
| func Wait(w http.ResponseWriter, r *http.Request) { | |
| output := GetInfo(r) | |
| log.Println(output) | |
| for { | |
| time.Sleep(1 * time.Second) | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment