@@ -765,61 +765,119 @@ var _ = Describe("Proxy", func() {
765
765
Expect (resp .StatusCode ).To (Equal (http .StatusOK ))
766
766
})
767
767
768
- It ( "can simultaneously read request and write response " , func () {
769
- contentLength := len ( "message 0 \n " ) * 10
770
- ln := test_util . RegisterConnHandler ( r , "read-write" , func ( conn * test_util. HttpConn ) {
771
- defer conn . Close ( )
768
+ Context ( "when concurrent read write is not enabled " , func () {
769
+ BeforeEach ( func () {
770
+ conf . EnableHTTP1ConcurrentReadWrite = false
771
+ } )
772
772
773
- req , err := http .ReadRequest (conn .Reader )
774
- Expect (err ).NotTo (HaveOccurred ())
775
- defer req .Body .Close ()
773
+ It ("can not simultaneously read request and write response" , func () {
774
+ contentLength := len ("message 0\n " ) * 10
775
+ ln := test_util .RegisterConnHandler (r , "read-write" , func (conn * test_util.HttpConn ) {
776
+ defer conn .Close ()
777
+
778
+ req , err := http .ReadRequest (conn .Reader )
779
+ Expect (err ).NotTo (HaveOccurred ())
780
+ defer req .Body .Close ()
781
+
782
+ conn .Writer .WriteString ("HTTP/1.1 200 OK\r \n " +
783
+ "Connection: keep-alive\r \n " +
784
+ "Content-Type: text/plain\r \n " +
785
+ fmt .Sprintf ("Content-Length: %d\r \n " , contentLength ) +
786
+ "\r \n " )
787
+ conn .Writer .Flush ()
788
+ reader := bufio .NewReader (req .Body )
776
789
777
- conn .Writer .WriteString ("HTTP/1.1 200 OK\r \n " +
790
+ for i := 0 ; i < 10 ; i ++ {
791
+ // send back the received message
792
+ line , err := reader .ReadString ('\n' )
793
+ if err != nil {
794
+ break
795
+ }
796
+ conn .Writer .Write ([]byte (line ))
797
+ conn .Writer .Flush ()
798
+ }
799
+ })
800
+ defer ln .Close ()
801
+
802
+ conn := dialProxy (proxyServer )
803
+ // the test is hanging when fix is not implemented
804
+ conn .SetReadDeadline (time .Now ().Add (5 * time .Second ))
805
+
806
+ conn .Writer .Write ([]byte ("GET / HTTP/1.1\r \n " +
807
+ "Host: read-write\r \n " +
778
808
"Connection: keep-alive\r \n " +
779
809
"Content-Type: text/plain\r \n " +
780
810
fmt .Sprintf ("Content-Length: %d\r \n " , contentLength ) +
781
- "\r \n " )
811
+ "\r \n " ,
812
+ ))
782
813
conn .Writer .Flush ()
783
- reader := bufio .NewReader (req .Body )
784
814
785
- for i := 0 ; i < 10 ; i ++ {
786
- // send back the received message
787
- line , err := reader .ReadString ('\n' )
788
- if err != nil {
789
- break
790
- }
791
- conn .Writer .Write ([]byte (line ))
792
- conn .Writer .Flush ()
793
- }
815
+ _ , err := http .ReadResponse (conn .Reader , & http.Request {})
816
+ Expect (err ).To (HaveOccurred ())
794
817
})
795
- defer ln . Close ( )
818
+ } )
796
819
797
- conn := dialProxy (proxyServer )
798
- // the test is hanging when fix is not implemented
799
- conn .SetReadDeadline (time .Now ().Add (5 * time .Second ))
800
-
801
- conn .Writer .Write ([]byte ("GET / HTTP/1.1\r \n " +
802
- "Host: read-write\r \n " +
803
- "Connection: keep-alive\r \n " +
804
- "Content-Type: text/plain\r \n " +
805
- fmt .Sprintf ("Content-Length: %d\r \n " , contentLength ) +
806
- "\r \n " ,
807
- ))
808
- conn .Writer .Flush ()
820
+ Context ("when concurrent read write is enabled" , func () {
821
+ BeforeEach (func () {
822
+ conf .EnableHTTP1ConcurrentReadWrite = true
823
+ })
809
824
810
- resp , err := http .ReadResponse (conn .Reader , & http.Request {})
811
- Expect (err ).NotTo (HaveOccurred ())
812
- defer resp .Body .Close ()
813
- reader := bufio .NewReader (resp .Body )
825
+ It ("can simultaneously read request and write response" , func () {
826
+ contentLength := len ("message 0\n " ) * 10
827
+ ln := test_util .RegisterConnHandler (r , "read-write" , func (conn * test_util.HttpConn ) {
828
+ defer conn .Close ()
829
+
830
+ req , err := http .ReadRequest (conn .Reader )
831
+ Expect (err ).NotTo (HaveOccurred ())
832
+ defer req .Body .Close ()
833
+
834
+ conn .Writer .WriteString ("HTTP/1.1 200 OK\r \n " +
835
+ "Connection: keep-alive\r \n " +
836
+ "Content-Type: text/plain\r \n " +
837
+ fmt .Sprintf ("Content-Length: %d\r \n " , contentLength ) +
838
+ "\r \n " )
839
+ conn .Writer .Flush ()
840
+ reader := bufio .NewReader (req .Body )
841
+
842
+ for i := 0 ; i < 10 ; i ++ {
843
+ // send back the received message
844
+ line , err := reader .ReadString ('\n' )
845
+ if err != nil {
846
+ break
847
+ }
848
+ conn .Writer .Write ([]byte (line ))
849
+ conn .Writer .Flush ()
850
+ }
851
+ })
852
+ defer ln .Close ()
814
853
815
- for i := 0 ; i < 10 ; i ++ {
816
- message := fmt .Sprintf ("message %d\n " , i )
817
- conn .Writer .Write ([]byte (message ))
854
+ conn := dialProxy (proxyServer )
855
+ // the test is hanging when fix is not implemented
856
+ conn .SetReadDeadline (time .Now ().Add (5 * time .Second ))
857
+
858
+ conn .Writer .Write ([]byte ("GET / HTTP/1.1\r \n " +
859
+ "Host: read-write\r \n " +
860
+ "Connection: keep-alive\r \n " +
861
+ "Content-Type: text/plain\r \n " +
862
+ fmt .Sprintf ("Content-Length: %d\r \n " , contentLength ) +
863
+ "\r \n " ,
864
+ ))
818
865
conn .Writer .Flush ()
819
- line , err := reader .ReadString ('\n' )
866
+
867
+ resp , err := http .ReadResponse (conn .Reader , & http.Request {})
820
868
Expect (err ).NotTo (HaveOccurred ())
821
- Expect (line ).To (Equal (message ))
822
- }
869
+ defer resp .Body .Close ()
870
+ reader := bufio .NewReader (resp .Body )
871
+
872
+ for i := 0 ; i < 10 ; i ++ {
873
+ message := fmt .Sprintf ("message %d\n " , i )
874
+ conn .Writer .Write ([]byte (message ))
875
+ conn .Writer .Flush ()
876
+ line , err := reader .ReadString ('\n' )
877
+ Expect (err ).NotTo (HaveOccurred ())
878
+ Expect (line ).To (Equal (message ))
879
+ }
880
+ })
823
881
})
824
882
825
883
It ("retries on POST requests if nothing was written" , func () {
0 commit comments