Mercurial > dovecot > core-2.2
annotate src/lib-http/http-url.c @ 22633:9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Recreate it only when the timeout should change.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 04 Nov 2017 01:34:02 +0200 |
parents | 2e2563132d5f |
children | cb108f786fb4 |
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) 2013-2017 Dovecot authors, see the included COPYING file */ |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
2 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
3 #include "lib.h" |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
4 #include "str.h" |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
5 #include "strfuncs.h" |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
6 #include "net.h" |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
7 #include "uri-util.h" |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
8 |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
9 #include "http-url.h" |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
10 #include "http-request.h" |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
11 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
12 /* |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
13 * HTTP URL parser |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
14 */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
15 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
16 struct http_url_parser { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
17 struct uri_parser parser; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
18 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
19 enum http_url_parse_flags flags; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
20 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
21 struct http_url *url; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
22 struct http_url *base; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
23 |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
24 enum http_request_target_format req_format; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
25 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
26 unsigned int relative:1; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
27 unsigned int request_target:1; |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
28 }; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
29 |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
30 static bool http_url_parse_authority(struct http_url_parser *url_parser) |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
31 { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
32 struct uri_parser *parser = &url_parser->parser; |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
33 struct http_url *url = url_parser->url; |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
34 struct uri_authority auth; |
16761
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
35 const char *user = NULL, *password = NULL; |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
36 int ret; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
37 |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
38 if ((ret = uri_parse_authority(parser, &auth)) < 0) |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
39 return FALSE; |
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
|
40 if (auth.host_literal == NULL || *auth.host_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
|
41 /* RFC 7230, Section 2.7.1: http URI Scheme |
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
|
42 |
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
|
43 A sender MUST NOT generate an "http" URI with an empty host |
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
|
44 identifier. A recipient that processes such a URI reference MUST |
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
|
45 reject it as invalid. |
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
|
46 */ |
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
|
47 parser->error = "HTTP URL does not allow empty host identifier"; |
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
|
48 return FALSE; |
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
|
49 } |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
50 if (ret > 0) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
51 if (auth.enc_userinfo != NULL) { |
16761
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
52 const char *p; |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
53 |
16761
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
54 if ((url_parser->flags & HTTP_URL_ALLOW_USERINFO_PART) == 0) { |
17549
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
55 /* RFC 7230, Section 2.7.1: http URI Scheme |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
56 |
17549
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
57 A sender MUST NOT generate the userinfo subcomponent (and its "@" |
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
58 delimiter) when an "http" URI reference is generated within a |
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
59 message as a request target or header field value. Before making |
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
60 use of an "http" URI reference received from an untrusted source, |
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
61 a recipient SHOULD parse for userinfo and treat its presence as |
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
62 an error; it is likely being used to obscure the authority for |
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
63 the sake of phishing attacks. |
16761
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
64 */ |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
65 parser->error = "HTTP URL does not allow `userinfo@' part"; |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
66 return FALSE; |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
67 } |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
68 |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
69 p = strchr(auth.enc_userinfo, ':'); |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
70 if (p == NULL) { |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
71 if (!uri_data_decode(parser, auth.enc_userinfo, NULL, &user)) |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
72 return FALSE; |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
73 } else { |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
74 if (!uri_data_decode(parser, auth.enc_userinfo, p, &user)) |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
75 return FALSE; |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
76 if (!uri_data_decode(parser, p+1, NULL, &password)) |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
77 return FALSE; |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
78 } |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
79 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
80 } |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
81 if (url != NULL) { |
15432
12a31e13fcab
lib-http: http_url_parse() didn't allocate all strings from the given pool.
Timo Sirainen <tss@iki.fi>
parents:
15431
diff
changeset
|
82 url->host_name = p_strdup(parser->pool, auth.host_literal); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
83 url->host_ip = auth.host_ip; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
84 url->have_host_ip = auth.have_host_ip; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
85 url->port = auth.port; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
86 url->have_port = auth.have_port; |
16761
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
87 url->user = p_strdup(parser->pool, user); |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
88 url->password = p_strdup(parser->pool, password); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
89 } |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
90 return TRUE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
91 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
92 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
93 static bool http_url_parse_authority_form(struct http_url_parser *url_parser) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
94 { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
95 struct uri_parser *parser = &url_parser->parser; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
96 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
97 if (!http_url_parse_authority(url_parser)) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
98 return FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
99 if (parser->cur != parser->end) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
100 return FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
101 url_parser->req_format = HTTP_REQUEST_TARGET_FORMAT_AUTHORITY; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
102 return TRUE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
103 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
104 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
105 static bool http_url_do_parse(struct http_url_parser *url_parser) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
106 { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
107 struct uri_parser *parser = &url_parser->parser; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
108 struct http_url *url = url_parser->url, *base = url_parser->base; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
109 const char *const *path; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
110 bool relative = TRUE, have_scheme = FALSE, have_authority = FALSE, |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
111 have_path = FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
112 int path_relative; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
113 const char *part; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
114 int ret; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
115 |
17549
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
116 /* RFC 7230, Appendix B: |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
117 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
118 http-URI = "http://" authority path-abempty [ "?" query ] |
17549
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
119 [ "#" fragment ] |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
120 https-URI = "https://" authority path-abempty [ "?" query ] |
17549
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
121 [ "#" fragment ] |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
122 partial-URI = relative-part [ "?" query ] |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
123 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
124 request-target = origin-form / absolute-form / authority-form / |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
125 asterisk-form |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
126 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
127 origin-form = absolute-path [ "?" query ] |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
128 absolute-form = absolute-URI |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
129 authority-form = authority |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
130 asterisk-form = "*" |
17549
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
131 ; Not parsed here |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
132 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
133 absolute-path = 1*( "/" segment ) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
134 |
17549
9511372c7c18
lib-http: Updated comments to RFC7230/RFC7231.
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
135 RFC 3986, Appendix A: (implemented in uri-util.h) |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
136 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
137 absolute-URI = scheme ":" hier-part [ "?" query ] |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
138 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
139 hier-part = "//" authority path-abempty |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
140 / path-absolute |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
141 / path-rootless |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
142 / path-empty |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
143 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
144 relative-part = "//" authority path-abempty |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
145 / path-absolute |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
146 / path-noscheme |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
147 / path-empty |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
148 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
149 authority = [ userinfo "@" ] host [ ":" port ] |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
150 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
151 path-abempty = *( "/" segment ) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
152 path-absolute = "/" [ segment-nz *( "/" segment ) ] |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
153 path-noscheme = segment-nz-nc *( "/" segment ) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
154 path-rootless = segment-nz *( "/" segment ) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
155 path-empty = 0<pchar> |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
156 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
157 segment = *pchar |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
158 segment-nz = 1*pchar |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
159 segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
160 ; non-zero-length segment without any colon ":" |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
161 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
162 query = *( pchar / "/" / "?" ) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
163 fragment = *( pchar / "/" / "?" ) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
164 */ |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
165 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
166 /* "http:" / "https:" */ |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
167 if ((url_parser->flags & HTTP_URL_PARSE_SCHEME_EXTERNAL) == 0) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
168 const char *scheme; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
169 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
170 if ((ret = uri_parse_scheme(parser, &scheme)) < 0) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
171 return FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
172 else if (ret > 0) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
173 if (strcasecmp(scheme, "https") == 0) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
174 if (url != NULL) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
175 url->have_ssl = TRUE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
176 } else if (strcasecmp(scheme, "http") != 0) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
177 if (url_parser->request_target) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
178 /* valid as non-HTTP scheme, but also try to parse as authority */ |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
179 parser->cur = parser->begin; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
180 if (!http_url_parse_authority_form(url_parser)) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
181 url_parser->url = NULL; /* indicate non-http-url */ |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
182 url_parser->req_format = HTTP_REQUEST_TARGET_FORMAT_ABSOLUTE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
183 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
184 return TRUE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
185 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
186 parser->error = "Not an HTTP URL"; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
187 return FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
188 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
189 relative = FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
190 have_scheme = TRUE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
191 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
192 } else { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
193 relative = FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
194 have_scheme = TRUE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
195 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
196 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
197 /* "//" authority ; or |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
198 * ["//"] authority ; when parsing a request target |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
199 */ |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
200 if (parser->cur < parser->end && parser->cur[0] == '/') { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
201 if (parser->cur+1 < parser->end && parser->cur[1] == '/') { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
202 parser->cur += 2; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
203 relative = FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
204 have_authority = TRUE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
205 } else { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
206 /* start of absolute-path */ |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
207 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
208 } else if (url_parser->request_target && !have_scheme) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
209 if (!http_url_parse_authority_form(url_parser)) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
210 /* not non-HTTP scheme and invalid as authority-form */ |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
211 parser->error = "Request target is invalid"; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
212 return FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
213 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
214 return TRUE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
215 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
216 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
217 if (have_scheme && !have_authority) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
218 parser->error = "Absolute HTTP URL requires `//' after `http:'"; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
219 return FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
220 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
221 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
222 if (have_authority) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
223 if (!http_url_parse_authority(url_parser)) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
224 return FALSE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
225 } |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
226 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
227 /* path-abempty / path-absolute / path-noscheme / path-empty */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
228 if ((ret = uri_parse_path(parser, &path_relative, &path)) < 0) |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
229 return FALSE; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
230 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
231 /* Relative URLs are only valid when we have a base URL */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
232 if (relative) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
233 if (base == NULL) { |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
234 parser->error = "Relative HTTP URL not allowed"; |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
235 return FALSE; |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
236 } else if (!have_authority && url != NULL) { |
16761
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
237 url->host_name = p_strdup_empty(parser->pool, base->host_name); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
238 url->host_ip = base->host_ip; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
239 url->have_host_ip = base->have_host_ip; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
240 url->port = base->port; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
241 url->have_port = base->have_port; |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
242 url->have_ssl = base->have_ssl; |
16761
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
243 url->user = p_strdup_empty(parser->pool, base->user); |
ec9eab188dd8
lib-http: Added (non-default) support for parsing user:pasword from HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
16747
diff
changeset
|
244 url->password = p_strdup_empty(parser->pool, base->password); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
245 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
246 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
247 url_parser->relative = TRUE; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
248 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
249 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
250 /* Resolve path */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
251 if (ret > 0) { |
15197 | 252 string_t *fullpath = NULL; |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
253 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
254 have_path = TRUE; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
255 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
256 if (url != NULL) |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
257 fullpath = t_str_new(256); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
258 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
259 if (relative && path_relative > 0 && base->path != NULL) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
260 const char *pbegin = base->path; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
261 const char *pend = base->path + strlen(base->path); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
262 const char *p = pend - 1; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
263 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
264 i_assert(*pbegin == '/'); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
265 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
266 /* discard trailing segments of base path based on how many effective |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
267 leading '..' segments were found in the relative path. |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
268 */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
269 while (path_relative > 0 && p > pbegin) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
270 while (p > pbegin && *p != '/') p--; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
271 if (p >= pbegin) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
272 pend = p; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
273 path_relative--; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
274 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
275 if (p > pbegin) p--; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
276 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
277 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
278 if (url != NULL && pend > pbegin) |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
279 str_append_n(fullpath, pbegin, pend-pbegin); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
280 } |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
281 |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
282 /* append relative path */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
283 while (*path != NULL) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
284 if (!uri_data_decode(parser, *path, NULL, &part)) |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
285 return FALSE; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
286 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
287 if (url != NULL) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
288 str_append_c(fullpath, '/'); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
289 str_append(fullpath, part); |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
290 } |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
291 path++; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
292 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
293 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
294 if (url != NULL) |
15432
12a31e13fcab
lib-http: http_url_parse() didn't allocate all strings from the given pool.
Timo Sirainen <tss@iki.fi>
parents:
15431
diff
changeset
|
295 url->path = p_strdup(parser->pool, str_c(fullpath)); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
296 } else if (relative && url != NULL) { |
15432
12a31e13fcab
lib-http: http_url_parse() didn't allocate all strings from the given pool.
Timo Sirainen <tss@iki.fi>
parents:
15431
diff
changeset
|
297 url->path = p_strdup(parser->pool, base->path); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
298 } |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
299 |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
300 /* [ "?" query ] */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
301 if ((ret = uri_parse_query(parser, &part)) < 0) |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
302 return FALSE; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
303 if (ret > 0) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
304 if (url != NULL) |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
305 url->enc_query = p_strdup(parser->pool, part); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
306 } else if (relative && !have_path && url != NULL) { |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
307 url->enc_query = p_strdup(parser->pool, base->enc_query); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
308 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
309 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
310 /* [ "#" fragment ] */ |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
311 if ((ret = uri_parse_fragment(parser, &part)) < 0) |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
312 return FALSE; |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
313 if (ret > 0) { |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
314 if ((url_parser->flags & HTTP_URL_ALLOW_FRAGMENT_PART) == 0) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
315 parser->error = "URL fragment not allowed for HTTP URL in this context"; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
316 return FALSE; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
317 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
318 if (url != NULL) |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
319 url->enc_fragment = p_strdup(parser->pool, part); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
320 } else if (relative && !have_path && url != NULL) { |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
321 url->enc_fragment = p_strdup(parser->pool, base->enc_fragment); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
322 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
323 |
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
|
324 /* must be at end of URL now */ |
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
|
325 i_assert(parser->cur == parser->end); |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
326 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
327 if (have_scheme) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
328 url_parser->req_format = HTTP_REQUEST_TARGET_FORMAT_ABSOLUTE; |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
329 return TRUE; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
330 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
331 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
332 /* Public API */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
333 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
334 int http_url_parse(const char *url, struct http_url *base, |
15431
c9f6deb65d7b
lib-http: http_url_parse() now returns the http_url allocated from given memory pool.
Timo Sirainen <tss@iki.fi>
parents:
15197
diff
changeset
|
335 enum http_url_parse_flags flags, pool_t pool, |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
336 struct http_url **url_r, const char **error_r) |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
337 { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
338 struct http_url_parser url_parser; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
339 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
340 /* base != NULL indicates whether relative URLs are allowed. However, certain |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
341 flags may also dictate whether relative URLs are allowed/required. */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
342 i_assert((flags & HTTP_URL_PARSE_SCHEME_EXTERNAL) == 0 || base == NULL); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
343 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
344 memset(&url_parser, '\0', sizeof(url_parser)); |
15431
c9f6deb65d7b
lib-http: http_url_parse() now returns the http_url allocated from given memory pool.
Timo Sirainen <tss@iki.fi>
parents:
15197
diff
changeset
|
345 uri_parser_init(&url_parser.parser, pool, url); |
21364
518bc42408d6
lib, lib-http: add HTTP_URL_ALLOW_PCT_NUL flag
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
20815
diff
changeset
|
346 url_parser.parser.allow_pct_nul = (flags & HTTP_URL_ALLOW_PCT_NUL) != 0; |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
347 |
15431
c9f6deb65d7b
lib-http: http_url_parse() now returns the http_url allocated from given memory pool.
Timo Sirainen <tss@iki.fi>
parents:
15197
diff
changeset
|
348 url_parser.url = p_new(pool, struct http_url, 1); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
349 url_parser.base = base; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
350 url_parser.flags = flags; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
351 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
352 if (!http_url_do_parse(&url_parser)) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
353 *error_r = url_parser.parser.error; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
354 return -1; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
355 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
356 *url_r = url_parser.url; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
357 return 0; |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
358 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
359 |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
360 int http_url_request_target_parse(const char *request_target, |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
361 const char *host_header, pool_t pool, struct http_request_target *target, |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
362 const char **error_r) |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
363 { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
364 struct http_url_parser url_parser; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
365 struct uri_parser *parser; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
366 struct uri_authority host; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
367 struct http_url base; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
368 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
369 memset(&url_parser, '\0', sizeof(url_parser)); |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
370 parser = &url_parser.parser; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
371 uri_parser_init(parser, pool, host_header); |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
372 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
373 if (uri_parse_authority(parser, &host) <= 0) { |
16766
8442a0dc44b7
lib-http: http-url: Fixed return of proper error message in case of a failure to parse request target Host header.
Stephan Bosch <stephan@rename-it.nl>
parents:
16761
diff
changeset
|
374 *error_r = t_strdup_printf("Invalid Host header: %s", parser->error); |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
375 return -1; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
376 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
377 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
378 if (parser->cur != parser->end || host.enc_userinfo != NULL) { |
16766
8442a0dc44b7
lib-http: http-url: Fixed return of proper error message in case of a failure to parse request target Host header.
Stephan Bosch <stephan@rename-it.nl>
parents:
16761
diff
changeset
|
379 *error_r = "Invalid Host header: Contains invalid character"; |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
380 return -1; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
381 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
382 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
383 if (request_target[0] == '*' && request_target[1] == '\0') { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
384 struct http_url *url = p_new(pool, struct http_url, 1); |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
385 url->host_name = p_strdup(pool, host.host_literal); |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
386 url->host_ip = host.host_ip; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
387 url->port = host.port; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
388 url->have_host_ip = host.have_host_ip; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
389 url->have_port = host.have_port; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
390 target->url = url; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
391 target->format = HTTP_REQUEST_TARGET_FORMAT_ASTERISK; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
392 return 0; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
393 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
394 |
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
|
395 i_zero(&base); |
16747
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
396 base.host_name = host.host_literal; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
397 base.host_ip = host.host_ip; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
398 base.port = host.port; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
399 base.have_host_ip = host.have_host_ip; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
400 base.have_port = host.have_port; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
401 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
402 memset(parser, '\0', sizeof(*parser)); |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
403 uri_parser_init(parser, pool, request_target); |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
404 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
405 url_parser.url = p_new(pool, struct http_url, 1); |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
406 url_parser.request_target = TRUE; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
407 url_parser.req_format = HTTP_REQUEST_TARGET_FORMAT_ORIGIN; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
408 url_parser.base = &base; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
409 url_parser.flags = 0; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
410 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
411 if (!http_url_do_parse(&url_parser)) { |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
412 *error_r = url_parser.parser.error; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
413 return -1; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
414 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
415 |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
416 target->url = url_parser.url; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
417 target->format = url_parser.req_format; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
418 return 0; |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
419 } |
29ceb7126b91
lib-http: Added support for parsing request target URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16738
diff
changeset
|
420 |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
421 /* |
16853
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
422 * HTTP URL manipulation |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
423 */ |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
424 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
425 void http_url_copy_authority(pool_t pool, struct http_url *dest, |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
426 const struct http_url *src) |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
427 { |
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
|
428 i_zero(dest); |
16853
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
429 dest->host_name = p_strdup(pool, src->host_name); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
430 if (src->have_host_ip) { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
431 dest->host_ip = src->host_ip; |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
432 dest->have_host_ip = TRUE; |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
433 } |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
434 if (src->have_port) { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
435 dest->port = src->port; |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
436 dest->have_port = TRUE; |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
437 } |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
438 dest->have_ssl = src->have_ssl; |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
439 } |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
440 |
18965
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
441 struct http_url *http_url_clone_authority(pool_t pool, |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
442 const struct http_url *src) |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
443 { |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
444 struct http_url *new_url; |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
445 |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
446 new_url = p_new(pool, struct http_url, 1); |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
447 http_url_copy_authority(pool, new_url, src); |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
448 |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
449 return new_url; |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
450 } |
aa695f538fd0
lib-http: url: Implemented http_url_clone_authority() to clone authority part of existing HTTP URL.
Stephan Bosch <stephan@rename-it.nl>
parents:
18964
diff
changeset
|
451 |
16853
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
452 void http_url_copy(pool_t pool, struct http_url *dest, |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
453 const struct http_url *src) |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
454 { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
455 http_url_copy_authority(pool, dest, src); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
456 dest->path = p_strdup(pool, src->path); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
457 dest->enc_query = p_strdup(pool, src->enc_query); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
458 dest->enc_fragment = p_strdup(pool, src->enc_fragment); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
459 } |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
460 |
18964
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
461 void http_url_copy_with_userinfo(pool_t pool, struct http_url *dest, |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
462 const struct http_url *src) |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
463 { |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
464 http_url_copy(pool, dest, src); |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
465 dest->user = p_strdup(pool, src->user); |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
466 dest->password = p_strdup(pool, src->password); |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
467 } |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
468 |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
469 struct http_url *http_url_clone(pool_t pool, const struct http_url *src) |
16853
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
470 { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
471 struct http_url *new_url; |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
472 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
473 new_url = p_new(pool, struct http_url, 1); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
474 http_url_copy(pool, new_url, src); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
475 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
476 return new_url; |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
477 } |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
478 |
18964
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
479 struct http_url *http_url_clone_with_userinfo(pool_t pool, |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
480 const struct http_url *src) |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
481 { |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
482 struct http_url *new_url; |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
483 |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
484 new_url = p_new(pool, struct http_url, 1); |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
485 http_url_copy_with_userinfo(pool, new_url, src); |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
486 |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
487 return new_url; |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
488 } |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
489 |
c1ffec72a134
lib-http: url: Implemented functions to copy/clone URLs including the userinfo part (normally skipped).
Stephan Bosch <stephan@rename-it.nl>
parents:
18957
diff
changeset
|
490 |
16853
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
491 /* |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
492 * HTTP URL construction |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
493 */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
494 |
16853
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
495 static void |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
496 http_url_add_scheme(string_t *urlstr, const struct http_url *url) |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
497 { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
498 /* scheme */ |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
499 if (!url->have_ssl) |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
500 uri_append_scheme(urlstr, "http"); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
501 else |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
502 uri_append_scheme(urlstr, "https"); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
503 str_append(urlstr, "//"); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
504 } |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
505 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
506 static void |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
507 http_url_add_authority(string_t *urlstr, const struct http_url *url) |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
508 { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
509 /* host:port */ |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
510 if (url->host_name != NULL) { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
511 /* assume IPv6 literal if starts with '['; avoid encoding */ |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
512 if (*url->host_name == '[') |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
513 str_append(urlstr, url->host_name); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
514 else |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
515 uri_append_host_name(urlstr, url->host_name); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
516 } else if (url->have_host_ip) { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
517 uri_append_host_ip(urlstr, &url->host_ip); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
518 } else |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
519 i_unreached(); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
520 if (url->have_port) |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
521 uri_append_port(urlstr, url->port); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
522 } |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
523 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
524 static void |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
525 http_url_add_target(string_t *urlstr, const struct http_url *url) |
16643
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
526 { |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
527 if (url->path == NULL || *url->path == '\0') { |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
528 /* Older syntax of RFC 2616 requires this slash at all times for an |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
529 absolute URL |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
530 */ |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
531 str_append_c(urlstr, '/'); |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
532 } else { |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
533 uri_append_path_data(urlstr, "", url->path); |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
534 } |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
535 |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
536 /* query (pre-encoded) */ |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
537 if (url->enc_query != NULL) { |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
538 str_append_c(urlstr, '?'); |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
539 str_append(urlstr, url->enc_query); |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
540 } |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
541 } |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
542 |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
543 const char *http_url_create(const struct http_url *url) |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
544 { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
545 string_t *urlstr = t_str_new(512); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
546 |
16853
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
547 http_url_add_scheme(urlstr, url); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
548 http_url_add_authority(urlstr, url); |
16643
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
549 http_url_add_target(urlstr, url); |
15195
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
550 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
551 /* fragment */ |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
552 if (url->enc_fragment != NULL) { |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
553 str_append_c(urlstr, '#'); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
554 str_append(urlstr, url->enc_fragment); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
555 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
556 |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
557 return str_c(urlstr); |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
558 } |
70305d850220
Adds HTTP URL parse support.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
559 |
16853
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
560 const char *http_url_create_host(const struct http_url *url) |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
561 { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
562 string_t *urlstr = t_str_new(512); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
563 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
564 http_url_add_scheme(urlstr, url); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
565 http_url_add_authority(urlstr, url); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
566 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
567 return str_c(urlstr); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
568 } |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
569 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
570 const char *http_url_create_authority(const struct http_url *url) |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
571 { |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
572 string_t *urlstr = t_str_new(256); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
573 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
574 http_url_add_authority(urlstr, url); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
575 |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
576 return str_c(urlstr); |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
577 } |
9709839d2be7
lib-http: Implemented functions for cloning and copying HTTP URLs and for constructing partial URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
16766
diff
changeset
|
578 |
16643
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
579 const char *http_url_create_target(const struct http_url *url) |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
580 { |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
581 string_t *urlstr = t_str_new(256); |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
582 |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
583 http_url_add_target(urlstr, url); |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
584 |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
585 return str_c(urlstr); |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
586 } |
3af0ae411b37
lib-http: Fixed redirect request target encoding and NULL target.
Timo Sirainen <tss@iki.fi>
parents:
16370
diff
changeset
|
587 |
16890
37ebef9f641f
lib-http: Added http_url_escape_path()
Timo Sirainen <tss@iki.fi>
parents:
16853
diff
changeset
|
588 void http_url_escape_path(string_t *out, const char *data) |
37ebef9f641f
lib-http: Added http_url_escape_path()
Timo Sirainen <tss@iki.fi>
parents:
16853
diff
changeset
|
589 { |
37ebef9f641f
lib-http: Added http_url_escape_path()
Timo Sirainen <tss@iki.fi>
parents:
16853
diff
changeset
|
590 uri_append_query_data(out, "&;?=+", data); |
37ebef9f641f
lib-http: Added http_url_escape_path()
Timo Sirainen <tss@iki.fi>
parents:
16853
diff
changeset
|
591 } |
37ebef9f641f
lib-http: Added http_url_escape_path()
Timo Sirainen <tss@iki.fi>
parents:
16853
diff
changeset
|
592 |
15722
b1a03d3c0ae7
lib-http: Added http_url_escape_param()
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
593 void http_url_escape_param(string_t *out, const char *data) |
b1a03d3c0ae7
lib-http: Added http_url_escape_param()
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
594 { |
16370
fe66746d8a66
http_url_escape_param(): Added more characters to be escaped.
Timo Sirainen <tss@iki.fi>
parents:
15722
diff
changeset
|
595 uri_append_query_data(out, "&;/?=+", data); |
15722
b1a03d3c0ae7
lib-http: Added http_url_escape_param()
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
596 } |