diff --git a/README.md b/README.md index e658162de0..a3e8aa3250 100644 --- a/README.md +++ b/README.md @@ -1352,7 +1352,7 @@ will follow a redirection only for the second entry. | --location-trusted | Like [`-L, --location`](#location), but allows sending the name + password to all hosts that the site may redirect to.
This may or may not introduce a security breach if the site redirects you to a site to which you send your authentication info (which is plaintext in the case of HTTP Basic authentication).
| | --max-filesize <BYTES> | Specify the maximum size in bytes of a file to download. If the file requested is larger than this value, the transfer does not start.

This is a cli-only option.
| | --max-redirs <NUM> | Set maximum number of redirection-followings allowed

By default, the limit is set to 50 redirections. Set this option to -1 to make it unlimited.
| -| -m, --max-time <SECONDS> | Maximum time in seconds that you allow a request/response to take. This is the standard timeout.

You can specify time units in the maximum time expression. Set Hurl to use a maximum time of 20 seconds with `--max-time 20s` or set it to 35,000 milliseconds with `--max-time 35000ms`. No spaces allowed.

See also [`--connect-timeout`](#connect-timeout).

This is a cli-only option.
| +| -m, --max-time <SECONDS> | Maximum time in seconds that you allow a request/response to take. This is the standard timeout.

You can specify time units in the maximum time expression. Set Hurl to use a maximum time of 20 seconds with `--max-time 20s` or set it to 35,000 milliseconds with `--max-time 35000ms`. No spaces allowed.

See also [`--connect-timeout`](#connect-timeout). | | -n, --netrc | Scan the .netrc file in the user's home directory for the username and password.

See also [`--netrc-file`](#netrc-file) and [`--netrc-optional`](#netrc-optional).
| | --netrc-file <FILE> | Like [`--netrc`](#netrc), but provide the path to the netrc file.

See also [`--netrc-optional`](#netrc-optional).
| | --netrc-optional | Similar to [`--netrc`](#netrc), but make the .netrc usage optional.

See also [`--netrc-file`](#netrc-file).
| diff --git a/docs/grammar.md b/docs/grammar.md index 1b0c7a3e8d..3027e08e4c 100644 --- a/docs/grammar.md +++ b/docs/grammar.md @@ -77,7 +77,7 @@ Short description:
assert(used by asserts-section)
lt*
query (sp filter)* sp predicate lt
option(used by options-section)
lt*
-(aws-sigv4-option|ca-certificate-option|client-certificate-option|client-key-option|compressed-option|connect-to-option|connect-timeout-option|delay-option|follow-redirect-option|follow-redirect-trusted-option|header-option|http10-option|http11-option|http2-option|http3-option|insecure-option|ipv4-option|ipv6-option|limit-rate-option|max-redirs-option|netrc-option|netrc-file-option|netrc-optional-option|output-option|path-as-is-option|proxy-option|repeat-option|resolve-option|retry-option|retry-interval-option|skip-option|unix-socket-option|user-option|variable-option|verbose-option|very-verbose-option)
+(aws-sigv4-option|ca-certificate-option|client-certificate-option|client-key-option|compressed-option|connect-to-option|connect-timeout-option|delay-option|follow-redirect-option|follow-redirect-trusted-option|header-option|http10-option|http11-option|http2-option|http3-option|insecure-option|ipv4-option|ipv6-option|limit-rate-option|max-redirs-option|max-time-option|netrc-option|netrc-file-option|netrc-optional-option|output-option|path-as-is-option|proxy-option|repeat-option|resolve-option|retry-option|retry-interval-option|skip-option|unix-socket-option|user-option|variable-option|verbose-option|very-verbose-option)
aws-sigv4-option(used by option)
aws-sigv4 : value-string lt
ca-certificate-option(used by option)
cacert : filename lt
client-certificate-option(used by option)
cert : filename-password lt
@@ -98,6 +98,7 @@ Short description:
ipv6-option(used by option)
ipv6 : boolean-option lt
limit-rate-option(used by option)
limit-rate : integer-option lt
max-redirs-option(used by option)
max-redirs : integer-option lt
+
max-time-option(used by option)
max-time : integer-option lt
netrc-option(used by option)
netrc : boolean-option lt
netrc-file-option(used by option)
netrc-file : value-string lt
netrc-optional-option(used by option)
netrc-optional : boolean-option lt
@@ -116,7 +117,7 @@ Short description:
very-verbose-option(used by option)
very-verbose : boolean-option lt
variable-definition(used by variable-option)
variable-name = variable-value
boolean-option(used by compressed-optionfollow-redirect-optionfollow-redirect-trusted-optionhttp10-optionhttp11-optionhttp2-optionhttp3-optioninsecure-optionipv4-optionipv6-optionnetrc-optionnetrc-optional-optionpath-as-is-optionskip-optionverbose-optionvery-verbose-option)
boolean|placeholder
-
integer-option(used by limit-rate-optionmax-redirs-optionrepeat-optionretry-option)
integer|placeholder
+
integer-option(used by limit-rate-optionmax-redirs-optionmax-time-optionrepeat-optionretry-option)
integer|placeholder
duration-option(used by connect-timeout-optiondelay-optionretry-interval-option)
(integer duration-unit?)|placeholder
duration-unit(used by duration-option)
ms|s|m
variable-value(used by variable-definition)
 null
@@ -329,7 +330,7 @@ Short description:
split-filter(used by filter)
to-date-filter(used by filter)
toDate sp quoted-string
to-float-filter(used by filter)
toFloat
-
to-hex-filter(used by filter)
toFloat
+
to-hex-filter(used by filter)
toHex
to-int-filter(used by filter)
toInt
to-string-filter(used by filter)
toString
url-decode-filter(used by filter)
urlDecode
@@ -347,7 +348,7 @@ Short description:
fraction(used by json-numberfloat)
. digit+
exponent(used by json-number)
(e|E) (+|-)? digit+
- +
comment(used by lt)
# ~[\n]*
regex-content(used by regex)
diff --git a/docs/request.md b/docs/request.md index da4b258cdb..99728c4288 100644 --- a/docs/request.md +++ b/docs/request.md @@ -215,6 +215,7 @@ ipv6: true # use IPv6 addresses limit-rate: 32000 # limit this request to the specidied speed (bytes/s) location: true # follow redirection for this request max-redirs: 10 # maximum number of redirections +max-time: 30s # maximum time for a request/response output: out.html # dump the response to this file path-as-is: true # do not handle sequences of /../ or /./ in URL path retry: 10 # number of retry if HTTP/asserts errors diff --git a/docs/spec/grammar/hurl.grammar b/docs/spec/grammar/hurl.grammar index 630db9e0cc..1130c05132 100644 --- a/docs/spec/grammar/hurl.grammar +++ b/docs/spec/grammar/hurl.grammar @@ -136,6 +136,7 @@ option: | ipv6-option | limit-rate-option | max-redirs-option + | max-time-option | netrc-option | netrc-file-option | netrc-optional-option @@ -194,6 +195,8 @@ limit-rate-option: "limit-rate" ":" integer-option lt max-redirs-option: "max-redirs" ":" integer-option lt +max-time-option: "max-time" ":" integer-option lt + netrc-option: "netrc" ":" boolean-option lt netrc-file-option: "netrc-file" ":" value-string lt diff --git a/integration/hurl/tests_error_parser/invalid_option.err b/integration/hurl/tests_error_parser/invalid_option.err index 3af1b4ff8c..910c96415d 100644 --- a/integration/hurl/tests_error_parser/invalid_option.err +++ b/integration/hurl/tests_error_parser/invalid_option.err @@ -2,6 +2,6 @@ error: Parsing option --> tests_error_parser/invalid_option.hurl:3:1 | 3 | foo: true - | ^ the option name is not valid. Valid values are aws-sigv4, cacert, cert, compressed, connect-to, delay, insecure, header, http1.0, http1.1, http2, http3, ipv4, ipv6, key, location, max-redirs, output, path-as-is, proxy, redirects, resolve, retry, retry-interval, skip, unix-socket, variable, verbose, very-verbose + | ^ the option name is not valid. Valid values are aws-sigv4, cacert, cert, compressed, connect-to, delay, insecure, header, http1.0, http1.1, http2, http3, ipv4, ipv6, key, location, max-redirs, max-time, output, path-as-is, proxy, redirects, resolve, retry, retry-interval, skip, unix-socket, variable, verbose, very-verbose | diff --git a/integration/hurlfmt/tests_export/options.html b/integration/hurlfmt/tests_export/options.html index cb0bc9f26d..4387aad909 100644 --- a/integration/hurlfmt/tests_export/options.html +++ b/integration/hurlfmt/tests_export/options.html @@ -23,6 +23,7 @@ ipv6: false limit-rate: 1000 max-redirs: 10 +max-time: 100s netrc: false netrc-file: netrcfile netrc-optional: false @@ -72,6 +73,7 @@ ipv6: {{ipv6}} limit-rate: {{limit-rate}} max-redirs: {{max-redirs}} +max-time: {{max-time}} netrc: {{netrc}} netrc-file: {{netrc-file}} netrc-optional: {{netrc-optional}} diff --git a/integration/hurlfmt/tests_export/options.hurl b/integration/hurlfmt/tests_export/options.hurl index a7a146bbb7..2922744649 100644 --- a/integration/hurlfmt/tests_export/options.hurl +++ b/integration/hurlfmt/tests_export/options.hurl @@ -23,6 +23,7 @@ ipv4: false ipv6: false limit-rate: 1000 max-redirs: 10 +max-time: 100s netrc: false netrc-file: netrcfile netrc-optional: false @@ -72,6 +73,7 @@ ipv4: {{ipv4}} ipv6: {{ipv6}} limit-rate: {{limit-rate}} max-redirs: {{max-redirs}} +max-time: {{max-time}} netrc: {{netrc}} netrc-file: {{netrc-file}} netrc-optional: {{netrc-optional}} diff --git a/integration/hurlfmt/tests_export/options.json b/integration/hurlfmt/tests_export/options.json index 9b571f9cfb..c13b8bd568 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":"cert","value":"certfile:qU114@q,[\"NO"},{"name":"key","value":"keyfile"},{"name":"compressed","value":false},{"name":"connect-to","value":"example.com:443:example.net:8443"},{"value":60,"unit":"s","name":"connect-timeout"},{"name":"delay","value":1000},{"value":1000,"unit":"ms","name":"delay"},{"value":1,"unit":"s","name":"delay"},{"name":"location","value":false},{"name":"location-trusted","value":false},{"name":"header","value":"key: value"},{"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":"limit-rate","value":1000},{"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":"repeat","value":-1},{"name":"repeat","value":5},{"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},{"value":1000,"unit":"ms","name":"retry-interval"},{"value":1,"unit":"s","name":"retry-interval"},{"name":"skip","value":false},{"name":"unix-socket","value":"build/unix_socket.sock"},{"name":"user","value":"bob:secret"},{"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":"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":"cacert","value":"{{cacert}}"},{"name":"cert","value":"{{cert}}"},{"name":"key","value":"{{key}}"},{"name":"compressed","value":"{{compressed}}"},{"name":"connect-to","value":"{{connect-to}}"},{"name":"connect-timeout","value":"{{connect-timeout}}"},{"name":"delay","value":"{{delay}}"},{"name":"location","value":"{{location}}"},{"name":"location-trusted","value":"{{location-trusted}}"},{"name":"header","value":"{{header}}"},{"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":"limit-rate","value":"{{limit-rate}}"},{"name":"max-redirs","value":"{{max-redirs}}"},{"name":"netrc","value":"{{netrc}}"},{"name":"netrc-file","value":"{{netrc-file}}"},{"name":"netrc-optional","value":"{{netrc-optional}}"},{"name":"output","value":"{{output}}"},{"name":"path-as-is","value":"{{path-as-is}}"},{"name":"proxy","value":"{{proxy}}"},{"name":"repeat","value":"{{repeat}}"},{"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":"user","value":"{{user}}"},{"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"},{"value":60,"unit":"s","name":"connect-timeout"},{"name":"delay","value":1000},{"value":1000,"unit":"ms","name":"delay"},{"value":1,"unit":"s","name":"delay"},{"name":"location","value":false},{"name":"location-trusted","value":false},{"name":"header","value":"key: value"},{"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":"limit-rate","value":1000},{"name":"max-redirs","value":10},{"value":100,"unit":"s","name":"max-time"},{"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":"repeat","value":-1},{"name":"repeat","value":5},{"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},{"value":1000,"unit":"ms","name":"retry-interval"},{"value":1,"unit":"s","name":"retry-interval"},{"name":"skip","value":false},{"name":"unix-socket","value":"build/unix_socket.sock"},{"name":"user","value":"bob:secret"},{"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":"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":"cacert","value":"{{cacert}}"},{"name":"cert","value":"{{cert}}"},{"name":"key","value":"{{key}}"},{"name":"compressed","value":"{{compressed}}"},{"name":"connect-to","value":"{{connect-to}}"},{"name":"connect-timeout","value":"{{connect-timeout}}"},{"name":"delay","value":"{{delay}}"},{"name":"location","value":"{{location}}"},{"name":"location-trusted","value":"{{location-trusted}}"},{"name":"header","value":"{{header}}"},{"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":"limit-rate","value":"{{limit-rate}}"},{"name":"max-redirs","value":"{{max-redirs}}"},{"name":"max-time","value":"{{max-time}}"},{"name":"netrc","value":"{{netrc}}"},{"name":"netrc-file","value":"{{netrc-file}}"},{"name":"netrc-optional","value":"{{netrc-optional}}"},{"name":"output","value":"{{output}}"},{"name":"path-as-is","value":"{{path-as-is}}"},{"name":"proxy","value":"{{proxy}}"},{"name":"repeat","value":"{{repeat}}"},{"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":"user","value":"{{user}}"},{"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 8d2e8557e2..2e9836f5c6 100644 --- a/integration/hurlfmt/tests_export/options.lint.hurl +++ b/integration/hurlfmt/tests_export/options.lint.hurl @@ -23,6 +23,7 @@ ipv4: false ipv6: false limit-rate: 1000 max-redirs: 10 +max-time: 100s netrc: false netrc-file: netrcfile netrc-optional: false @@ -72,6 +73,7 @@ ipv4: {{ipv4}} ipv6: {{ipv6}} limit-rate: {{limit-rate}} max-redirs: {{max-redirs}} +max-time: {{max-time}} netrc: {{netrc}} netrc-file: {{netrc-file}} netrc-optional: {{netrc-optional}} diff --git a/packages/hurl/src/runner/options.rs b/packages/hurl/src/runner/options.rs index 4de66e0f7e..9db448c87b 100644 --- a/packages/hurl/src/runner/options.rs +++ b/packages/hurl/src/runner/options.rs @@ -200,6 +200,11 @@ pub fn get_entry_options( let value = eval_count_option(value, variables)?; entry_options.max_redirect = value; } + OptionKind::MaxTime(value) => { + let value = + eval_duration_option(value, variables, DurationUnit::MilliSecond)?; + entry_options.timeout = value; + } OptionKind::NetRc(value) => { let value = eval_boolean_option(value, variables)?; entry_options.netrc = value; diff --git a/packages/hurl_core/src/ast/option.rs b/packages/hurl_core/src/ast/option.rs index 3c69b0106e..50b1ba6dfc 100644 --- a/packages/hurl_core/src/ast/option.rs +++ b/packages/hurl_core/src/ast/option.rs @@ -54,6 +54,7 @@ pub enum OptionKind { FollowLocationTrusted(BooleanOption), LimitRate(NaturalOption), MaxRedirect(CountOption), + MaxTime(DurationOption), NetRc(BooleanOption), NetRcFile(Template), NetRcOptional(BooleanOption), @@ -96,6 +97,7 @@ impl OptionKind { OptionKind::IpV6(_) => "ipv6", OptionKind::LimitRate(_) => "limit-rate", OptionKind::MaxRedirect(_) => "max-redirs", + OptionKind::MaxTime(_) => "max-time", OptionKind::NetRc(_) => "netrc", OptionKind::NetRcFile(_) => "netrc-file", OptionKind::NetRcOptional(_) => "netrc-optional", @@ -139,6 +141,7 @@ impl fmt::Display for OptionKind { OptionKind::IpV6(value) => value.to_string(), OptionKind::LimitRate(value) => value.to_string(), OptionKind::MaxRedirect(value) => value.to_string(), + OptionKind::MaxTime(value) => value.to_string(), OptionKind::NetRc(value) => value.to_string(), OptionKind::NetRcFile(filename) => filename.to_string(), OptionKind::NetRcOptional(value) => value.to_string(), diff --git a/packages/hurl_core/src/format/html.rs b/packages/hurl_core/src/format/html.rs index c412d6b9bf..b2cd222ffe 100644 --- a/packages/hurl_core/src/format/html.rs +++ b/packages/hurl_core/src/format/html.rs @@ -239,6 +239,7 @@ impl HtmlFormatter { OptionKind::IpV6(value) => self.fmt_bool_option(value), OptionKind::LimitRate(value) => self.fmt_natural_option(value), OptionKind::MaxRedirect(value) => self.fmt_count_option(value), + OptionKind::MaxTime(value) => self.fmt_duration_option(value), OptionKind::NetRc(value) => self.fmt_bool_option(value), OptionKind::NetRcFile(filename) => self.fmt_filename(filename), OptionKind::NetRcOptional(value) => self.fmt_bool_option(value), diff --git a/packages/hurl_core/src/parser/error.rs b/packages/hurl_core/src/parser/error.rs index 30f95c5042..baab0d78a4 100644 --- a/packages/hurl_core/src/parser/error.rs +++ b/packages/hurl_core/src/parser/error.rs @@ -173,6 +173,7 @@ impl DisplaySourceError for ParseError { "key", "location", "max-redirs", + "max-time", "output", "path-as-is", "proxy", diff --git a/packages/hurl_core/src/parser/option.rs b/packages/hurl_core/src/parser/option.rs index 3ecf053b9d..39d138d20b 100644 --- a/packages/hurl_core/src/parser/option.rs +++ b/packages/hurl_core/src/parser/option.rs @@ -66,6 +66,7 @@ pub fn parse(reader: &mut Reader) -> ParseResult { "location" => option_follow_location(reader)?, "location-trusted" => option_follow_location_trusted(reader)?, "max-redirs" => option_max_redirect(reader)?, + "max-time" => option_max_time(reader)?, "netrc" => option_netrc(reader)?, "netrc-file" => option_netrc_file(reader)?, "netrc-optional" => option_netrc_optional(reader)?, @@ -202,6 +203,11 @@ fn option_max_redirect(reader: &mut Reader) -> ParseResult { Ok(OptionKind::MaxRedirect(value)) } +fn option_max_time(reader: &mut Reader) -> ParseResult { + let value = duration_option(reader)?; + Ok(OptionKind::MaxTime(value)) +} + fn option_netrc(reader: &mut Reader) -> ParseResult { let value = non_recover(boolean_option, reader)?; Ok(OptionKind::NetRc(value)) diff --git a/packages/hurlfmt/src/format/json.rs b/packages/hurlfmt/src/format/json.rs index 4d2929f454..fdef228889 100644 --- a/packages/hurlfmt/src/format/json.rs +++ b/packages/hurlfmt/src/format/json.rs @@ -327,6 +327,7 @@ impl ToJson for EntryOption { OptionKind::IpV6(value) => value.to_json(), OptionKind::LimitRate(value) => value.to_json(), OptionKind::MaxRedirect(value) => value.to_json(), + OptionKind::MaxTime(value) => value.to_json(), OptionKind::NetRc(value) => value.to_json(), OptionKind::NetRcFile(filename) => JValue::String(filename.to_string()), OptionKind::NetRcOptional(value) => value.to_json(), diff --git a/packages/hurlfmt/src/format/token.rs b/packages/hurlfmt/src/format/token.rs index cb53a95bcc..e5eb98c381 100644 --- a/packages/hurlfmt/src/format/token.rs +++ b/packages/hurlfmt/src/format/token.rs @@ -915,6 +915,7 @@ impl Tokenizable for OptionKind { OptionKind::IpV6(value) => value.tokenize(), OptionKind::LimitRate(value) => value.tokenize(), OptionKind::MaxRedirect(value) => value.tokenize(), + OptionKind::MaxTime(value) => value.tokenize(), OptionKind::NetRc(value) => value.tokenize(), OptionKind::NetRcFile(filename) => filename.tokenize(), OptionKind::NetRcOptional(value) => value.tokenize(),