uint8_t* rd, size_t* rd_len)
{
size_t val_len;
- char* open_bracket, * close_bracket, * expr_ptr;
+ char* open_bracket, * close_bracket;
+ const char* next_char;
+ uint8_t expr_found = 0;
/* RFC6570#section-2.1
* "The characters outside of expressions in a URI Template string are
}
/* draft-ietf-add-svcb-dns-06#section-5.1
- * The URI Template MUST contain a "dns" variable
+ * "The URI Template MUST contain a "dns" variable"
+ * A URI Template is alowed to have multiple variables
*/
- open_bracket = strchr(val, '{');
- close_bracket = strchr(val, '}');
+ next_char = val;
+ while (next_char && *next_char != '\0') {
+ char* c;
- if (!open_bracket && !close_bracket) {
- return LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH;
- } else {
- expr_ptr = strstr(open_bracket+1, "?dns");
+ open_bracket = strchr(next_char, '{');
+ if (!open_bracket) {
+ return LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH;
+ break;
+ }
- if (!expr_ptr || !((close_bracket - expr_ptr) >= 4 ) ) {
+ close_bracket = strchr(open_bracket, '}');
+ if (!close_bracket) {
return LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH;
+
}
+ for (c = open_bracket+1; (close_bracket - c) >= 4; c++) {
+ if (c[0] == '?' && c[1] == 'd' && c[2] == 'n'
+ && c[3] == 's') {
+ expr_found++;
+ }
+ }
+
+ next_char = close_bracket+1;
+ }
+
+ if (expr_found != 1) {
+ return LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH;
}
sldns_write_uint16(rd, SVCB_KEY_DOHPATH);
{ LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE,
"No-default-alpn should not have a value" },
{ LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH,
- "Dohpath must have '?dns' in the URI template variable" },
+ "Dohpath must contain a correct URI template variable which contains '?dns'" },
{ LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA,
"General SVCParam error" },
{ 0, NULL }
; dohpath can be (non-)quoted and MUST contain "?dns"
_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath="/dns-query{?dns}"
-_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath=/dns-query{?dns}
+_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath=/dns-query{?abcd}{!abcd}{?dns}
+_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath=/dns-query{?abcdabcd?dns?defedf}
_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath=/dns-queryéè{?dns}
s08.success-cases. 3600 IN HTTPS 0 . key11="a" key12="a" key13="a" key14="a" key15="a" key16="a" key17="a" key18="a" key19="a" key110="a" key111="a" key112="a" key113="a" key114="a" key115="a" key116="a" key117="a" key118="a" key119="a" key120="a" key121="a" key122="a" key123="a" key124="a" key125="a" key126="a" key127="a" key128="a" key129="a" key130="a" key131="a" key132="a" key133="a" key134="a" key135="a" key136="a" key137="a" key138="a" key139="a" key140="a" key141="a" key142="a" key143="a" key144="a" key145="a" key146="a" key147="a" key148="a" key149="a" key150="a" key151="a" key152="a" key153="a" key154="a" key155="a" key156="a" key157="a" key158="a" key159="a" key160="a" key161="a" key162="a" key163="a"
s09.success-cases. 3600 IN HTTPS 0 . alpn="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn="h2" dohpath="/dns-query{?dns}"
-_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn="h2" dohpath="/dns-query{?dns}"
+_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn="h2" dohpath="/dns-query{?abcd}{!abcd}{?dns}"
+_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn="h2" dohpath="/dns-query{?abcdabcd?dns?defedf}"
_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn="h2" dohpath="/dns-query\195\169\195\168{?dns}"