12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package main
- import (
- "fmt"
- "io"
- "log"
- "net/http"
- "time"
- )
- const (
- backendResponse = "I am the backend"
- backendStatus = 404
- )
- func main() {
- server := &http.Server{
- Addr: ":8088",
- Handler: http.HandlerFunc(backendHandler),
- }
- // Run the server in a goroutine
- log.Println("Starting server on :8088")
- if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
- log.Fatalf("Server failed to start: %v", err)
- }
- }
- func HandlePost(w http.ResponseWriter, r *http.Request) {
- // #1 add flusher
- flusher, ok := w.(http.Flusher)
- if !ok {
- panic("expected http.ResponseWriter to be an http.Flusher")
- }
- w.Header().Set("Connection", "Keep-Alive")
- w.Header().Set("Transfer-Encoding", "chunked")
- w.Header().Set("X-Content-Type-Options", "nosniff")
- ticker := time.NewTicker(time.Millisecond * 500)
- go func() {
- for t := range ticker.C {
- // #2 add '\n'
- io.WriteString(w, "Chunk\n")
- fmt.Println("Tick at", t)
- if flusher == nil {
- break
- }
- flusher.Flush()
- }
- }()
- time.Sleep(time.Second * 10)
- ticker.Stop()
- }
- func backendHandler(w http.ResponseWriter, r *http.Request) {
- if len(r.TransferEncoding) > 0 {
- log.Printf("backend got TransferEncoding: %v", r.TransferEncoding)
- HandlePost(w, r)
- return
- } else {
- log.Println("No transfer encoding received")
- }
- if r.Header.Get("X-Forwarded-For") == "" {
- log.Println("didn't get X-Forwarded-For header")
- }
- if g, e := r.Host, "ce.localhost"; g != e {
- log.Printf("backend got Host header %q, want %q", g, e)
- }
- w.Header().Set("X-Foo", "bar")
- http.SetCookie(w, &http.Cookie{Name: "flavor", Value: "chocolateChip"})
- w.WriteHeader(backendStatus)
- w.Write([]byte(backendResponse))
- }
|