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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 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
2ac184a82b9a Compiler warning fix.
Timo Sirainen <tss@iki.fi>
parents: 15195
diff changeset
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 }