Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 

197 rader
5.3 KiB

  1. // Copyright 2015 Google Inc. All rights reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package stash
  15. import (
  16. "net"
  17. "net/http"
  18. "testing"
  19. "github.com/google/martian/fifo"
  20. "github.com/google/martian/parse"
  21. "github.com/google/martian/port"
  22. "github.com/google/martian/proxyutil"
  23. )
  24. func TestStashRequest(t *testing.T) {
  25. fg := fifo.NewGroup()
  26. fg.AddRequestModifier(NewModifier("stashed-url"))
  27. pmod := port.NewModifier()
  28. pmod.UsePort(8080)
  29. fg.AddRequestModifier(pmod)
  30. req, err := http.NewRequest("GET", "http://example.com", nil)
  31. if err != nil {
  32. t.Fatalf("NewRequest(): got %v, want no error", err)
  33. }
  34. if err := fg.ModifyRequest(req); err != nil {
  35. t.Fatalf("smod.ModifyRequest(): got %v, want no error", err)
  36. }
  37. _, port, err := net.SplitHostPort(req.URL.Host)
  38. if err != nil {
  39. t.Fatalf("net.SplitHostPort(%q): got %v, want no error", req.URL.Host, err)
  40. }
  41. if got, want := port, "8080"; got != want {
  42. t.Errorf("port: got %v, want %v", got, want)
  43. }
  44. if got, want := req.Header.Get("stashed-url"), "http://example.com"; got != want {
  45. t.Errorf("stashed-url header: got %v, want %v", got, want)
  46. }
  47. }
  48. func TestStashRequestResponse(t *testing.T) {
  49. headerName := "stashed-url"
  50. originalURL := "http://example.com"
  51. fg := fifo.NewGroup()
  52. fg.AddRequestModifier(NewModifier(headerName))
  53. fg.AddResponseModifier(NewModifier(headerName))
  54. pmod := port.NewModifier()
  55. pmod.UsePort(8080)
  56. fg.AddRequestModifier(pmod)
  57. req, err := http.NewRequest("GET", originalURL, nil)
  58. if err != nil {
  59. t.Fatalf("NewRequest(): got %v, want no error", err)
  60. }
  61. if err := fg.ModifyRequest(req); err != nil {
  62. t.Fatalf("smod.ModifyRequest(): got %v, want no error", err)
  63. }
  64. _, port, err := net.SplitHostPort(req.URL.Host)
  65. if err != nil {
  66. t.Fatalf("net.SplitHostPort(%q): got %v, want no error", req.URL.Host, err)
  67. }
  68. if got, want := port, "8080"; got != want {
  69. t.Errorf("port: got %v, want %v", got, want)
  70. }
  71. if got, want := req.Header.Get(headerName), originalURL; got != want {
  72. t.Errorf("res.Header.Get(%q): got %v, want %v", headerName, got, want)
  73. }
  74. res := proxyutil.NewResponse(200, nil, req)
  75. if err := fg.ModifyResponse(res); err != nil {
  76. t.Fatalf("resmod.ModifyResponse(): got %v, want no error", err)
  77. }
  78. if got, want := res.Header.Get(headerName), originalURL; got != want {
  79. t.Errorf("res.Header.Get(%q): got %q, want %q", headerName, got, want)
  80. }
  81. }
  82. func TestStashInvalidHeaderName(t *testing.T) {
  83. mod := NewModifier("invalid-chars-actually-work-;><@")
  84. req, err := http.NewRequest("GET", "http://example.com", nil)
  85. if err != nil {
  86. t.Fatalf("NewRequest(): got %v, want no error", err)
  87. }
  88. if err := mod.ModifyRequest(req); err != nil {
  89. t.Fatalf("smod.ModifyRequest(): got %v, want no error", err)
  90. }
  91. if got, want := req.Header.Get("invalid-chars-actually-work-;><@"), "http://example.com"; got != want {
  92. t.Errorf("stashed-url header: got %v, want %v", got, want)
  93. }
  94. }
  95. func TestModiferFromJSON(t *testing.T) {
  96. headerName := "stashed-url"
  97. originalURL := "http://example.com"
  98. msg := []byte(`{
  99. "fifo.Group": {
  100. "scope": ["request", "response"],
  101. "modifiers": [
  102. {
  103. "stash.Modifier": {
  104. "scope": ["request", "response"],
  105. "headerName": "stashed-url"
  106. }
  107. },
  108. {
  109. "port.Modifier": {
  110. "scope": ["request"],
  111. "port": 8080
  112. }
  113. }
  114. ]
  115. }
  116. }`)
  117. r, err := parse.FromJSON(msg)
  118. if err != nil {
  119. t.Fatalf("parse.FromJSON(): got %v, want no error", err)
  120. }
  121. reqmod := r.RequestModifier()
  122. if reqmod == nil {
  123. t.Fatal("reqmod: got nil, want not nil")
  124. }
  125. req, err := http.NewRequest("GET", originalURL, nil)
  126. if err != nil {
  127. t.Fatalf("NewRequest(): got %v, want no error", err)
  128. }
  129. if err := reqmod.ModifyRequest(req); err != nil {
  130. t.Fatalf("ModifyRequest(): got %v, want no error", err)
  131. }
  132. _, port, err := net.SplitHostPort(req.URL.Host)
  133. if err != nil {
  134. t.Fatalf("net.SplitHostPort(%q): got %v, want no error", req.URL.Host, err)
  135. }
  136. if got, want := port, "8080"; got != want {
  137. t.Errorf("port: got %v, want %v", got, want)
  138. }
  139. if got, want := req.Header.Get(headerName), originalURL; got != want {
  140. t.Errorf("req.Header.Get(%q) header: got %v, want %v", headerName, got, want)
  141. }
  142. resmod := r.ResponseModifier()
  143. res := proxyutil.NewResponse(200, nil, req)
  144. if err := resmod.ModifyResponse(res); err != nil {
  145. t.Fatalf("resmod.ModifyResponse(): got %v, want no error", err)
  146. }
  147. if got, want := res.Header.Get(headerName), originalURL; got != want {
  148. t.Errorf("res.Header.Get(%q): got %q, want %q", headerName, got, want)
  149. }
  150. }
  151. func TestModiferFromJSONInvalidConfigurations(t *testing.T) {
  152. msg := []byte(`{
  153. "stash.Modifier": {
  154. "scope": ["response"],
  155. "headerName": "stash-header"
  156. }
  157. }`)
  158. _, err := parse.FromJSON(msg)
  159. if err == nil {
  160. t.Fatalf("parseFromJSON(msg): Got no error, but should have gotten one.")
  161. }
  162. }