chunked-encoding-passthrough_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package main_test
  2. /*
  3. Reverse proxy chunked encoding test
  4. To use this test file, set default site in your zoraxypointing to http://localhost:8088
  5. and then start the backend server and test script below.
  6. */
  7. import (
  8. "bytes"
  9. "fmt"
  10. "io"
  11. "io/ioutil"
  12. "net/http"
  13. "testing"
  14. )
  15. const (
  16. backendResponse = "I am the backend"
  17. backendStatus = 404
  18. backendURL string = "http://localhost"
  19. )
  20. func TestReverseProxy(t *testing.T) {
  21. getReq, _ := http.NewRequest("GET", backendURL, nil)
  22. getReq.Host = "localhost"
  23. res, err := http.DefaultClient.Do(getReq)
  24. if err != nil {
  25. t.Fatalf("Get: %v", err)
  26. }
  27. if g, e := res.StatusCode, backendStatus; g != e {
  28. t.Errorf("got res.StatusCode %d; expected %d", g, e)
  29. }
  30. if g, e := res.Header.Get("X-Foo"), "bar"; g != e {
  31. t.Errorf("got X-Foo %q; expected %q", g, e)
  32. }
  33. if g, e := len(res.Header["Set-Cookie"]), 1; g != e {
  34. t.Fatalf("got %d SetCookies, want %d", g, e)
  35. }
  36. if cookie := res.Cookies()[0]; cookie.Name != "flavor" {
  37. t.Errorf("unexpected cookie %q", cookie.Name)
  38. }
  39. bodyBytes, _ := ioutil.ReadAll(res.Body)
  40. if g, e := string(bodyBytes), backendResponse; g != e {
  41. t.Errorf("got body %q; expected %q", g, e)
  42. }
  43. }
  44. func TestChunkedTransfer(t *testing.T) {
  45. // Test chunked encoding request
  46. chunkedReq, _ := http.NewRequest("POST", backendURL, bytes.NewBufferString(""))
  47. chunkedReq.Host = "localhost"
  48. chunkedReq.TransferEncoding = []string{"chunked"}
  49. chunkedRes, err := http.DefaultClient.Do(chunkedReq)
  50. if err != nil {
  51. t.Fatalf("Chunked POST: %v", err)
  52. }
  53. if g, e := chunkedRes.StatusCode, 200; g != e {
  54. t.Errorf("got chunkedRes.StatusCode %d; expected %d", g, e)
  55. }
  56. // Read the response body in chunks and print to STDOUT
  57. buf := make([]byte, 1024)
  58. for {
  59. n, err := chunkedRes.Body.Read(buf)
  60. if n > 0 {
  61. // Print the chunk to STDOUT
  62. fmt.Print(string(buf[:n]))
  63. }
  64. if err != nil {
  65. if err != io.EOF {
  66. t.Fatalf("Error reading response body: %v", err)
  67. }
  68. break
  69. }
  70. }
  71. chunkedRes.Body.Close()
  72. }