From 1b3943168bfe7e9ad4d4a71081ba7fd9434f3ff2 Mon Sep 17 00:00:00 2001 From: Fabrice Reix Date: Fri, 22 Mar 2024 07:41:41 +0100 Subject: [PATCH] Update parser implem for filename with password --- docs/grammar.md | 2 +- docs/spec/grammar/hurl.grammar | 2 +- integration/hurlfmt/tests_export/options.html | 3 +- integration/hurlfmt/tests_export/options.hurl | 3 +- integration/hurlfmt/tests_export/options.json | 2 +- .../hurlfmt/tests_export/options.lint.hurl | 3 +- packages/hurl_core/src/parser/filename.rs | 67 ++++--- .../hurl_core/src/parser/filename_password.rs | 174 ++++++++++++++++++ packages/hurl_core/src/parser/mod.rs | 1 + packages/hurl_core/src/parser/option.rs | 4 +- 10 files changed, 227 insertions(+), 34 deletions(-) create mode 100644 packages/hurl_core/src/parser/filename_password.rs diff --git a/docs/grammar.md b/docs/grammar.md index ffc5ca84c..ffa103355 100644 --- a/docs/grammar.md +++ b/docs/grammar.md @@ -241,7 +241,7 @@ Short description:
filename-password(used by client-certificate-option)
filename-password-content(used by filename-password)
filename-password-text(used by filename-password-content)
~[#;{} \n\\]+
-
filename-password-escaped-char(used by filename-password-content)
\ (\|b|f|n|r|t|#|;| |{|}|u unicode-char)
+
filename-password-escaped-char(used by filename-password-content)
\ (\|b|f|n|r|t|#|;| |{|}|:|u unicode-char)
{ hexdigit+ }

JSON

json-value(used by bytesjson-key-valuejson-array)
 template
|json-object
diff --git a/docs/spec/grammar/hurl.grammar b/docs/spec/grammar/hurl.grammar index c9f57f23e..01913e205 100644 --- a/docs/spec/grammar/hurl.grammar +++ b/docs/spec/grammar/hurl.grammar @@ -443,7 +443,7 @@ filename-password-content: (filename-password-text | filename-password-escaped-c filename-password-text: ~[#;{} \n\\]+ -filename-password-escaped-char: "\\" ( "\\" | "b" | "f" | "n" | "r" | "t" | "#" | ";" | " " | "{" | "}" | "u" unicode-char) +filename-password-escaped-char: "\\" ( "\\" | "b" | "f" | "n" | "r" | "t" | "#" | ";" | " " | "{" | "}" | ":" | "u" unicode-char) unicode-char: "{" hexdigit+ "}" diff --git a/integration/hurlfmt/tests_export/options.html b/integration/hurlfmt/tests_export/options.html index 184d3273c..47a15fcdb 100644 --- a/integration/hurlfmt/tests_export/options.html +++ b/integration/hurlfmt/tests_export/options.html @@ -3,6 +3,7 @@ aws-sigv4: aws:amz:eu-central-1:sts cacert: cacertfile cert: certfile +cert: certfile:qU114@q,["NO key: keyfile compressed: false connect-to: example.com:443:example.net:8443 @@ -42,7 +43,7 @@ [Options] aws-sigv4: {{aws-sigv4}} #cacert: {{cacert}} NOT SUPPORTED YET -#cert: {{cert}} NOT SUPPORTED YET +cert: {{cert}} #key: {{key}} NOT SUPPORTED YET compressed: {{compressed}} connect-to: {{connect-to}} diff --git a/integration/hurlfmt/tests_export/options.hurl b/integration/hurlfmt/tests_export/options.hurl index 1e4e04bc2..1ed92b81e 100644 --- a/integration/hurlfmt/tests_export/options.hurl +++ b/integration/hurlfmt/tests_export/options.hurl @@ -3,6 +3,7 @@ GET http://localhost:8000/hello aws-sigv4: aws:amz:eu-central-1:sts cacert: cacertfile cert: certfile +cert: certfile:qU114@q,["NO key: keyfile compressed: false connect-to: example.com:443:example.net:8443 @@ -42,7 +43,7 @@ GET http://localhost:8000/hello [Options] aws-sigv4: {{aws-sigv4}} #cacert: {{cacert}} NOT SUPPORTED YET -#cert: {{cert}} NOT SUPPORTED YET +cert: {{cert}} #key: {{key}} NOT SUPPORTED YET compressed: {{compressed}} connect-to: {{connect-to}} diff --git a/integration/hurlfmt/tests_export/options.json b/integration/hurlfmt/tests_export/options.json index 962ab3d69..3691c406f 100644 --- a/integration/hurlfmt/tests_export/options.json +++ b/integration/hurlfmt/tests_export/options.json @@ -1 +1 @@ -{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/hello","options":[{"name":"aws-sigv4","value":"aws:amz:eu-central-1:sts"},{"name":"cacert","value":"cacertfile"},{"name":"cert","value":"certfile"},{"name":"key","value":"keyfile"},{"name":"compressed","value":false},{"name":"connect-to","value":"example.com:443:example.net:8443"},{"name":"delay","value":1000},{"name":"location","value":false},{"name":"location-trusted","value":false},{"name":"http1.0","value":false},{"name":"http1.1","value":false},{"name":"http2","value":false},{"name":"http3","value":false},{"name":"insecure","value":false},{"name":"ipv4","value":false},{"name":"ipv6","value":false},{"name":"max-redirs","value":10},{"name":"netrc","value":false},{"name":"netrc-file","value":"netrcfile"},{"name":"netrc-optional","value":false},{"name":"output","value":"output.txt"},{"name":"path-as-is","value":false},{"name":"proxy","value":"http://proxy.example"},{"name":"resolve","value":"example.com:443:127.0.0.1"},{"name":"retry","value":0},{"name":"retry","value":-1},{"name":"retry","value":4},{"name":"retry-interval","value":1000},{"name":"skip","value":false},{"name":"unix-socket","value":"build/unix_socket.sock"},{"name":"variable","value":"user=null"},{"name":"variable","value":"status=true"},{"name":"variable","value":"count=2"},{"name":"variable","value":"score=7.7"},{"name":"variable","value":"name=Bob"},{"name":"verbose","value":false},{"name":"very-verbose","value":false}]}},{"request":{"method":"GET","url":"http://localhost:8000/hello","options":[{"name":"aws-sigv4","value":"{{aws-sigv4}}"},{"name":"compressed","value":"{{compressed}}"},{"name":"connect-to","value":"{{connect-to}}"},{"name":"delay","value":"{{delay}}"},{"name":"location","value":"{{location}}"},{"name":"http1.0","value":"{{http10}}"},{"name":"http1.1","value":"{{http11}}"},{"name":"http2","value":"{{http2}}"},{"name":"http3","value":"{{http3}}"},{"name":"insecure","value":"{{insecure}}"},{"name":"ipv4","value":"{{ipv4}}"},{"name":"ipv6","value":"{{ipv6}}"},{"name":"max-redirs","value":"{{max-redirs}}"},{"name":"netrc","value":"{{netrc}}"},{"name":"netrc-optional","value":"{{netrc-optional}}"},{"name":"path-as-is","value":"{{path-as-is}}"},{"name":"proxy","value":"{{proxy}}"},{"name":"resolve","value":"{{resolve}}"},{"name":"retry","value":"{{retry}}"},{"name":"retry-interval","value":"{{retry-interval}}"},{"name":"skip","value":"{{skip}}"},{"name":"unix-socket","value":"{{socket_file}}"},{"name":"verbose","value":"{{verbose}}"},{"name":"very-verbose","value":"{{very-verbose}}"}]}}]} +{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/hello","options":[{"name":"aws-sigv4","value":"aws:amz:eu-central-1:sts"},{"name":"cacert","value":"cacertfile"},{"name":"cert","value":"certfile"},{"name":"cert","value":"certfile:qU114@q,[\"NO"},{"name":"key","value":"keyfile"},{"name":"compressed","value":false},{"name":"connect-to","value":"example.com:443:example.net:8443"},{"name":"delay","value":1000},{"name":"location","value":false},{"name":"location-trusted","value":false},{"name":"http1.0","value":false},{"name":"http1.1","value":false},{"name":"http2","value":false},{"name":"http3","value":false},{"name":"insecure","value":false},{"name":"ipv4","value":false},{"name":"ipv6","value":false},{"name":"max-redirs","value":10},{"name":"netrc","value":false},{"name":"netrc-file","value":"netrcfile"},{"name":"netrc-optional","value":false},{"name":"output","value":"output.txt"},{"name":"path-as-is","value":false},{"name":"proxy","value":"http://proxy.example"},{"name":"resolve","value":"example.com:443:127.0.0.1"},{"name":"retry","value":0},{"name":"retry","value":-1},{"name":"retry","value":4},{"name":"retry-interval","value":1000},{"name":"skip","value":false},{"name":"unix-socket","value":"build/unix_socket.sock"},{"name":"variable","value":"user=null"},{"name":"variable","value":"status=true"},{"name":"variable","value":"count=2"},{"name":"variable","value":"score=7.7"},{"name":"variable","value":"name=Bob"},{"name":"verbose","value":false},{"name":"very-verbose","value":false}]}},{"request":{"method":"GET","url":"http://localhost:8000/hello","options":[{"name":"aws-sigv4","value":"{{aws-sigv4}}"},{"name":"cert","value":"{{cert}}"},{"name":"compressed","value":"{{compressed}}"},{"name":"connect-to","value":"{{connect-to}}"},{"name":"delay","value":"{{delay}}"},{"name":"location","value":"{{location}}"},{"name":"http1.0","value":"{{http10}}"},{"name":"http1.1","value":"{{http11}}"},{"name":"http2","value":"{{http2}}"},{"name":"http3","value":"{{http3}}"},{"name":"insecure","value":"{{insecure}}"},{"name":"ipv4","value":"{{ipv4}}"},{"name":"ipv6","value":"{{ipv6}}"},{"name":"max-redirs","value":"{{max-redirs}}"},{"name":"netrc","value":"{{netrc}}"},{"name":"netrc-optional","value":"{{netrc-optional}}"},{"name":"path-as-is","value":"{{path-as-is}}"},{"name":"proxy","value":"{{proxy}}"},{"name":"resolve","value":"{{resolve}}"},{"name":"retry","value":"{{retry}}"},{"name":"retry-interval","value":"{{retry-interval}}"},{"name":"skip","value":"{{skip}}"},{"name":"unix-socket","value":"{{socket_file}}"},{"name":"verbose","value":"{{verbose}}"},{"name":"very-verbose","value":"{{very-verbose}}"}]}}]} diff --git a/integration/hurlfmt/tests_export/options.lint.hurl b/integration/hurlfmt/tests_export/options.lint.hurl index 1e4e04bc2..1ed92b81e 100644 --- a/integration/hurlfmt/tests_export/options.lint.hurl +++ b/integration/hurlfmt/tests_export/options.lint.hurl @@ -3,6 +3,7 @@ GET http://localhost:8000/hello aws-sigv4: aws:amz:eu-central-1:sts cacert: cacertfile cert: certfile +cert: certfile:qU114@q,["NO key: keyfile compressed: false connect-to: example.com:443:example.net:8443 @@ -42,7 +43,7 @@ GET http://localhost:8000/hello [Options] aws-sigv4: {{aws-sigv4}} #cacert: {{cacert}} NOT SUPPORTED YET -#cert: {{cert}} NOT SUPPORTED YET +cert: {{cert}} #key: {{key}} NOT SUPPORTED YET compressed: {{compressed}} connect-to: {{connect-to}} diff --git a/packages/hurl_core/src/parser/filename.rs b/packages/hurl_core/src/parser/filename.rs index 0585a07be..f8c7573e0 100644 --- a/packages/hurl_core/src/parser/filename.rs +++ b/packages/hurl_core/src/parser/filename.rs @@ -22,6 +22,12 @@ use crate::parser::reader::Reader; use crate::parser::template::template; use crate::parser::{string, ParseResult}; +/// Parse a filename. +/// +/// A few characters need to be escaped such as space +/// for example: file\ with\ space.txt +/// This is very similar to the behaviour in a standard shell. +/// pub fn parse(reader: &mut Reader) -> ParseResult