diff --git a/.travis.yml b/.travis.yml
index 59eff99..6c27f31 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,6 @@
language: go
go:
- - 1.11
+ - 1.12
script:
- make test
diff --git a/README.md b/README.md
index 2f7fc86..d52cb4d 100644
--- a/README.md
+++ b/README.md
@@ -238,8 +238,13 @@ You can use variable data in response. The variables will be defined as tags lik
- request.url (full url with scheme, hostname, port, path and query parameters)
- request.autority (return scheme, hostname and port (optional))
- request.body
- - request.body."*key*" (both `application/json` and `application/x-www-form-urlencoded requests)
- - request.body."*deep*"."*key*" (only for `application/json` requests)
+
+You can extract information from the request body too, using a dot notation path:
+
+ - request.body."*key*" (support for `application/json`, `application/xml` and `application/x-www-form-urlencoded` requests)
+ - request.body."*deep*"."*key*" (support for `application/json`, `application/xml` requests)
+
+Quick overview of the path syntax available to extract values form the request: [https://github.com/tidwall/gjson#path-syntax] (https://github.com/tidwall/gjson#path-syntax)
**External streams:** Perfect for embedding big payloads or getting data from another service.
@@ -546,7 +551,7 @@ You can always disable this behavior adding the following flag `-server-statisti
Clone this repository to ```$GOPATH/src/github.com/jmartin82/mmock``` and type ```go get .```.
-Requires Go 1.11+ to build.
+Requires Go 1.12+ to build.
If you make any changes, run ```go fmt ./...``` before submitting a pull request.
diff --git a/go.mod b/go.mod
index a3a4116..0029680 100644
--- a/go.mod
+++ b/go.mod
@@ -1,29 +1,21 @@
module github.com/jmartin82/mmock
+go 1.12
+
require (
github.com/azer/url-router v0.0.0-20140924232216-1a0aa252538c
github.com/basgys/goxml2json v1.1.0
- github.com/bitly/go-simplejson v0.5.0 // indirect
- github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect
- github.com/corpix/uarand v0.0.0 // indirect
+ github.com/corpix/uarand v0.1.0 // indirect
github.com/elazarl/go-bindata-assetfs v1.0.0
- github.com/fatih/color v1.7.0 // indirect
github.com/ghodss/yaml v1.0.0
github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428
github.com/joeljunstrom/go-luhn v0.0.0-20190413165225-1e071b33b576
- github.com/kr/pretty v0.1.0 // indirect
github.com/labstack/echo v3.3.10+incompatible
- github.com/labstack/gommon v0.2.8 // indirect
- github.com/mattn/go-colorable v0.1.1 // indirect
- github.com/mattn/go-isatty v0.0.7 // indirect
- github.com/myesui/uuid v1.0.0 // indirect
+ github.com/labstack/gommon v0.2.9 // indirect
github.com/radovskyb/watcher v1.0.6
- github.com/rakyll/gotest v0.0.0-20180125184505-86f0749cd8cc // indirect
github.com/ryanuber/go-glob v1.0.0
github.com/stathat/go v1.0.0
- github.com/stretchr/testify v1.3.0 // indirect
+ github.com/tidwall/gjson v1.3.2
github.com/twinj/uuid v1.0.0
- github.com/valyala/fasttemplate v1.0.1 // indirect
- golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c
- gopkg.in/yaml.v2 v2.2.2 // indirect
+ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80
)
diff --git a/go.sum b/go.sum
index 8c11322..59f9265 100644
--- a/go.sum
+++ b/go.sum
@@ -1,54 +1,49 @@
+github.com/Masterminds/glide v0.13.2/go.mod h1:STyF5vcenH/rUqTEv+/hBXlSTo7KYwg2oc2f4tzPWic=
+github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
+github.com/Masterminds/vcs v1.13.0/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA=
github.com/azer/url-router v0.0.0-20140924232216-1a0aa252538c h1:vpYPra7G75NhuxN28VqQhTepM8a6c201AsJWdRaINqY=
github.com/azer/url-router v0.0.0-20140924232216-1a0aa252538c/go.mod h1:YT0FE3RD8ecPJBNkCdpeEAdZXPZgD2CqcRtpwuzjt9M=
github.com/basgys/goxml2json v1.1.0 h1:4ln5i4rseYfXNd86lGEB+Vi652IsIXIvggKM/BhUKVw=
github.com/basgys/goxml2json v1.1.0/go.mod h1:wH7a5Np/Q4QoECFIU8zTQlZwZkrilY0itPfecMw41Dw=
-github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
-github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
-github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
-github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
-github.com/corpix/uarand v0.0.0 h1:mNbzro1GwUcZ1hmO2rWXytkR3JBxNxxctzjyuhO+Aig=
-github.com/corpix/uarand v0.0.0/go.mod h1:JSm890tOkDN+M1jqN8pUGDKnzJrsVbJwSMHBY4zwz7M=
-github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
+github.com/codegangsta/cli v1.20.0/go.mod h1:/qJNoX69yVSKu5o4jLyXAENLRyk1uhi7zkbQ3slBdOA=
+github.com/corpix/uarand v0.1.0 h1:HgE/0ismPNM4n3z2VeZxzwpMJiN4uSZ+SMpxxvoyffY=
+github.com/corpix/uarand v0.1.0/go.mod h1:SFKZvkcRoLqVRFZ4u25xPmp6m9ktANfbpXZ7SJ0/FNU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
-github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428 h1:Mo9W14pwbO9VfRe+ygqZ8dFbPpoIK1HFrG/zjTuQ+nc=
github.com/icrowley/fake v0.0.0-20180203215853-4178557ae428/go.mod h1:uhpZMVGznybq1itEKXj6RYw9I71qK4kH+OGMjRC4KEo=
github.com/joeljunstrom/go-luhn v0.0.0-20190413165225-1e071b33b576 h1:k82KNEG8vk59eHv/8xwBUh4dSR/t1wPiht4aDJm0SOY=
github.com/joeljunstrom/go-luhn v0.0.0-20190413165225-1e071b33b576/go.mod h1:pE5zuSeg07RZZfWS158WpV7oUWb1++8T2jZ/UklLM3E=
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
-github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0=
-github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
-github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
-github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
-github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc=
-github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
-github.com/myesui/uuid v1.0.0 h1:xCBmH4l5KuvLYc5L7AS7SZg9/jKdIFubM7OVoLqaQUI=
-github.com/myesui/uuid v1.0.0/go.mod h1:2CDfNgU0LR8mIdO8vdWd8i9gWWxLlcoIGGpSNgafq84=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/labstack/gommon v0.2.9 h1:heVeuAYtevIQVYkGj6A41dtfT91LrvFG220lavpWhrU=
+github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4=
+github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
+github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/ngdinhtoan/glide-cleanup v0.2.0/go.mod h1:UQzsmiDOb8YV3nOsCxK/c9zPpCZVNoHScRE3EO9pVMM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/radovskyb/watcher v1.0.6 h1:8WIQ9UxEYMZjem1OwU7dVH94DXXk9mAIE1i8eqHD+IY=
github.com/radovskyb/watcher v1.0.6/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg=
-github.com/rakyll/gotest v0.0.0-20180125184505-86f0749cd8cc h1:hrzpgS8mnUi65ieVrD3TKJMxHP84bzmybMTQIdK/XhM=
-github.com/rakyll/gotest v0.0.0-20180125184505-86f0749cd8cc/go.mod h1:iln+RRtJaJ52lKwqrSmNgQYw32Fk16CgChX85eFqBgI=
github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=
github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/stathat/go v1.0.0 h1:HFIS5YkyaI6tXu7JXIRRZBLRvYstdNZm034zcCeaybI=
github.com/stathat/go v1.0.0/go.mod h1:+9Eg2szqkcOGWv6gfheJmBBsmq9Qf5KDbzy8/aYYR0c=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/tidwall/gjson v1.3.2 h1:+7p3qQFaH3fOMXAJSrdZwGKcOO/lYdGS0HqGhPqDdTI=
+github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls=
+github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc=
+github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
+github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/twinj/uuid v1.0.0 h1:fzz7COZnDrXGTAOHGuUGYd6sG+JMq+AoE7+Jlu0przk=
github.com/twinj/uuid v1.0.0/go.mod h1:mMgcE1RHFUFqe5AfiwlINXisXfDGro23fWdPUfOMjRY=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
@@ -57,14 +52,13 @@ github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8W
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c h1:uOCk1iQW6Vc18bnC13MfzScl+wdKBmM9Y9kU7Z83/lw=
-golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/internal/vars/evaluator_test.go b/internal/vars/evaluator_test.go
index 8f50ecf..b0bbae7 100644
--- a/internal/vars/evaluator_test.go
+++ b/internal/vars/evaluator_test.go
@@ -446,13 +446,19 @@ func TestReplaceJsonBodyEncodedTags(t *testing.T) {
"email": "hilari@hilarimoragrega.com",
"age": 34,
"height": 5.66,
- "weight": null,
+ "weight": ,
"active": true,
"level": -8,
- "friends": ["jordi.martin@gmail.com","alfons.faubert@gmail.com"],
+ "friends": [
+ "jordi.martin@gmail.com",
+ "alfons.faubert@gmail.com"
+ ],
"first-friend": "jordi.martin@gmail.com",
"last-friend": "alfons.faubert@gmail.com",
- "attributes": {"programming":15,"trolling":27},
+ "attributes": {
+ "programming": 15,
+ "trolling": 27
+ },
"tracking": {
"uuid": "0bd74115-2307-458f-8288-b726724045ef",
"deeper": {
@@ -461,7 +467,84 @@ func TestReplaceJsonBodyEncodedTags(t *testing.T) {
}
}
`
+ mock := mock.Definition{Request: req, Response: res}
+ varsProcessor := getProcessor()
+ varsProcessor.Eval(&req, &mock)
+ if mock.Response.Body != expected {
+ t.Error("Replaced tags from body form do not match", mock.Response.Body)
+ }
+}
+
+func TestReplaceXmlBodyEncodedTags(t *testing.T) {
+ req := mock.Request{}
+ req.Headers = make(mock.Values)
+ req.Headers["Content-Type"] = []string{"application/xml"}
+ req.Body = `
+
+
+ true
+ 34
+
+ 15
+ 27
+
+ hilari@hilarimoragrega.com
+
+ jordi.martin@gmail.com
+ alfons.faubert@gmail.com
+
+ 5.66
+ -8
+
+ do not return
+
+ nesting is ok
+
+ 0bd74115-2307-458f-8288-b726724045ef
+
+
+`
+ res := mock.Response{}
+ res.Body = `
+
+
+ {{request.root.body.active}}
+ {{request.body.root.email}}
+ {{request.body.root.email}}
+
+ {{request.body.root.friends.element.0}}
+ {{request.body.root.friends.element.1}}
+
+ {{request.body.root.level}}
+
+
+ {{request.body.root.tracking.nesting.level}}
+
+ {{request.body.root.tracking.uuid}}
+
+
+`
+
+ expected := `
+
+
+ {{request.root.body.active}}
+ hilari@hilarimoragrega.com
+ hilari@hilarimoragrega.com
+
+ jordi.martin@gmail.com
+ alfons.faubert@gmail.com
+
+ -8
+
+
+ nesting is ok
+
+ 0bd74115-2307-458f-8288-b726724045ef
+
+
+`
mock := mock.Definition{Request: req, Response: res}
varsProcessor := getProcessor()
varsProcessor.Eval(&req, &mock)
diff --git a/internal/vars/request.go b/internal/vars/request.go
index e2f1441..2a23f60 100644
--- a/internal/vars/request.go
+++ b/internal/vars/request.go
@@ -1,16 +1,17 @@
package vars
import (
- "encoding/json"
"fmt"
- "github.com/jmartin82/mmock/pkg/mock"
"net/url"
"os"
"sort"
- "strconv"
"strings"
+ "github.com/jmartin82/mmock/pkg/mock"
+
urlmatcher "github.com/azer/url-router"
+ xj "github.com/basgys/goxml2json"
+ "github.com/tidwall/gjson"
)
type Request struct {
@@ -164,14 +165,14 @@ func (rp Request) getHeaderParam(name string) (string, bool) {
}
func (rp Request) getBodyParam(name string) (string, bool) {
-
contentType, found := rp.Request.Headers["Content-Type"]
if !found {
return "", false
}
-
if strings.HasPrefix(contentType[0], "application/x-www-form-urlencoded") {
return rp.getUrlEncodedFormBodyParam(name)
+ } else if strings.HasPrefix(contentType[0], "application/xml") {
+ return rp.getXmlBodyParam(name)
} else if strings.HasPrefix(contentType[0], "application/json") {
return rp.getJsonBodyParam(name)
}
@@ -179,69 +180,45 @@ func (rp Request) getBodyParam(name string) (string, bool) {
return "", false
}
-func (rp Request) getUrlEncodedFormBodyParam(name string) (string, bool) {
-
- values, err := url.ParseQuery(rp.Request.Body)
+func (rp Request) getXmlBodyParam(name string) (string, bool) {
+ xml := strings.NewReader(rp.Request.Body)
+ json, err := xj.Convert(xml)
if err != nil {
return "", false
}
- value := values.Get(name)
- if value == "" {
+ value := gjson.Get(json.String(), name)
+ if !value.Exists() {
return "", false
}
- return value, true
-}
-
-func (rp Request) getJsonBodyParam(name string) (string, bool) {
-
- hierarchy := strings.Split(name, ".")
-
- var payload interface{}
- if err := json.Unmarshal([]byte(rp.Request.Body), &payload); err != nil {
+ //TODO: Add support to complex types extraction like arrays or maps
+ if value.Type == gjson.JSON {
return "", false
}
- for _, value := range hierarchy {
- if mapper, ok := payload.(map[string]interface{}); ok {
- payload, ok = mapper[value]
-
- if !ok {
- return "", false
- }
-
- continue
- }
-
- if arrayMapper, ok := payload.([]interface{}); ok {
- index, err := strconv.Atoi(value)
-
- if err != nil || index >= len(arrayMapper) {
- return "", false
- }
+ return value.String(), true
+}
- payload = arrayMapper[index]
- continue
- }
+func (rp Request) getJsonBodyParam(name string) (string, bool) {
+ value := gjson.Get(rp.Request.Body, name)
+ if !value.Exists() {
+ return "", false
}
-
- return rp.getJsonValue(payload)
+ return value.String(), true
}
-func (rp Request) getJsonValue(object interface{}) (string, bool) {
-
- stringContent, ok := object.(string)
+func (rp Request) getUrlEncodedFormBodyParam(name string) (string, bool) {
- if ok {
- return stringContent, true
+ values, err := url.ParseQuery(rp.Request.Body)
+ if err != nil {
+ return "", false
}
- genericContent, err := json.Marshal(object)
-
- if err == nil {
- return string(genericContent), true
+ value := values.Get(name)
+ if value == "" {
+ return "", false
}
- return "", false
+ return value, true
}
diff --git a/internal/vars/stream_test.go b/internal/vars/stream_test.go
index 180c673..75770a7 100644
--- a/internal/vars/stream_test.go
+++ b/internal/vars/stream_test.go
@@ -44,7 +44,7 @@ func TestReadFile(t *testing.T) {
func TestHTTPContent(t *testing.T) {
st := Stream{}
- k := "http.contents(http://example.com)"
+ k := "http.contents(https://golang.org/)"
holders := []string{k}
result := st.Fill(holders)
@@ -53,7 +53,7 @@ func TestHTTPContent(t *testing.T) {
t.Errorf("Stream key not found")
}
- if !strings.Contains(v[0], "Example") {
+ if !strings.Contains(v[0], "Go") {
t.Errorf("Couldn't get the content. Value: %s", v)
}
}