@@ -88,13 +88,17 @@ func TestDecode(t *testing.T) {
8888 err := Decode (r , false , 16 << 10 , test )
8989 Equal (t , err , nil )
9090 })
91+ p .Post ("/decode3/:id" , func (w http.ResponseWriter , r * http.Request ) {
92+ err := Decode (r , true , 16 << 10 , test )
93+ Equal (t , err , nil )
94+ })
9195
9296 hf := p .Serve ()
9397
9498 form := url.Values {}
9599 form .Add ("Posted" , "value" )
96100
97- r , _ := http .NewRequest (http .MethodPost , "/decode/13 ?id=13" , strings .NewReader (form .Encode ()))
101+ r , _ := http .NewRequest (http .MethodPost , "/decode/14 ?id=13" , strings .NewReader (form .Encode ()))
98102 r .Header .Set (ContentType , ApplicationForm )
99103 w := httptest .NewRecorder ()
100104
@@ -105,6 +109,17 @@ func TestDecode(t *testing.T) {
105109 Equal (t , test .Posted , "value" )
106110 Equal (t , test .MultiPartPosted , "" )
107111
112+ r , _ = http .NewRequest (http .MethodPost , "/decode/14" , strings .NewReader (form .Encode ()))
113+ r .Header .Set (ContentType , ApplicationForm )
114+ w = httptest .NewRecorder ()
115+
116+ hf .ServeHTTP (w , r )
117+
118+ Equal (t , w .Code , http .StatusOK )
119+ Equal (t , test .ID , 14 )
120+ Equal (t , test .Posted , "value" )
121+ Equal (t , test .MultiPartPosted , "" )
122+
108123 test = new (TestStruct )
109124 r , _ = http .NewRequest (http .MethodPost , "/decode2/13" , strings .NewReader (form .Encode ()))
110125 r .Header .Set (ContentType , ApplicationForm )
@@ -161,6 +176,28 @@ func TestDecode(t *testing.T) {
161176 Equal (t , test .Posted , "" )
162177 Equal (t , test .MultiPartPosted , "value" )
163178
179+ body = & bytes.Buffer {}
180+ writer = multipart .NewWriter (body )
181+
182+ err = writer .WriteField ("MultiPartPosted" , "value" )
183+ Equal (t , err , nil )
184+
185+ // Don't forget to close the multipart writer.
186+ // If you don't close it, your request will be missing the terminating boundary.
187+ err = writer .Close ()
188+ Equal (t , err , nil )
189+
190+ test = new (TestStruct )
191+ r , _ = http .NewRequest (http .MethodPost , "/decode3/11" , body )
192+ r .Header .Set (ContentType , writer .FormDataContentType ())
193+ w = httptest .NewRecorder ()
194+
195+ hf .ServeHTTP (w , r )
196+ Equal (t , w .Code , http .StatusOK )
197+ Equal (t , test .ID , 11 )
198+ Equal (t , test .Posted , "" )
199+ Equal (t , test .MultiPartPosted , "value" )
200+
164201 jsonBody := `{"ID":13,"Posted":"value","MultiPartPosted":"value"}`
165202 test = new (TestStruct )
166203 r , _ = http .NewRequest (http .MethodPost , "/decode/13" , strings .NewReader (jsonBody ))
@@ -447,6 +484,46 @@ func TestXML(t *testing.T) {
447484 Equal (t , w .Body .String (), "xml: unsupported type: func()\n " )
448485}
449486
487+ func TestBadParseForm (t * testing.T ) {
488+
489+ // successful scenarios tested under TestDecode
490+
491+ p := New ()
492+ p .Get ("/users/:id" , func (w http.ResponseWriter , r * http.Request ) {
493+
494+ if err := ParseForm (r ); err != nil {
495+ if _ , errr := w .Write ([]byte (err .Error ())); errr != nil {
496+ panic (errr )
497+ }
498+ return
499+ }
500+ })
501+
502+ code , body := request (http .MethodGet , "/users/16?test=%2f%%efg" , p )
503+ Equal (t , code , http .StatusOK )
504+ Equal (t , body , "invalid URL escape \" %%e\" " )
505+ }
506+
507+ func TestBadParseMultiPartForm (t * testing.T ) {
508+
509+ // successful scenarios tested under TestDecode
510+
511+ p := New ()
512+ p .Get ("/users/:id" , func (w http.ResponseWriter , r * http.Request ) {
513+
514+ if err := ParseMultipartForm (r , 10 << 5 ); err != nil {
515+ if _ , errr := w .Write ([]byte (err .Error ())); errr != nil {
516+ panic (err )
517+ }
518+ return
519+ }
520+ })
521+
522+ code , body := requestMultiPart (http .MethodGet , "/users/16?test=%2f%%efg" , p )
523+ Equal (t , code , http .StatusOK )
524+ Equal (t , body , "invalid URL escape \" %%e\" " )
525+ }
526+
450527type gzipWriter struct {
451528 io.Writer
452529 http.ResponseWriter
0 commit comments