package main import ( "flag" htemplate "html/template" "log" "net" "net/http" "net/http/fcgi" "os" "strings" ) var ( domain = flag.String("domain", "thequux.com", "The base domain to enable SSO for") listen = flag.String("listen", "0.0.0.0:80", "The address to listen on") ) func main() { flag.Parse() l := log.New(os.Stderr, "ipaSSO: ", log.Ldate|log.Ltime|log.Lshortfile) mux := http.NewServeMux() mux.Handle("/env", http.HandlerFunc(dumpEnv)) l.Printf("Starting") listener, err := net.Listen("tcp", *listen) if err != nil { log.Fatalln("Failed to listen: ", err) } l.Println("Listening on", listener.Addr()) log.Fatal(fcgi.Serve(listener, mux)) } var envTemplate = htemplate.Must(htemplate.New("envdoc").Parse(`

Headers

{{- range $k,$v := .Headers }} {{- end }}
[{{ $k }}]
{{ $v }}

Process Environment

{{- range $k,$v := .ProcessEnv }} {{- end }}
{{ $k }}
{{ $v }}
`)) type envdocArgs struct { Headers map[string]string ProcessEnv map[string]string } func dumpEnv(w http.ResponseWriter, r *http.Request) { var headers = map[string]string{} for k, v := range r.Header { headers[k] = strings.Join(v, "\n") } var args = envdocArgs{ProcessEnv: fcgi.ProcessEnv(r), Headers: headers} w.Header().Set("Content-Type", "text/html") w.WriteHeader(http.StatusOK) if err := envTemplate.Execute(w, args); err != nil { panic(err) } }