6
6
package methodoverride
7
7
8
8
import (
9
+ "encoding/json"
10
+ "net/url"
11
+ "reflect"
9
12
"strings"
10
13
11
- "github.com/go-rs/rest-api-framework"
14
+ rest "github.com/go-rs/rest-api-framework"
12
15
)
13
16
14
17
var (
@@ -28,6 +31,40 @@ func isValidMethod(method string) bool {
28
31
return false
29
32
}
30
33
34
+ /**
35
+ * Convert json to string
36
+ */
37
+ func jsonToString (val interface {}) string {
38
+ b , _ := json .Marshal (val )
39
+ return string (b )
40
+ }
41
+
42
+ /**
43
+ * High-level merge of request json into query
44
+ */
45
+ func mergeQuery (query url.Values , body map [string ]interface {}) url.Values {
46
+ for key , val := range body {
47
+ str , ok := val .(string )
48
+ if ok {
49
+ query .Add (key , str )
50
+ } else {
51
+ if reflect .TypeOf (val ).String () == "[]interface {}" {
52
+ for _ , val := range val .([]interface {}) {
53
+ str , ok = val .(string )
54
+ if ok {
55
+ query .Add (key , str )
56
+ } else {
57
+ query .Add (key , jsonToString (val ))
58
+ }
59
+ }
60
+ } else {
61
+ query .Add (key , jsonToString (val ))
62
+ }
63
+ }
64
+ }
65
+ return query
66
+ }
67
+
31
68
/**
32
69
* Method Override
33
70
*/
@@ -36,6 +73,16 @@ func Load() rest.Handler {
36
73
method := strings .ToUpper (ctx .Request .Header .Get (header ))
37
74
if method != "" && isValidMethod (method ) {
38
75
ctx .Set ("OriginalMethod" , ctx .Request .Method )
76
+ if ctx .Request .Method == "POST" && method == "GET" {
77
+
78
+ contentType := strings .ToLower (ctx .Request .Header .Get ("content-type" ))
79
+
80
+ if contentType == "application/json" {
81
+ ctx .Query = mergeQuery (ctx .Query , ctx .Body )
82
+ } else if len (ctx .Request .Form ) > 0 {
83
+ ctx .Query = ctx .Request .Form
84
+ }
85
+ }
39
86
ctx .Request .Method = method
40
87
}
41
88
}
0 commit comments