1
0

backend.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "log"
  6. "net/http"
  7. "time"
  8. )
  9. const (
  10. backendResponse = "I am the backend"
  11. backendStatus = 404
  12. )
  13. func main() {
  14. server := &http.Server{
  15. Addr: ":8088",
  16. Handler: http.HandlerFunc(backendHandler),
  17. }
  18. // Run the server in a goroutine
  19. log.Println("Starting server on :8088")
  20. if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  21. log.Fatalf("Server failed to start: %v", err)
  22. }
  23. }
  24. func HandlePost(w http.ResponseWriter, r *http.Request) {
  25. // #1 add flusher
  26. flusher, ok := w.(http.Flusher)
  27. if !ok {
  28. panic("expected http.ResponseWriter to be an http.Flusher")
  29. }
  30. w.Header().Set("Connection", "Keep-Alive")
  31. w.Header().Set("Transfer-Encoding", "chunked")
  32. w.Header().Set("X-Content-Type-Options", "nosniff")
  33. ticker := time.NewTicker(time.Millisecond * 500)
  34. go func() {
  35. for t := range ticker.C {
  36. // #2 add '\n'
  37. io.WriteString(w, "Chunk\n")
  38. fmt.Println("Tick at", t)
  39. if flusher == nil {
  40. break
  41. }
  42. flusher.Flush()
  43. }
  44. }()
  45. time.Sleep(time.Second * 10)
  46. ticker.Stop()
  47. }
  48. func backendHandler(w http.ResponseWriter, r *http.Request) {
  49. if len(r.TransferEncoding) > 0 {
  50. log.Printf("backend got TransferEncoding: %v", r.TransferEncoding)
  51. HandlePost(w, r)
  52. return
  53. } else {
  54. log.Println("No transfer encoding received")
  55. }
  56. if r.Header.Get("X-Forwarded-For") == "" {
  57. log.Println("didn't get X-Forwarded-For header")
  58. }
  59. if g, e := r.Host, "ce.localhost"; g != e {
  60. log.Printf("backend got Host header %q, want %q", g, e)
  61. }
  62. w.Header().Set("X-Foo", "bar")
  63. http.SetCookie(w, &http.Cookie{Name: "flavor", Value: "chocolateChip"})
  64. w.WriteHeader(backendStatus)
  65. w.Write([]byte(backendResponse))
  66. }