88 "mime"
99 "net"
1010 "net/http"
11+ "net/url"
1112 "path/filepath"
1213 "strings"
1314
@@ -102,11 +103,9 @@ func ClientIP(r *http.Request) (clientIP string) {
102103 return
103104}
104105
105- //
106106// JSONStream uses json.Encoder to stream the JSON reponse body.
107107//
108108// This differs from the JSON helper which unmarshalls into memory first allowing the capture of JSON encoding errors.
109- //
110109func JSONStream (w http.ResponseWriter , status int , i interface {}) error {
111110 w .Header ().Set (ContentType , ApplicationJSON )
112111 w .WriteHeader (status )
@@ -218,10 +217,17 @@ func DecodeMultipartForm(r *http.Request, qp QueryParamsOption, maxMemory int64,
218217// NOTE: when includeQueryParams=true query params will be parsed and included eg. route /user?test=true 'test'
219218// is added to parsed JSON and replaces any values that may have been present
220219func DecodeJSON (r * http.Request , qp QueryParamsOption , maxMemory int64 , v interface {}) (err error ) {
221- var body io.Reader = r .Body
222- if encoding := r .Header .Get (ContentEncoding ); encoding == Gzip {
220+ var values url.Values
221+ if qp == QueryParams {
222+ values = r .URL .Query ()
223+ }
224+ return decodeJSON (r .Header , r .Body , qp , values , maxMemory , v )
225+ }
226+
227+ func decodeJSON (headers http.Header , body io.Reader , qp QueryParamsOption , values url.Values , maxMemory int64 , v interface {}) (err error ) {
228+ if encoding := headers .Get (ContentEncoding ); encoding == Gzip {
223229 var gzr * gzip.Reader
224- gzr , err = gzip .NewReader (r . Body )
230+ gzr , err = gzip .NewReader (body )
225231 if err != nil {
226232 return
227233 }
@@ -232,7 +238,7 @@ func DecodeJSON(r *http.Request, qp QueryParamsOption, maxMemory int64, v interf
232238 }
233239 err = json .NewDecoder (ioext .LimitReader (body , maxMemory )).Decode (v )
234240 if qp == QueryParams && err == nil {
235- err = DecodeQueryParams ( r , v )
241+ err = decodeQueryParams ( values , v )
236242 }
237243 return
238244}
@@ -245,10 +251,17 @@ func DecodeJSON(r *http.Request, qp QueryParamsOption, maxMemory int64, v interf
245251// NOTE: when includeQueryParams=true query params will be parsed and included eg. route /user?test=true 'test'
246252// is added to parsed XML and replaces any values that may have been present
247253func DecodeXML (r * http.Request , qp QueryParamsOption , maxMemory int64 , v interface {}) (err error ) {
248- var body io.Reader = r .Body
249- if encoding := r .Header .Get (ContentEncoding ); encoding == Gzip {
254+ var values url.Values
255+ if qp == QueryParams {
256+ values = r .URL .Query ()
257+ }
258+ return decodeXML (r .Header , r .Body , qp , values , maxMemory , v )
259+ }
260+
261+ func decodeXML (headers http.Header , body io.Reader , qp QueryParamsOption , values url.Values , maxMemory int64 , v interface {}) (err error ) {
262+ if encoding := headers .Get (ContentEncoding ); encoding == Gzip {
250263 var gzr * gzip.Reader
251- gzr , err = gzip .NewReader (r . Body )
264+ gzr , err = gzip .NewReader (body )
252265 if err != nil {
253266 return
254267 }
@@ -259,14 +272,18 @@ func DecodeXML(r *http.Request, qp QueryParamsOption, maxMemory int64, v interfa
259272 }
260273 err = xml .NewDecoder (ioext .LimitReader (body , maxMemory )).Decode (v )
261274 if qp == QueryParams && err == nil {
262- err = DecodeQueryParams ( r , v )
275+ err = decodeQueryParams ( values , v )
263276 }
264277 return
265278}
266279
267280// DecodeQueryParams takes the URL Query params flag.
268281func DecodeQueryParams (r * http.Request , v interface {}) (err error ) {
269- err = DefaultFormDecoder .Decode (v , r .URL .Query ())
282+ return decodeQueryParams (r .URL .Query (), v )
283+ }
284+
285+ func decodeQueryParams (values url.Values , v interface {}) (err error ) {
286+ err = DefaultFormDecoder .Decode (v , values )
270287 return
271288}
272289
@@ -275,7 +292,7 @@ const (
275292 nakedApplicationXML string = "application/xml"
276293)
277294
278- // Decode takes the request and attempts to discover it's content type via
295+ // Decode takes the request and attempts to discover its content type via
279296// the http headers and then decode the request body into the provided struct.
280297// Example if header was "application/json" would decode using
281298// json.NewDecoder(ioext.LimitReader(r.Body, maxMemory)).Decode(v).
0 commit comments