github.com/guyezi/gofrontend@v0.0.0-20200228202240-7a62a49e62c0/libgo/go/net/http/example_test.go (about)

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package http_test
     6  
     7  import (
     8  	"context"
     9  	"fmt"
    10  	"io"
    11  	"io/ioutil"
    12  	"log"
    13  	"net/http"
    14  	"os"
    15  	"os/signal"
    16  )
    17  
    18  func ExampleHijacker() {
    19  	http.HandleFunc("/hijack", func(w http.ResponseWriter, r *http.Request) {
    20  		hj, ok := w.(http.Hijacker)
    21  		if !ok {
    22  			http.Error(w, "webserver doesn't support hijacking", http.StatusInternalServerError)
    23  			return
    24  		}
    25  		conn, bufrw, err := hj.Hijack()
    26  		if err != nil {
    27  			http.Error(w, err.Error(), http.StatusInternalServerError)
    28  			return
    29  		}
    30  		// Don't forget to close the connection:
    31  		defer conn.Close()
    32  		bufrw.WriteString("Now we're speaking raw TCP. Say hi: ")
    33  		bufrw.Flush()
    34  		s, err := bufrw.ReadString('\n')
    35  		if err != nil {
    36  			log.Printf("error reading string: %v", err)
    37  			return
    38  		}
    39  		fmt.Fprintf(bufrw, "You said: %q\nBye.\n", s)
    40  		bufrw.Flush()
    41  	})
    42  }
    43  
    44  func ExampleGet() {
    45  	res, err := http.Get("http://www.google.com/robots.txt")
    46  	if err != nil {
    47  		log.Fatal(err)
    48  	}
    49  	robots, err := ioutil.ReadAll(res.Body)
    50  	res.Body.Close()
    51  	if err != nil {
    52  		log.Fatal(err)
    53  	}
    54  	fmt.Printf("%s", robots)
    55  }
    56  
    57  func ExampleFileServer() {
    58  	// Simple static webserver:
    59  	log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("/usr/share/doc"))))
    60  }
    61  
    62  func ExampleFileServer_stripPrefix() {
    63  	// To serve a directory on disk (/tmp) under an alternate URL
    64  	// path (/tmpfiles/), use StripPrefix to modify the request
    65  	// URL's path before the FileServer sees it:
    66  	http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
    67  }
    68  
    69  func ExampleStripPrefix() {
    70  	// To serve a directory on disk (/tmp) under an alternate URL
    71  	// path (/tmpfiles/), use StripPrefix to modify the request
    72  	// URL's path before the FileServer sees it:
    73  	http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
    74  }
    75  
    76  type apiHandler struct{}
    77  
    78  func (apiHandler) ServeHTTP(http.ResponseWriter, *http.Request) {}
    79  
    80  func ExampleServeMux_Handle() {
    81  	mux := http.NewServeMux()
    82  	mux.Handle("/api/", apiHandler{})
    83  	mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
    84  		// The "/" pattern matches everything, so we need to check
    85  		// that we're at the root here.
    86  		if req.URL.Path != "/" {
    87  			http.NotFound(w, req)
    88  			return
    89  		}
    90  		fmt.Fprintf(w, "Welcome to the home page!")
    91  	})
    92  }
    93  
    94  // HTTP Trailers are a set of key/value pairs like headers that come
    95  // after the HTTP response, instead of before.
    96  func ExampleResponseWriter_trailers() {
    97  	mux := http.NewServeMux()
    98  	mux.HandleFunc("/sendstrailers", func(w http.ResponseWriter, req *http.Request) {
    99  		// Before any call to WriteHeader or Write, declare
   100  		// the trailers you will set during the HTTP
   101  		// response. These three headers are actually sent in
   102  		// the trailer.
   103  		w.Header().Set("Trailer", "AtEnd1, AtEnd2")
   104  		w.Header().Add("Trailer", "AtEnd3")
   105  
   106  		w.Header().Set("Content-Type", "text/plain; charset=utf-8") // normal header
   107  		w.WriteHeader(http.StatusOK)
   108  
   109  		w.Header().Set("AtEnd1", "value 1")
   110  		io.WriteString(w, "This HTTP response has both headers before this text and trailers at the end.\n")
   111  		w.Header().Set("AtEnd2", "value 2")
   112  		w.Header().Set("AtEnd3", "value 3") // These will appear as trailers.
   113  	})
   114  }
   115  
   116  func ExampleServer_Shutdown() {
   117  	var srv http.Server
   118  
   119  	idleConnsClosed := make(chan struct{})
   120  	go func() {
   121  		sigint := make(chan os.Signal, 1)
   122  		signal.Notify(sigint, os.Interrupt)
   123  		<-sigint
   124  
   125  		// We received an interrupt signal, shut down.
   126  		if err := srv.Shutdown(context.Background()); err != nil {
   127  			// Error from closing listeners, or context timeout:
   128  			log.Printf("HTTP server Shutdown: %v", err)
   129  		}
   130  		close(idleConnsClosed)
   131  	}()
   132  
   133  	if err := srv.ListenAndServe(); err != http.ErrServerClosed {
   134  		// Error starting or closing listener:
   135  		log.Fatalf("HTTP server ListenAndServe: %v", err)
   136  	}
   137  
   138  	<-idleConnsClosed
   139  }
   140  
   141  func ExampleListenAndServeTLS() {
   142  	http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
   143  		io.WriteString(w, "Hello, TLS!\n")
   144  	})
   145  
   146  	// One can use generate_cert.go in crypto/tls to generate cert.pem and key.pem.
   147  	log.Printf("About to listen on 8443. Go to https://127.0.0.1:8443/")
   148  	err := http.ListenAndServeTLS(":8443", "cert.pem", "key.pem", nil)
   149  	log.Fatal(err)
   150  }
   151  
   152  func ExampleListenAndServe() {
   153  	// Hello world, the web server
   154  
   155  	helloHandler := func(w http.ResponseWriter, req *http.Request) {
   156  		io.WriteString(w, "Hello, world!\n")
   157  	}
   158  
   159  	http.HandleFunc("/hello", helloHandler)
   160  	log.Fatal(http.ListenAndServe(":8080", nil))
   161  }
   162  
   163  func ExampleHandleFunc() {
   164  	h1 := func(w http.ResponseWriter, _ *http.Request) {
   165  		io.WriteString(w, "Hello from a HandleFunc #1!\n")
   166  	}
   167  	h2 := func(w http.ResponseWriter, _ *http.Request) {
   168  		io.WriteString(w, "Hello from a HandleFunc #2!\n")
   169  	}
   170  
   171  	http.HandleFunc("/", h1)
   172  	http.HandleFunc("/endpoint", h2)
   173  
   174  	log.Fatal(http.ListenAndServe(":8080", nil))
   175  }
   176  
   177  func newPeopleHandler() http.Handler {
   178  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   179  		fmt.Fprintln(w, "This is the people handler.")
   180  	})
   181  }
   182  
   183  func ExampleNotFoundHandler() {
   184  	mux := http.NewServeMux()
   185  
   186  	// Create sample handler to returns 404
   187  	mux.Handle("/resources", http.NotFoundHandler())
   188  
   189  	// Create sample handler that returns 200
   190  	mux.Handle("/resources/people/", newPeopleHandler())
   191  
   192  	log.Fatal(http.ListenAndServe(":8080", mux))
   193  }