// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Hello is a simple hello, world demonstration web server. // // It serves version information on /version and answers // any other request like /name by saying "Hello, name!". // // See golang.org/x/example/outyet for a more sophisticated server. package main import ( "flag" "fmt" "html" "log" "net/http" "os" "runtime/debug" "strings" ) func usage() { fmt.Fprintf(os.Stderr, "usage: helloserver [options]\n") flag.PrintDefaults() os.Exit(2) } var ( greeting = flag.String("g", "Hello", "Greet with `greeting`") addr = flag.String("addr", "localhost:8080", "address to serve") ) func main() { // Parse flags. flag.Usage = usage flag.Parse() // Parse and validate arguments (none). args := flag.Args() if len(args) != 0 { usage() } // Register handlers. // All requests not otherwise mapped with go to greet. // /version is mapped specifically to version. http.HandleFunc("/", greet) http.HandleFunc("/version", version) log.Printf("serving http://%s\n", *addr) log.Fatal(http.ListenAndServe(*addr, nil)) } func version(w http.ResponseWriter, r *http.Request) { info, ok := debug.ReadBuildInfo() if !ok { http.Error(w, "no build information available", 500) return } fmt.Fprintf(w, "\n
\n") fmt.Fprintf(w, "%s\n", html.EscapeString(info.String())) } func greet(w http.ResponseWriter, r *http.Request) { name := strings.Trim(r.URL.Path, "/") if name == "" { name = "Gopher" } fmt.Fprintf(w, "\n") fmt.Fprintf(w, "%s, %s!\n", *greeting, html.EscapeString(name)) }