@@ -104,3 +104,80 @@ func TestContext(t *testing.T) {
104
104
t .Fatal (err )
105
105
}
106
106
}
107
+
108
+ func Test_convertH1ReqToH2_with_POST (t * testing.T ) {
109
+ postBody := "Some POST Body"
110
+
111
+ r , err := http .NewRequest ("POST" , "http://localhost:80" , bytes .NewBufferString (postBody ))
112
+ if err != nil {
113
+ t .Fatal (err )
114
+ }
115
+
116
+ r .Header .Set ("Upgrade" , "h2c" )
117
+ r .Header .Set ("Connection" , "Upgrade, HTTP2-Settings" )
118
+ r .Header .Set ("HTTP2-Settings" , "AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA" ) // Some Default Settings
119
+ h2Bytes , _ , err := convertH1ReqToH2 (r )
120
+
121
+ if err != nil {
122
+ t .Fatal (err )
123
+ }
124
+
125
+ // Read off the preface
126
+ preface := []byte (http2 .ClientPreface )
127
+ if h2Bytes .Len () < len (preface ) {
128
+ t .Fatal ("Could not read HTTP/2 ClientPreface" )
129
+ }
130
+ readPreface := h2Bytes .Next (len (preface ))
131
+ if string (readPreface ) != http2 .ClientPreface {
132
+ t .Fatalf ("Expected Preface %s but got: %s" , http2 .ClientPreface , string (readPreface ))
133
+ }
134
+
135
+ framer := http2 .NewFramer (nil , h2Bytes )
136
+
137
+ // Should get a SETTINGS, HEADERS, and then DATA
138
+ expectedFrameTypes := []http2.FrameType {http2 .FrameSettings , http2 .FrameHeaders , http2 .FrameData }
139
+ for frameNumber := 0 ; h2Bytes .Len () > 0 ; {
140
+ frame , err := framer .ReadFrame ()
141
+ fmt .Printf ("%+v\n " , frame )
142
+ if err != nil {
143
+ t .Fatal (err )
144
+ }
145
+
146
+ if frameNumber >= len (expectedFrameTypes ) {
147
+ t .Fatalf ("Expected only %d frames but received extra" , len (expectedFrameTypes ))
148
+ }
149
+
150
+ if frame .Header ().Type != expectedFrameTypes [frameNumber ] {
151
+ t .Fatalf ("Expected FrameType %v, got %v" , expectedFrameTypes [frameNumber ], frame .Header ().Type )
152
+ }
153
+
154
+ frameNumber += 1
155
+
156
+ switch f := frame .(type ) {
157
+ case * http2.SettingsFrame :
158
+ if frameNumber != 1 {
159
+ t .Fatalf ("Expected SETTINGS frame to be frame 1, but is frame %d" , frameNumber )
160
+ }
161
+ case * http2.HeadersFrame :
162
+ if frameNumber != 2 {
163
+ t .Fatalf ("Expected HEADERS frame to be frame 2, but is frame %d" , frameNumber )
164
+ }
165
+ if f .FrameHeader .StreamID != 1 {
166
+ t .Fatalf ("Expected StreamId 1, got %v" , f .FrameHeader .StreamID )
167
+ }
168
+ case * http2.DataFrame :
169
+ if frameNumber != 3 {
170
+ t .Fatalf ("Expected DATA frame to be frame 2, but is frame %d" , frameNumber )
171
+ }
172
+ if f .FrameHeader .StreamID != 1 {
173
+ t .Fatalf ("Expected StreamId 1, got %v" , f .FrameHeader .StreamID )
174
+ }
175
+
176
+ body := string (f .Data ())
177
+
178
+ if body != postBody {
179
+ t .Fatalf ("Expected DATA body %s but got %s" , postBody , body )
180
+ }
181
+ }
182
+ }
183
+ }
0 commit comments