Skip to content

Commit 0bc2a75

Browse files
committed
Update grammar and add parsing support for urlQueryParam
1 parent 1a3d43f commit 0bc2a75

File tree

12 files changed

+36
-3
lines changed

12 files changed

+36
-3
lines changed

docs/grammar.md

+4-2
Large diffs are not rendered by default.

docs/spec/grammar/hurl.grammar

+3
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,7 @@ filter:
564564
| to-string-filter
565565
| url-decode-filter
566566
| url-encode-filter
567+
| url-query-param-filter
567568
| xpath-filter
568569

569570
base64-decode-filter: "base64Decode"
@@ -606,6 +607,8 @@ url-decode-filter: "urlDecode"
606607

607608
url-encode-filter: "urlEncode"
608609

610+
url-query-param-filter: "urlQueryParam" sp quoted-string
611+
609612
xpath-filter: "xpath" sp quoted-string
610613

611614

integration/hurlfmt/tests_export/filter.html

+1
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,6 @@
2424
<span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.id"</span> <span class="filter-type">toString</span> <span class="predicate-type">==</span> <span class="string">"123"</span></span> <span class="comment"># toString</span>
2525
<span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.encoded_url"</span> <span class="filter-type">urlDecode</span> <span class="predicate-type">==</span> <span class="string">"https://mozilla.org/?x=шеллы"</span></span> <span class="comment"># urlDecode</span>
2626
<span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.url"</span> <span class="filter-type">urlEncode</span> <span class="predicate-type">==</span> <span class="string">"https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"</span></span> <span class="comment"># urlEncode</span>
27+
<span class="line"><span class="query-type">jsonpath</span> <span class="string">"$.url"</span> <span class="filter-type">urlQueryParam</span> <span class="string">"token"</span> <span class="predicate-type">==</span> <span class="string">"XYZ"</span></span> <span class="comment"># urlQueryParam</span>
2728
<span class="line"><span class="query-type">bytes</span> <span class="filter-type">decode</span> <span class="string">"iso-8859-1"</span> <span class="filter-type">xpath</span> <span class="string">"string(//p)"</span> <span class="predicate-type">==</span> <span class="string">"Hello"</span></span> <span class="comment"># xpath</span>
2829
</span></span></code></pre>

integration/hurlfmt/tests_export/filter.hurl

