canopus
canopus copied to clipboard
Decomposing URIs into Options
The steps to parse a request's options from a string |url| are as follows. These steps either result in zero or more of the Uri-Host, Uri-Port, Uri-Path, and Uri-Query Options being included in the request or they fail.
-
If the |url| string is not an absolute URI ([RFC3986]), then fail this algorithm.
-
Resolve the |url| string using the process of reference resolution defined by [RFC3986]. At this stage, the URL is in ASCII encoding [RFC0020], even though the decoded components will be interpreted in UTF-8 [RFC3629] after steps 5, 8, and 9.
NOTE: It doesn't matter what it is resolved relative to, since we already know it is an absolute URL at this point.
-
If |url| does not have a
component whose value, when converted to ASCII lowercase, is "coap" or "coaps", then fail this algorithm. -
If |url| has a
component, then fail this algorithm. -
If the
component of |url| does not represent the request's destination IP address as an IP-literal or IPv4address, include a Uri-Host Option and let that option's value be the value of the component of |url|, converted to ASCII lowercase, and then convert all percent-encodings ("%" followed by two hexadecimal digits) to the corresponding characters.
NOTE: In the usual case where the request's destination IP
address is derived from the host part, this ensures that a Uri-
Host Option is only used for a <host> component of the form reg-
name.
-
If |url| has a
component, then let |port| be that component's value interpreted as a decimal integer; otherwise, let |port| be the default port for the scheme. -
If |port| does not equal the request's destination UDP port, include a Uri-Port Option and let that option's value be |port|.
-
If the value of the
component of |url| is empty or consists of a single slash character (U+002F SOLIDUS "/"), then move to the next step. Otherwise, for each segment in the
component, include a Uri-Path Option and let that option's value be the segment (not including the delimiting slash characters) after converting each percent-encoding ("%" followed by two hexadecimal digits) to the corresponding byte. -
If |url| has a
component, then, for each argument in the component, include a Uri-Query Option and let that option's value be the argument (not including the question mark and the delimiting ampersand characters) after converting each percent-encoding to the corresponding byte.
Note that these rules completely resolve any percent-encoding.