5
5
"encoding/json"
6
6
"net/http"
7
7
"net/url"
8
+ "strings"
8
9
"time"
9
10
10
11
"github.com/containers/podman/v3/libpod"
@@ -31,7 +32,7 @@ func ListVolumes(w http.ResponseWriter, r *http.Request) {
31
32
}
32
33
33
34
if err := decoder .Decode (& query , r .URL .Query ()); err != nil {
34
- utils .Error (w , http .StatusText (http .StatusBadRequest ), http .StatusBadRequest ,
35
+ utils .Error (w , http .StatusText (http .StatusInternalServerError ), http .StatusInternalServerError ,
35
36
errors .Wrapf (err , "failed to parse parameters for %s" , r .URL .String ()))
36
37
return
37
38
}
@@ -40,7 +41,7 @@ func ListVolumes(w http.ResponseWriter, r *http.Request) {
40
41
// happily parse them for us.
41
42
for filter := range query .Filters {
42
43
if filter == "opts" {
43
- utils .Error (w , http .StatusText (http .StatusBadRequest ), http .StatusBadRequest ,
44
+ utils .Error (w , http .StatusText (http .StatusInternalServerError ), http .StatusInternalServerError ,
44
45
errors .Errorf ("unsupported libpod filters passed to docker endpoint" ))
45
46
return
46
47
}
@@ -90,7 +91,7 @@ func CreateVolume(w http.ResponseWriter, r *http.Request) {
90
91
/* No query string data*/
91
92
query := struct {}{}
92
93
if err := decoder .Decode (& query , r .URL .Query ()); err != nil {
93
- utils .Error (w , http .StatusText (http .StatusBadRequest ), http .StatusBadRequest ,
94
+ utils .Error (w , http .StatusText (http .StatusInternalServerError ), http .StatusInternalServerError ,
94
95
errors .Wrapf (err , "failed to parse parameters for %s" , r .URL .String ()))
95
96
return
96
97
}
@@ -218,7 +219,7 @@ func RemoveVolume(w http.ResponseWriter, r *http.Request) {
218
219
}
219
220
220
221
if err := decoder .Decode (& query , r .URL .Query ()); err != nil {
221
- utils .Error (w , http .StatusText (http .StatusBadRequest ), http .StatusBadRequest ,
222
+ utils .Error (w , http .StatusText (http .StatusInternalServerError ), http .StatusInternalServerError ,
222
223
errors .Wrapf (err , "failed to parse parameters for %s" , r .URL .String ()))
223
224
return
224
225
}
@@ -263,25 +264,24 @@ func RemoveVolume(w http.ResponseWriter, r *http.Request) {
263
264
func PruneVolumes (w http.ResponseWriter , r * http.Request ) {
264
265
var (
265
266
runtime = r .Context ().Value ("runtime" ).(* libpod.Runtime )
266
- decoder = r .Context ().Value ("decoder" ).(* schema.Decoder )
267
267
)
268
- // For some reason the prune filters are query parameters even though this
269
- // is a POST endpoint
270
- query := struct {
271
- Filters map [string ][]string `schema:"filters"`
272
- }{
273
- // override any golang type defaults
274
- }
275
-
276
- if err := decoder .Decode (& query , r .URL .Query ()); err != nil {
277
- utils .Error (w , "Something went wrong." , http .StatusBadRequest , errors .Wrapf (err , "failed to parse parameters for %s" , r .URL .String ()))
268
+ filtersList , err := filtersFromRequest (r )
269
+ if err != nil {
270
+ utils .Error (w , "Something went wrong." , http .StatusInternalServerError , errors .Wrap (err , "Decode()" ))
278
271
return
279
272
}
273
+ filterMap := map [string ][]string {}
274
+ for _ , filter := range filtersList {
275
+ split := strings .SplitN (filter , "=" , 2 )
276
+ if len (split ) > 1 {
277
+ filterMap [split [0 ]] = append (filterMap [split [0 ]], split [1 ])
278
+ }
279
+ }
280
280
281
- f := (url .Values )(query . Filters )
281
+ f := (url .Values )(filterMap )
282
282
filterFuncs , err := filters .GenerateVolumeFilters (f )
283
283
if err != nil {
284
- utils .Error (w , "Something when wrong." , http .StatusBadRequest , errors .Wrapf (err , "failed to parse filters for %s" , f .Encode ()))
284
+ utils .Error (w , "Something when wrong." , http .StatusInternalServerError , errors .Wrapf (err , "failed to parse filters for %s" , f .Encode ()))
285
285
return
286
286
}
287
287
0 commit comments