100644100755
+1
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ jsonpath "$.id" toInt == 123
2424
jsonpath "$.id" toString == "123" # toString
2525
jsonpath "$.encoded_url" urlDecode == "https://mozilla.org/?x=шеллы" # urlDecode
2626
jsonpath "$.url" urlEncode == "https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B" # urlEncode
27+
jsonpath "$.url" urlQueryParam "token" == "XYZ" # urlQueryParam
2728
bytes decode "iso-8859-1" xpath "string(//p)" == "Hello" # xpath
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/dummy"},"response":{"status":200,"captures":[{"name":"count","query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"count"}]}],"asserts":[{"query":{"type":"jsonpath","expr":"$.data"},"filters":[{"type":"base64Decode"}],"predicate":{"type":"==","value":"SGVsbG8=","encoding":"base64"}},{"query":{"type":"bytes"},"filters":[{"type":"base64Encode"}],"predicate":{"type":"==","value":"SGVsbG8="}},{"query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"count"}],"predicate":{"type":"==","value":12}},{"query":{"type":"certificate","expr":"Expire-Date"},"filters":[{"type":"daysAfterNow"}],"predicate":{"type":">","value":15}},{"query":{"type":"certificate","expr":"Start-Date"},"filters":[{"type":"daysBeforeNow"}],"predicate":{"type":"<","value":100}},{"query":{"type":"bytes"},"filters":[{"type":"decode","encoding":"iso-8859-1"}],"predicate":{"type":"==","value":"café"}},{"query":{"type":"cookie","expr":"LSID[Expires]"},"filters":[{"type":"format","fmt":"%a, %d %b %Y %H:%M:%S"}],"predicate":{"type":"==","value":"Wed, 13 Jan 2021 22:23:01"}},{"query":{"type":"jsonpath","expr":"$.text"},"filters":[{"type":"htmlEscape"}],"predicate":{"type":"==","value":"a &gt; b"}},{"query":{"type":"jsonpath","expr":"$.escaped_html[1]"},"filters":[{"type":"htmlUnescape"}],"predicate":{"type":"==","value":"<p>Hello</p>"}},{"query":{"type":"variable","name":"books"},"filters":[{"type":"jsonpath","expr":"$[0].name"}],"predicate":{"type":"==","value":"Dune"}},{"query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"nth","n":2}],"predicate":{"type":"==","value":"Children of Dune"}},{"query":{"type":"body"},"filters":[{"type":"regex","expr":{"type":"regex","value":"Hello ([0-9]+)!"}}],"predicate":{"type":"==","value":"Bob"}},{"query":{"type":"jsonpath","expr":"$.ips"},"filters":[{"type":"replace","old_value":", ","new_value":"|"}],"predicate":{"type":"==","value":"192.168.2.1|10.0.0.20|10.0.0.10"}},{"query":{"type":"jsonpath","expr":"$.ips"},"filters":[{"type":"split","sep":", "},{"type":"count"}],"predicate":{"type":"==","value":3}},{"query":{"type":"header","name":"Expires"},"filters":[{"type":"toDate","fmt":"%a, %d %b %Y %H:%M:%S GMT"},{"type":"daysBeforeNow"}],"predicate":{"type":">","value":1000}},{"query":{"type":"jsonpath","expr":"$.pi"},"filters":[{"type":"toFloat"}],"predicate":{"type":"==","value":3.14}},{"query":{"type":"jsonpath","expr":"$.id"},"filters":[{"type":"toInt"}],"predicate":{"type":"==","value":123}},{"query":{"type":"jsonpath","expr":"$.id"},"filters":[{"type":"toString"}],"predicate":{"type":"==","value":"123"}},{"query":{"type":"jsonpath","expr":"$.encoded_url"},"filters":[{"type":"urlDecode"}],"predicate":{"type":"==","value":"https://mozilla.org/?x=шеллы"}},{"query":{"type":"jsonpath","expr":"$.url"},"filters":[{"type":"urlEncode"}],"predicate":{"type":"==","value":"https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"}},{"query":{"type":"bytes"},"filters":[{"type":"decode","encoding":"iso-8859-1"},{"type":"xpath","expr":"string(//p)"}],"predicate":{"type":"==","value":"Hello"}}]}}]}
1+
{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/dummy"},"response":{"status":200,"captures":[{"name":"count","query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"count"}]}],"asserts":[{"query":{"type":"jsonpath","expr":"$.data"},"filters":[{"type":"base64Decode"}],"predicate":{"type":"==","value":"SGVsbG8=","encoding":"base64"}},{"query":{"type":"bytes"},"filters":[{"type":"base64Encode"}],"predicate":{"type":"==","value":"SGVsbG8="}},{"query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"count"}],"predicate":{"type":"==","value":12}},{"query":{"type":"certificate","expr":"Expire-Date"},"filters":[{"type":"daysAfterNow"}],"predicate":{"type":">","value":15}},{"query":{"type":"certificate","expr":"Start-Date"},"filters":[{"type":"daysBeforeNow"}],"predicate":{"type":"<","value":100}},{"query":{"type":"bytes"},"filters":[{"type":"decode","encoding":"iso-8859-1"}],"predicate":{"type":"==","value":"café"}},{"query":{"type":"cookie","expr":"LSID[Expires]"},"filters":[{"type":"format","fmt":"%a, %d %b %Y %H:%M:%S"}],"predicate":{"type":"==","value":"Wed, 13 Jan 2021 22:23:01"}},{"query":{"type":"jsonpath","expr":"$.text"},"filters":[{"type":"htmlEscape"}],"predicate":{"type":"==","value":"a &gt; b"}},{"query":{"type":"jsonpath","expr":"$.escaped_html[1]"},"filters":[{"type":"htmlUnescape"}],"predicate":{"type":"==","value":"<p>Hello</p>"}},{"query":{"type":"variable","name":"books"},"filters":[{"type":"jsonpath","expr":"$[0].name"}],"predicate":{"type":"==","value":"Dune"}},{"query":{"type":"jsonpath","expr":"$.books"},"filters":[{"type":"nth","n":2}],"predicate":{"type":"==","value":"Children of Dune"}},{"query":{"type":"body"},"filters":[{"type":"regex","expr":{"type":"regex","value":"Hello ([0-9]+)!"}}],"predicate":{"type":"==","value":"Bob"}},{"query":{"type":"jsonpath","expr":"$.ips"},"filters":[{"type":"replace","old_value":", ","new_value":"|"}],"predicate":{"type":"==","value":"192.168.2.1|10.0.0.20|10.0.0.10"}},{"query":{"type":"jsonpath","expr":"$.ips"},"filters":[{"type":"split","sep":", "},{"type":"count"}],"predicate":{"type":"==","value":3}},{"query":{"type":"header","name":"Expires"},"filters":[{"type":"toDate","fmt":"%a, %d %b %Y %H:%M:%S GMT"},{"type":"daysBeforeNow"}],"predicate":{"type":">","value":1000}},{"query":{"type":"jsonpath","expr":"$.pi"},"filters":[{"type":"toFloat"}],"predicate":{"type":"==","value":3.14}},{"query":{"type":"jsonpath","expr":"$.id"},"filters":[{"type":"toInt"}],"predicate":{"type":"==","value":123}},{"query":{"type":"jsonpath","expr":"$.id"},"filters":[{"type":"toString"}],"predicate":{"type":"==","value":"123"}},{"query":{"type":"jsonpath","expr":"$.encoded_url"},"filters":[{"type":"urlDecode"}],"predicate":{"type":"==","value":"https://mozilla.org/?x=шеллы"}},{"query":{"type":"jsonpath","expr":"$.url"},"filters":[{"type":"urlEncode"}],"predicate":{"type":"==","value":"https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"}},{"query":{"type":"jsonpath","expr":"$.url"},"filters":[{"type":"urlQueryParam","param":"token"}],"predicate":{"type":"==","value":"XYZ"}},{"query":{"type":"bytes"},"filters":[{"type":"decode","encoding":"iso-8859-1"},{"type":"xpath","expr":"string(//p)"}],"predicate":{"type":"==","value":"Hello"}}]}}]}

integration/hurlfmt/tests_export/filter.lint.hurl

+1
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ jsonpath "$.id" toInt == 123
2424
jsonpath "$.id" toString == "123" # toString
2525
jsonpath "$.encoded_url" urlDecode == "https://mozilla.org/?x=шеллы" # urlDecode
2626
jsonpath "$.url" urlEncode == "https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B" # urlEncode
27+
jsonpath "$.url" urlQueryParam "token" == "XYZ" # urlQueryParam
2728
bytes decode "iso-8859-1" xpath "string(//p)" == "Hello" # xpath

packages/hurl/src/runner/filter/eval.rs

+1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ pub fn eval_filter(
114114
FilterValue::ToString => eval_to_string(value, filter.source_info, in_assert),
115115
FilterValue::UrlDecode => eval_url_decode(value, filter.source_info, in_assert),
116116
FilterValue::UrlEncode => eval_url_encode(value, filter.source_info, in_assert),
117+
FilterValue::UrlQueryParam { .. } => todo!(),
117118
FilterValue::XPath { expr, .. } => {
118119
eval_xpath(value, expr, variables, filter.source_info, in_assert)
119120
}

packages/hurl_core/src/ast/core.rs

+5
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,10 @@ pub enum FilterValue {
325325
ToString,
326326
UrlDecode,
327327
UrlEncode,
328+
UrlQueryParam {
329+
space0: Whitespace,
330+
param: Template,
331+
},
328332
XPath {
329333
space0: Whitespace,
330334
expr: Template,
@@ -355,6 +359,7 @@ impl FilterValue {
355359
FilterValue::ToString => "toString",
356360
FilterValue::UrlDecode => "urlDecode",
357361
FilterValue::UrlEncode => "urlEncode",
362+
FilterValue::UrlQueryParam { .. } => "urlQueryParam",
358363
FilterValue::XPath { .. } => "xpath",
359364
}
360365
}

packages/hurl_core/src/format/html.rs

+4
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,10 @@ impl HtmlFormatter {
783783
self.fmt_space(space0);
784784
self.fmt_template(fmt);
785785
}
786+
FilterValue::UrlQueryParam { space0, param } => {
787+
self.fmt_space(space0);
788+
self.fmt_template(param);
789+
}
786790
FilterValue::XPath { space0, expr } => {
787791
self.fmt_space(space0);
788792
self.fmt_template(expr);

packages/hurl_core/src/parser/filter.rs

+8
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ pub fn filter(reader: &mut Reader) -> ParseResult<Filter> {
7373
to_string_filter,
7474
url_decode_filter,
7575
url_encode_filter,
76+
url_query_param_filter,
7677
xpath_filter,
7778
],
7879
reader,
@@ -218,6 +219,13 @@ fn url_decode_filter(reader: &mut Reader) -> ParseResult<FilterValue> {
218219
Ok(FilterValue::UrlDecode)
219220
}
220221

222+
fn url_query_param_filter(reader: &mut Reader) -> ParseResult<FilterValue> {
223+
try_literal("urlQueryParam", reader)?;
224+
let space0 = one_or_more_spaces(reader)?;
225+
let param = quoted_template(reader).map_err(|e| e.to_non_recoverable())?;
226+
Ok(FilterValue::UrlQueryParam { space0, param })
227+
}
228+
221229
fn xpath_filter(reader: &mut Reader) -> ParseResult<FilterValue> {
222230
try_literal("xpath", reader)?;
223231
let space0 = one_or_more_spaces(reader)?;

packages/hurlfmt/src/format/json.rs

+3
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,9 @@ impl ToJson for FilterValue {
676676
FilterValue::ToDate { fmt, .. } => {
677677
attributes.push(("fmt".to_string(), JValue::String(fmt.to_string())));
678678
}
679+
FilterValue::UrlQueryParam { param, .. } => {
680+
attributes.push(("param".to_string(), JValue::String(param.to_string())));
681+
}
679682
FilterValue::XPath { expr, .. } => {
680683
attributes.push(("expr".to_string(), JValue::String(expr.to_string())));
681684
}

packages/hurlfmt/src/format/token.rs

+4
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,10 @@ impl Tokenizable for Filter {
10671067
tokens.append(&mut space0.tokenize());
10681068
tokens.append(&mut fmt.tokenize());
10691069
}
1070+
FilterValue::UrlQueryParam { space0, param } => {
1071+
tokens.append(&mut space0.tokenize());
1072+
tokens.append(&mut param.tokenize());
1073+
}
10701074
FilterValue::XPath { space0, expr } => {
10711075
tokens.append(&mut space0.tokenize());
10721076
tokens.append(&mut expr.tokenize());

0 commit comments

Comments
 (0)