annotate src/lib/uri-util.c @ 22664:fea53c2725c0

director: Fix director_max_parallel_moves/kicks type Should be uint, not time.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 09 Nov 2017 12:24:16 +0200
parents 2e2563132d5f
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
2
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
3 #include "lib.h"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
4 #include "array.h"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
5 #include "str.h"
15187
02451e967a06 Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents: 15045
diff changeset
6 #include "net.h"
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
7 #include "uri-util.h"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
8
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
9 #include <ctype.h>
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
10
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
11 /*
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
12 * Generic URI parsing.
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
13 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
14 * [URI-GEN] RFC3986 Appendix A:
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
15 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
16 * host = IP-literal / IPv4address / reg-name
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
17 * port = *DIGIT
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
18 * reg-name = *( unreserved / pct-encoded / sub-delims )
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
19 * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
20 * pct-encoded = "%" HEXDIG HEXDIG
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
21 * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
22 * / "*" / "+" / "," / ";" / "="
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
23 * IP-literal = "[" ( IPv6address / IPvFuture ) "]"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
24 * IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
25 * IPv6address = 6( h16 ":" ) ls32
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
26 * / "::" 5( h16 ":" ) ls32
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
27 * / [ h16 ] "::" 4( h16 ":" ) ls32
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
28 * / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
29 * / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
30 * / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
31 * / [ *4( h16 ":" ) h16 ] "::" ls32
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
32 * / [ *5( h16 ":" ) h16 ] "::" h16
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
33 * / [ *6( h16 ":" ) h16 ] "::"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
34 * h16 = 1*4HEXDIG
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
35 * ls32 = ( h16 ":" h16 ) / IPv4address
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
36 * IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
37 * dec-octet = DIGIT ; 0-9
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
38 * / %x31-39 DIGIT ; 10-99
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
39 * / "1" 2DIGIT ; 100-199
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
40 * / "2" %x30-34 DIGIT ; 200-249
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
41 * / "25" %x30-35 ; 250-255
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
42 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
43
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
44 #define URI_MAX_SCHEME_NAME_LEN 64
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
45
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
46 /* Character lookup table
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
47 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
48 * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" [bit0]
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
49 * sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
50 * / "*" / "+" / "," / ";" / "=" [bit1]
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
51 * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" [bit2]
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
52 * pchar = unreserved / sub-delims / ":" / "@" [bit0|bit1|bit3]
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
53 * 'pfchar' = unreserved / sub-delims / ":" / "@" / "/"
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
54 * [bit0|bit1|bit3|bit5]
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
55 * 'uchar' = unreserved / sub-delims / ":" [bit0|bit1|bit4]
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
56 * 'qchar' = pchar / "/" / "?" [bit0|bit1|bit3|bit5|bit6]
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
57 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
58 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
59
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
60 #define CHAR_MASK_UNRESERVED (1<<0)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
61 #define CHAR_MASK_SUB_DELIMS (1<<1)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
62 #define CHAR_MASK_PCHAR ((1<<0)|(1<<1)|(1<<3))
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
63 #define CHAR_MASK_PFCHAR ((1<<0)|(1<<1)|(1<<3)|(1<<5))
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
64 #define CHAR_MASK_UCHAR ((1<<0)|(1<<1)|(1<<4))
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
65 #define CHAR_MASK_QCHAR ((1<<0)|(1<<1)|(1<<3)|(1<<5)|(1<<6))
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
66
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
67 static unsigned const char _uri_char_lookup[256] = {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
68 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
69 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 10
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
70 0, 2, 0, 4, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, 1, 36, // 20
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
71 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 2, 0, 2, 0, 68, // 30
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
72 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 40
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
73 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 4, 0, 1, // 50
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
74 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 60
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
75 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, // 70
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
76 };
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
77
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
78 static inline int _decode_hex_digit(const unsigned char digit)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
79 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
80 switch (digit) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
81 case '0': case '1': case '2': case '3': case '4':
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
82 case '5': case '6': case '7': case '8': case '9':
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
83 return digit - '0';
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
84
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
85 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
86 return digit - 'a' + 0x0a;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
87
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
88 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
89 return digit - 'A' + 0x0A;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
90 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
91 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
92 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
93
20867
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
94 static int
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
95 uri_parse_pct_encoded_data(struct uri_parser *parser,
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
96 const unsigned char **p, const unsigned char *pend,
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
97 unsigned char *ch_r) ATTR_NULL(3)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
98 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
99 int value;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
100
20867
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
101 if (**p != '%' || (pend != NULL && *p >= pend))
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
102 return 0;
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
103 *p += 1;
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
104
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
105 if (**p == 0 || *(*p+1) == 0 || (pend != NULL && *p+1 >= pend)) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
106 parser->error = "Unexpected URI boundary after '%'";
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
107 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
108 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
109
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
110 if ((value = _decode_hex_digit(**p)) < 0) {
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
111 parser->error = p_strdup_printf(parser->pool,
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
112 "Expecting hex digit after '%%', but found '%c'", **p);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
113 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
114 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
115
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
116 *ch_r = (value & 0x0f) << 4;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
117 *p += 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
118
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
119 if ((value = _decode_hex_digit(**p)) < 0) {
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
120 parser->error = p_strdup_printf(parser->pool,
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
121 "Expecting hex digit after '%%%c', but found '%c'", *((*p)-1), **p);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
122 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
123 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
124
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
125 *ch_r |= (value & 0x0f);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
126 *p += 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
127
21364
518bc42408d6 lib, lib-http: add HTTP_URL_ALLOW_PCT_NUL flag
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 20868
diff changeset
128 if (!parser->allow_pct_nul && *ch_r == '\0') {
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
129 parser->error =
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
130 "Percent encoding is not allowed to encode NUL character";
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
131 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
132 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
133 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
134 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
135
20867
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
136 int uri_parse_pct_encoded(struct uri_parser *parser,
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
137 unsigned char *ch_r)
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
138 {
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
139 return uri_parse_pct_encoded_data
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
140 (parser, &parser->cur, parser->end, ch_r);
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
141 }
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
142
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
143 static int
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
144 uri_parse_unreserved_char(struct uri_parser *parser, unsigned char *ch_r)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
145 {
20867
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
146 int ret;
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
147
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
148 if ((ret=uri_parse_pct_encoded(parser, ch_r)) != 0)
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
149 return ret;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
150
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
151 if ((*parser->cur & 0x80) != 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
152 return 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
153
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
154 if ((_uri_char_lookup[*parser->cur] & CHAR_MASK_UNRESERVED) != 0) {
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
155 *ch_r = *parser->cur;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
156 parser->cur++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
157 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
158 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
159 return 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
160 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
161
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
162 int uri_parse_unreserved(struct uri_parser *parser, string_t *part)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
163 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
164 int len = 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
165
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
166 while (parser->cur < parser->end) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
167 int ret;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
168 unsigned char ch = 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
169
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
170 if ((ret = uri_parse_unreserved_char(parser, &ch)) < 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
171 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
172 if (ret == 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
173 break;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
174
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
175 if (part != NULL)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
176 str_append_c(part, ch);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
177 len++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
178 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
179
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
180 return len > 0 ? 1 : 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
181 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
182
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
183 bool uri_data_decode(struct uri_parser *parser, const char *data,
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
184 const char *until, const char **decoded_r)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
185 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
186 const unsigned char *p = (const unsigned char *)data;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
187 const unsigned char *pend = (const unsigned char *)until;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
188 string_t *decoded;
20867
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
189 int ret;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
190
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
191 if (pend == NULL) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
192 /* NULL means unlimited; solely rely on '\0' */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
193 pend = (const unsigned char *)(size_t)-1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
194 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
195
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
196 if (p >= pend || *p == '\0') {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
197 if (decoded_r != NULL)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
198 *decoded_r = "";
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
199 return TRUE;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
200 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
201
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
202 decoded = uri_parser_get_tmpbuf(parser, 256);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
203 while (p < pend && *p != '\0') {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
204 unsigned char ch;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
205
20867
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
206 if ((ret=uri_parse_pct_encoded_data
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
207 (parser, &p, NULL, &ch)) != 0) {
32678cf64cd1 uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents: 20866
diff changeset
208 if (ret < 0)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
209 return FALSE;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
210 str_append_c(decoded, ch);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
211 } else {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
212 str_append_c(decoded, *p);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
213 p++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
214 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
215 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
216
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
217 if (decoded_r != NULL)
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
218 *decoded_r = p_strdup(parser->pool, str_c(decoded));
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
219 return TRUE;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
220 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
221
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14587
diff changeset
222 int uri_cut_scheme(const char **uri_p, const char **scheme_r)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
223 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
224 const char *p = *uri_p;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
225 size_t len = 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
226
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
227 /* RFC 3968:
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
228 * scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
229 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
230
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
231 if (!i_isalpha(*p))
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14587
diff changeset
232 return -1;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
233 p++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
234
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
235 while (len < URI_MAX_SCHEME_NAME_LEN && *p != '\0') {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
236 if (!i_isalnum(*p) && *p != '+' && *p != '-' && *p != '.')
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
237 break;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
238 p++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
239 len++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
240 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
241
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
242 if (*p != ':')
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14587
diff changeset
243 return -1;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
244
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
245 if (scheme_r != NULL)
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
246 *scheme_r = t_strdup_until(*uri_p, p);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
247 *uri_p = p + 1;
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14587
diff changeset
248 return 0;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
249 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
250
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
251 int uri_parse_scheme(struct uri_parser *parser, const char **scheme_r)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
252 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
253 const char *p;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
254
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
255 if (parser->cur >= parser->end)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
256 return 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
257
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
258 p = (const char *)parser->cur;
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14587
diff changeset
259 if (uri_cut_scheme(&p, scheme_r) < 0)
14737
1af9d08e67d7 imap: CATENATE command fixes.
Timo Sirainen <tss@iki.fi>
parents: 14686
diff changeset
260 return 0;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
261
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
262 parser->cur = (const unsigned char *)p;
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
263 if (!parser->pool->datastack_pool)
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
264 *scheme_r = p_strdup(parser->pool, *scheme_r);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
265 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
266 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
267
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
268 static int
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
269 uri_parse_dec_octet(struct uri_parser *parser, string_t *literal,
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
270 uint8_t *octet_r) ATTR_NULL(2)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
271 {
17561
439bba739c49 lib: uri-util - hardern uri_parse_dec_octet() against overflow
Phil Carmody <phil@dovecot.fi>
parents: 17559
diff changeset
272 unsigned int octet = 0;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
273 int count = 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
274
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
275 /* RFC 3986:
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
276 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
277 * dec-octet = DIGIT ; 0-9
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
278 * / %x31-39 DIGIT ; 10-99
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
279 * / "1" 2DIGIT ; 100-199
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
280 * / "2" %x30-34 DIGIT ; 200-249
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
281 * / "25" %x30-35 ; 250-255
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
282 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
283
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
284 while (parser->cur < parser->end && i_isdigit(*parser->cur)) {
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14587
diff changeset
285 octet = octet * 10 + (parser->cur[0] - '0');
17561
439bba739c49 lib: uri-util - hardern uri_parse_dec_octet() against overflow
Phil Carmody <phil@dovecot.fi>
parents: 17559
diff changeset
286 if (octet > 255)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
287 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
288
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
289 if (literal != NULL)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
290 str_append_c(literal, *parser->cur);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
291
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
292 parser->cur++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
293 count++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
294 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
295
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
296 if (count > 0) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
297 *octet_r = octet;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
298 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
299 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
300 return 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
301 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
302
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
303 static int
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
304 uri_parse_ipv4address(struct uri_parser *parser, string_t *literal,
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
305 struct in_addr *ip4_r) ATTR_NULL(2,3)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
306 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
307 uint8_t octet;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
308 uint32_t ip = 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
309 int ret;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
310 int i;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
311
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
312 /* RFC 3986:
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
313 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
314 * IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
315 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
316
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
317 if ((ret = uri_parse_dec_octet(parser, literal, &octet)) <= 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
318 return ret;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
319 ip = octet;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
320
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
321 for (i = 0; i < 3 && parser->cur < parser->end; i++) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
322 if (*parser->cur != '.')
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
323 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
324
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
325 if (literal != NULL)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
326 str_append_c(literal, '.');
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
327 parser->cur++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
328
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
329 if ((ret = uri_parse_dec_octet(parser, literal, &octet)) <= 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
330 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
331 ip = (ip << 8) + octet;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
332 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
333
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
334 if (ip4_r != NULL)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
335 ip4_r->s_addr = htonl(ip);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
336 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
337 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
338
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
339 static int
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
340 uri_parse_reg_name(struct uri_parser *parser,
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
341 string_t *reg_name) ATTR_NULL(2)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
342 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
343 /* RFC 3986:
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
344 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
345 * reg-name = *( unreserved / pct-encoded / sub-delims )
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
346 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
347
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
348 while (parser->cur < parser->end) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
349 int ret;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
350 unsigned char c;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
351
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
352 /* unreserved / pct-encoded */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
353 if ((ret = uri_parse_unreserved_char(parser, &c)) < 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
354 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
355
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
356 if (ret > 0) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
357 if (reg_name != NULL)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
358 str_append_c(reg_name, c);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
359 continue;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
360 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
361
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
362 /* sub-delims */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
363 c = *parser->cur;
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
364 if ((c & 0x80) == 0 && (_uri_char_lookup[c] & CHAR_MASK_SUB_DELIMS) != 0) {
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
365 if (reg_name != NULL)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
366 str_append_c(reg_name, *parser->cur);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
367 parser->cur++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
368 continue;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
369 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
370 break;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
371 }
18495
9024d226b813 uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
372 return 0;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
373 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
374
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
375 #ifdef HAVE_IPV6
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
376 static int
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
377 uri_parse_ip_literal(struct uri_parser *parser, string_t *literal,
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
378 struct in6_addr *ip6_r) ATTR_NULL(2,3)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
379 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
380 const unsigned char *p;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
381 const char *address;
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
382 struct in6_addr ip6;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
383 int ret;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
384
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
385 /* IP-literal = "[" ( IPv6address / IPvFuture ) "]"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
386 * IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" )
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
387 * IPv6address = ; Syntax not relevant: parsed using inet_pton()
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
388 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
389
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
390 /* "[" already verified */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
391
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
392 /* Scan for end of address */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
393 for (p = parser->cur+1; p < parser->end; p++) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
394 if (*p == ']')
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
395 break;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
396 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
397
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
398 if (p >= parser->end || *p != ']') {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
399 parser->error = "Expecting ']' at end of IP-literal";
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
400 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
401 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
402
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
403 if (literal != NULL)
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
404 str_append_n(literal, parser->cur, p-parser->cur+1);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
405 address = t_strdup_until(parser->cur+1, p);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
406 parser->cur = p + 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
407
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
408 if (*address == '\0') {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
409 parser->error = "Empty IPv6 host address";
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
410 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
411 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
412 if (*address == 'v') {
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
413 parser->error = p_strdup_printf(parser->pool,
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
414 "Future IP host address '%s' not supported", address);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
415 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
416 }
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
417 if ((ret = inet_pton(AF_INET6, address, &ip6)) <= 0) {
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
418 parser->error = p_strdup_printf(parser->pool,
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
419 "Invalid IPv6 host address '%s'", address);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
420 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
421 }
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
422 if (ip6_r != NULL)
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
423 *ip6_r = ip6;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
424 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
425 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
426 #endif
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
427
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
428 static int
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
429 uri_parse_host(struct uri_parser *parser,
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
430 struct uri_authority *auth) ATTR_NULL(2)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
431 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
432 const unsigned char *preserve;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
433 struct in_addr ip4;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
434 struct in6_addr ip6;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
435 string_t *literal = NULL;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
436 int ret;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
437
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
438 /* RFC 3986:
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
439 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
440 * host = IP-literal / IPv4address / reg-name
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
441 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
442
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
443 literal = uri_parser_get_tmpbuf(parser, 256);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
444
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
445 /* IP-literal / */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
446 if (parser->cur < parser->end && *parser->cur == '[') {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
447 #ifdef HAVE_IPV6
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
448 if ((ret=uri_parse_ip_literal(parser, literal, &ip6)) <= 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
449 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
450
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
451 if (auth != NULL) {
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
452 auth->host_literal = p_strdup(parser->pool, str_c(literal));
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
453 auth->host_ip.family = AF_INET6;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
454 auth->host_ip.u.ip6 = ip6;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
455 auth->have_host_ip = TRUE;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
456 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
457 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
458 #else
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
459 parser->error = "IPv6 host address is not supported";
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
460 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
461 #endif
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
462 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
463
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
464 /* IPv4address /
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
465 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
466 * If it fails to parse, we try to parse it as a reg-name
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
467 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
468 preserve = parser->cur;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
469 if ((ret = uri_parse_ipv4address(parser, literal, &ip4)) > 0) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
470 if (auth != NULL) {
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
471 auth->host_literal = p_strdup(parser->pool, str_c(literal));
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
472 auth->host_ip.family = AF_INET;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
473 auth->host_ip.u.ip4 = ip4;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
474 auth->have_host_ip = TRUE;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
475 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
476 return ret;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
477 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
478 parser->cur = preserve;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
479 str_truncate(literal, 0);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
480
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
481 /* reg-name */
18495
9024d226b813 uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
482 if (uri_parse_reg_name(parser, literal) < 0)
9024d226b813 uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
483 return -1;
9024d226b813 uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
484 if (auth != NULL) {
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
485 auth->host_literal = p_strdup(parser->pool, str_c(literal));
18495
9024d226b813 uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
486 auth->have_host_ip = FALSE;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
487 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
488 return 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
489 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
490
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
491 static int
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
492 uri_parse_port(struct uri_parser *parser,
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
493 struct uri_authority *auth) ATTR_NULL(2)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
494 {
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
495 const unsigned char *first;
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
496 in_port_t port;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
497
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
498 /* RFC 3986:
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
499 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
500 * port = *DIGIT
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
501 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
502
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
503 first = parser->cur;
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
504 while (parser->cur < parser->end && i_isdigit(*parser->cur))
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
505 parser->cur++;
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
506
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
507 if (parser->cur == first)
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
508 return 0;
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
509 if (net_str2port(t_strdup_until(first, parser->cur), &port) < 0) {
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
510 parser->error = "Invalid port number";
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
511 return -1;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
512 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
513
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
514 if (auth != NULL) {
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
515 auth->port = port;
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
516 auth->have_port = TRUE;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
517 }
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18497
diff changeset
518 return 1;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
519 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
520
16738
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
521 int uri_parse_authority(struct uri_parser *parser,
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
522 struct uri_authority *auth)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
523 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
524 const unsigned char *p;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
525 int ret;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
526
16738
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
527 /*
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
528 * authority = [ userinfo "@" ] host [ ":" port ]
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
529 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
530
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
531 if (auth != NULL)
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21364
diff changeset
532 i_zero(auth);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
533
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
534 /* Scan ahead to check whether there is a [userinfo "@"] uri component */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
535 for (p = parser->cur; p < parser->end; p++){
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
536 /* refuse 8bit characters */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
537 if ((*p & 0x80) != 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
538 break;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
539
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
540 /* break at first delimiter */
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
541 if (*p != '%' && (_uri_char_lookup[*p] & CHAR_MASK_UCHAR) == 0)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
542 break;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
543 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
544
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
545 /* Extract userinfo */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
546 if (p < parser->end && *p == '@') {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
547 if (auth != NULL)
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
548 auth->enc_userinfo = p_strdup_until(parser->pool, parser->cur, p);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
549 parser->cur = p+1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
550 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
551
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
552 /* host */
18495
9024d226b813 uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
553 if (uri_parse_host(parser, auth) < 0)
9024d226b813 uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
554 return -1;
18496
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
555 if (parser->cur == parser->end)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
556 return 1;
18496
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
557 switch (*parser->cur) {
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
558 case ':': case '/': case '?': case '#':
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
559 break;
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
560 default:
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
561 parser->error = "Invalid host identifier";
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
562 return -1;
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
563 }
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
564
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
565 /* [":" port] */
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
566 if (*parser->cur == ':') {
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
567 parser->cur++;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
568
18496
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
569 if ((ret = uri_parse_port(parser, auth)) < 0)
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
570 return ret;
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
571 if (parser->cur == parser->end)
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
572 return 1;
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
573 switch (*parser->cur) {
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
574 case '/': case '?': case '#':
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
575 break;
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
576 default:
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
577 parser->error = "Invalid host port";
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
578 return -1;
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
579 }
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
580 }
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
581
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
582 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
583 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
584
16738
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
585 int uri_parse_slashslash_authority(struct uri_parser *parser,
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
586 struct uri_authority *auth)
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
587 {
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
588 /* "//" authority */
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
589
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
590 if ((parser->end - parser->cur) <= 2 || parser->cur[0] != '/' ||
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
591 parser->cur[1] != '/')
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
592 return 0;
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
593
16757
a114a8bfce61 Fixed uri_parse_slashslash_authority() to skip over "//".
Timo Sirainen <tss@iki.fi>
parents: 16738
diff changeset
594 parser->cur += 2;
16738
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
595 return uri_parse_authority(parser, auth);
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
596 }
3bd334529536 uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents: 16666
diff changeset
597
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
598 int uri_parse_path_segment(struct uri_parser *parser, const char **segment_r)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
599 {
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
600 const unsigned char *first = parser->cur;
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
601 int ret;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
602
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
603 while (parser->cur < parser->end) {
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
604 if (*parser->cur == '%') {
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
605 unsigned char ch = 0;
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
606 if ((ret=uri_parse_pct_encoded(parser, &ch)) < 0)
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
607 return -1;
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
608 if (ret > 0)
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
609 continue;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
610 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
611
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
612 if ((*parser->cur & 0x80) != 0 ||
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
613 (_uri_char_lookup[*parser->cur] & CHAR_MASK_PCHAR) == 0)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
614 break;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
615
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
616 parser->cur++;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
617 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
618
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
619 if (parser->cur < parser->end &&
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
620 *parser->cur != '/' && *parser->cur != '?' && *parser->cur != '#' ) {
20866
07f2f4327553 uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents: 20863
diff changeset
621 parser->error =
07f2f4327553 uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents: 20863
diff changeset
622 "Path component contains invalid character";
07f2f4327553 uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents: 20863
diff changeset
623 return -1;
07f2f4327553 uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents: 20863
diff changeset
624 }
07f2f4327553 uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents: 20863
diff changeset
625
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
626 if (first == parser->cur)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
627 return 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
628
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
629 if (segment_r != NULL)
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
630 *segment_r = p_strdup_until(parser->pool, first, parser->cur);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
631 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
632 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
633
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
634 int uri_parse_path(struct uri_parser *parser,
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
635 int *relative_r, const char *const **path_r)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
636 {
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
637 const unsigned char *pbegin = parser->cur;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
638 ARRAY_TYPE(const_string) segments;
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
639 const char *segment = NULL;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
640 unsigned int count;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
641 int relative = 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
642 int ret;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
643
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
644 count = 0;
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
645 if (path_r != NULL)
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
646 p_array_init(&segments, parser->pool, 16);
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
647 else
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21364
diff changeset
648 i_zero(&segments);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
649
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
650 /* check for a leading '/' and indicate absolute path
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
651 when it is present
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
652 */
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
653 if (parser->cur < parser->end && *parser->cur == '/') {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
654 parser->cur++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
655 relative = 0;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
656 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
657
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
658 /* parse first segment */
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
659 if ((ret = uri_parse_path_segment(parser, &segment)) < 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
660 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
661
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
662 for (;;) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
663 if (ret > 0) {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
664 /* strip dot segments */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
665 if (segment[0] == '.') {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
666 if (segment[1] == '.') {
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
667 if (segment[2] == '\0') {
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
668 /* '..' -> skip and... */
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
669 segment = NULL;
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
670
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
671 /* ... pop last segment (if any) */
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
672 if (count > 0) {
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
673 if (path_r != NULL) {
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
674 i_assert(count == array_count(&segments));
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
675 array_delete(&segments, count-1, 1);
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
676 }
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
677 count--;
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
678 } else if ( relative > 0 ) {
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
679 relative++;
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
680 }
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
681 }
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
682 } else if (segment[1] == '\0') {
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
683 /* '.' -> skip */
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
684 segment = NULL;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
685 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
686 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
687 } else {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
688 segment = "";
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
689 }
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
690
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
691 if (segment != NULL) {
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
692 if (path_r != NULL)
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
693 array_append(&segments, &segment, 1);
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
694 count++;
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
695 }
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
696
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
697 if (parser->cur >= parser->end || *parser->cur != '/')
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
698 break;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
699 parser->cur++;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
700
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
701 /* parse next path segment */
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
702 if ((ret = uri_parse_path_segment(parser, &segment)) < 0)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
703 return -1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
704 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
705
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
706 if (relative_r != NULL)
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
707 *relative_r = relative;
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
708 if (path_r != NULL)
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
709 *path_r = NULL;
17537
3f9d15b600b1 imap-url: Fixed handling of ipath-empty syntax (basically empty relative URLs).
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
710
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
711 if (parser->cur == pbegin) {
17537
3f9d15b600b1 imap-url: Fixed handling of ipath-empty syntax (basically empty relative URLs).
Stephan Bosch <stephan@rename-it.nl>
parents: 17130
diff changeset
712 /* path part of URI is empty */
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
713 return 0;
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
714 }
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
715
18497
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
716 if (path_r != NULL) {
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
717 /* special treatment for a trailing '..' or '.' */
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
718 if (segment == NULL) {
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
719 segment = "";
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
720 array_append(&segments, &segment, 1);
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
721 }
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
722 array_append_zero(&segments);
49bcc3954799 uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents: 18496
diff changeset
723 *path_r = array_get(&segments, &count);
15193
f960ad98429c uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents: 15187
diff changeset
724 }
18496
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
725 if (parser->cur < parser->end &&
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
726 *parser->cur != '?' && *parser->cur != '#') {
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
727 parser->error = "Path component contains invalid character";
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
728 return -1;
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
729 }
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
730 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
731 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
732
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
733 int uri_parse_query(struct uri_parser *parser, const char **query_r)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
734 {
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
735 const unsigned char *first = parser->cur;
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
736 int ret;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
737
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
738 /* RFC 3986:
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
739 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
740 * URI = { ... } [ "?" query ] { ... }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
741 * query = *( pchar / "/" / "?" )
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
742 * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
743 */
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
744 if (parser->cur >= parser->end || *parser->cur != '?')
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
745 return 0;
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
746 parser->cur++;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
747
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
748 while (parser->cur < parser->end) {
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
749 if (*parser->cur == '%') {
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
750 unsigned char ch = 0;
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
751 if ((ret=uri_parse_pct_encoded(parser, &ch)) < 0)
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
752 return -1;
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
753 if (ret > 0)
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
754 continue;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
755 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
756
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
757 if ((*parser->cur & 0x80) != 0 ||
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
758 (_uri_char_lookup[*parser->cur] & CHAR_MASK_QCHAR) == 0)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
759 break;
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
760 parser->cur++;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
761 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
762
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
763 if (parser->cur < parser->end && *parser->cur != '#') {
18496
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
764 parser->error = "Query component contains invalid character";
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
765 return -1;
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
766 }
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
767
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
768 if (query_r != NULL)
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
769 *query_r = p_strdup_until(parser->pool, first+1, parser->cur);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
770 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
771 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
772
14594
27c8a6c9088d Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents: 14587
diff changeset
773 int uri_parse_fragment(struct uri_parser *parser, const char **fragment_r)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
774 {
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
775 const unsigned char *first = parser->cur;
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
776 int ret;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
777
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
778 /* RFC 3986:
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
779 *
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
780 * URI = { ... } [ "#" fragment ]
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
781 * fragment = *( pchar / "/" / "?" )
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
782 * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
783 */
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
784
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
785 if (parser->cur >= parser->end || *parser->cur != '#')
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
786 return 0;
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
787 parser->cur++;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
788
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
789 while (parser->cur < parser->end) {
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
790 if (*parser->cur == '%') {
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
791 unsigned char ch = 0;
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
792 if ((ret=uri_parse_pct_encoded(parser, &ch)) < 0)
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
793 return -1;
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
794 if (ret > 0)
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
795 continue;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
796 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
797
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
798 if ((*parser->cur & 0x80) != 0 ||
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
799 (_uri_char_lookup[*parser->cur] & CHAR_MASK_QCHAR) == 0)
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
800 break;
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
801 parser->cur++;
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
802 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
803
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
804 if (parser->cur < parser->end) {
18496
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
805 parser->error = "Fragment component contains invalid character";
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
806 return -1;
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
807 }
5ae8cd8e42f7 uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents: 18495
diff changeset
808
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
809 if (fragment_r != NULL)
20868
82e8fc1b394f lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents: 20867
diff changeset
810 *fragment_r = p_strdup_until(parser->pool, first+1, parser->cur);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
811 return 1;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
812 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
813
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
814 void uri_parser_init(struct uri_parser *parser, pool_t pool, const char *data)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
815 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
816 parser->pool = pool;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
817 parser->begin = parser->cur = (unsigned char *)data;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
818 parser->end = (unsigned char *)data + strlen(data);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
819 parser->error = NULL;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
820 parser->tmpbuf = NULL;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
821 }
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
822
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
823 string_t *uri_parser_get_tmpbuf(struct uri_parser *parser, size_t size)
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
824 {
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
825 if (parser->tmpbuf == NULL)
19299
b0545670fd99 lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
826 parser->tmpbuf = str_new(parser->pool, size);
14587
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
827 else
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
828 str_truncate(parser->tmpbuf, 0);
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
829 return parser->tmpbuf;
ba36e4380cf4 liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
830 }
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
831
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
832 /*
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
833 * Generic URI construction
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
834 */
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
835
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
836 static void
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
837 uri_data_encode(string_t *out, const unsigned char esc_table[256],
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
838 unsigned char esc_mask, const char *esc_extra, const char *data)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
839 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
840 const unsigned char *p = (const unsigned char *)data;
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
841
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
842 while (*p != '\0') {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
843 if ((*p & 0x80) != 0 || (esc_table[*p] & esc_mask) == 0 ||
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
844 strchr(esc_extra, (char)*p) != NULL) {
15487
ce258aa11821 uri-util: Control characters weren't properly escaped.
Timo Sirainen <tss@iki.fi>
parents: 15193
diff changeset
845 str_printfa(out, "%%%02x", *p);
15045
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
846 } else {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
847 str_append_c(out, *p);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
848 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
849 p++;
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
850 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
851 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
852
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
853 void uri_append_scheme(string_t *out, const char *scheme)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
854 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
855 str_append(out, scheme);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
856 str_append_c(out, ':');
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
857 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
858
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
859 void uri_append_user_data(string_t *out, const char *esc,
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
860 const char *data)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
861 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
862 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_UCHAR, esc, data);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
863 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
864
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
865 void uri_append_userinfo(string_t *out, const char *userinfo)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
866 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
867 uri_append_user_data(out, "", userinfo);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
868 str_append_c(out, '@');
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
869 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
870
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
871 void uri_append_host_name(string_t *out, const char *name)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
872 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
873 uri_data_encode(out, _uri_char_lookup,
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
874 CHAR_MASK_UNRESERVED | CHAR_MASK_SUB_DELIMS, "", name);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
875 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
876
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
877 void uri_append_host_ip(string_t *out, const struct ip_addr *host_ip)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
878 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
879 const char *addr = net_ip2addr(host_ip);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
880
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
881 if (host_ip->family == AF_INET) {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
882 str_append(out, addr);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
883 return;
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
884 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
885
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
886 i_assert(host_ip->family == AF_INET6);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
887 str_append_c(out, '[');
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
888 str_append(out, addr);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
889 str_append_c(out, ']');
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
890 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
891
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
892 void uri_append_port(string_t *out, in_port_t port)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
893 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
894 str_printfa(out, ":%u", port);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
895 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
896
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
897 void uri_append_path_segment_data(string_t *out, const char *esc,
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
898 const char *data)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
899 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
900 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_PCHAR, esc, data);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
901 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
902
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
903 void uri_append_path_segment(string_t *out, const char *segment)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
904 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
905 str_append_c(out, '/');
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
906 if (*segment != '\0')
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
907 uri_append_path_data(out, "", segment);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
908 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
909
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
910 void uri_append_path_data(string_t *out, const char *esc,
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
911 const char *data)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
912 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
913 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_PFCHAR, esc, data);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
914 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
915
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
916 void uri_append_path(string_t *out, const char *path)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
917 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
918 str_append_c(out, '/');
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
919 if (*path != '\0')
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
920 uri_append_path_data(out, "", path);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
921 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
922
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
923 void uri_append_query_data(string_t *out, const char *esc,
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
924 const char *data)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
925 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
926 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_QCHAR, esc, data);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
927 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
928
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
929 void uri_append_query(string_t *out, const char *query)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
930 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
931 str_append_c(out, '?');
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
932 if (*query != '\0')
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
933 uri_append_query_data(out, "", query);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
934 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
935
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
936 void uri_append_fragment_data(string_t *out, const char *esc,
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
937 const char *data)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
938 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
939 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_QCHAR, esc, data);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
940 }
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
941
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
942 void uri_append_fragment(string_t *out, const char *fragment)
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
943 {
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
944 str_append_c(out, '#');
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
945 if (*fragment != '\0')
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
946 uri_append_fragment_data(out, "", fragment);
345e96ca65a2 Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents: 14737
diff changeset
947 }