Skip to content

Commit

Permalink
uri-util: Reworked URI scheme parsing.
Browse files Browse the repository at this point in the history
Made uri_cut_scheme() use uri_parse_scheme() internally rather than the other way around.
  • Loading branch information
stephanbosch authored and GitLab committed May 16, 2016
1 parent 66134fb commit b4167b1
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 32 deletions.
6 changes: 3 additions & 3 deletions src/lib-http/http-url.c
Expand Up @@ -164,9 +164,9 @@ static bool http_url_do_parse(struct http_url_parser *url_parser)
if ((url_parser->flags & HTTP_URL_PARSE_SCHEME_EXTERNAL) == 0) {
const char *scheme;

if ((ret = uri_parse_scheme(parser, &scheme)) < 0)
return FALSE;
else if (ret > 0) {
if ((ret = uri_parse_scheme(parser, &scheme)) <= 0) {
parser->cur = parser->begin;
} else {
if (strcasecmp(scheme, "https") == 0) {
if (url != NULL)
url->have_ssl = TRUE;
Expand Down
6 changes: 3 additions & 3 deletions src/lib-imap/imap-url.c
Expand Up @@ -795,9 +795,9 @@ static bool imap_url_do_parse(struct imap_url_parser *url_parser)
if ((url_parser->flags & IMAP_URL_PARSE_SCHEME_EXTERNAL) == 0) {
const char *scheme;

if ((ret = uri_parse_scheme(parser, &scheme)) < 0)
return FALSE;
else if (ret > 0) {
if (uri_parse_scheme(parser, &scheme) <= 0) {
parser->cur = parser->begin;
} else {
if (strcasecmp(scheme, "imap") != 0) {
parser->error = "Not an IMAP URL";
return FALSE;
Expand Down
50 changes: 24 additions & 26 deletions src/lib/uri-util.c
Expand Up @@ -277,50 +277,48 @@ bool uri_data_decode(struct uri_parser *parser, const char *data,
return TRUE;
}

int uri_cut_scheme(const char **uri_p, const char **scheme_r)
int uri_parse_scheme(struct uri_parser *parser, const char **scheme_r)
{
const char *p = *uri_p;
const unsigned char *first = parser->cur;
size_t len = 1;

/* RFC 3968:
* scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
*/

if (!i_isalpha(*p))
return -1;
p++;
if (parser->cur >= parser->end || !i_isalpha(*parser->cur))
return 0;
parser->cur++;

while (len < URI_MAX_SCHEME_NAME_LEN && *p != '\0') {
if (!i_isalnum(*p) && *p != '+' && *p != '-' && *p != '.')
while (len < URI_MAX_SCHEME_NAME_LEN &&
parser->cur < parser->end) {
if (!i_isalnum(*parser->cur) &&
*parser->cur != '+' && *parser->cur != '-' &&
*parser->cur != '.')
break;
p++;
parser->cur++;
len++;
}

if (*p != ':')
if (parser->cur >= parser->end || *parser->cur != ':') {
parser->error = "Invalid URI scheme";
return -1;

}
if (scheme_r != NULL)
*scheme_r = t_strdup_until(*uri_p, p);
*uri_p = p + 1;
return 0;
*scheme_r = t_strndup(first, parser->cur - first);
parser->cur++;
return 1;
}

int uri_parse_scheme(struct uri_parser *parser, const char **scheme_r)
int uri_cut_scheme(const char **uri_p, const char **scheme_r)
{
const char *p;

if (parser->cur >= parser->end)
return 0;
struct uri_parser parser;

p = (const char *)parser->cur;
if (uri_cut_scheme(&p, scheme_r) < 0)
return 0;

parser->cur = (const unsigned char *)p;
if (!parser->pool->datastack_pool)
*scheme_r = p_strdup(parser->pool, *scheme_r);
return 1;
uri_parser_init(&parser, NULL, *uri_p);
if (uri_parse_scheme(&parser, scheme_r) <= 0)
return -1;
*uri_p = (const char *)parser.cur;
return 0;
}

static int
Expand Down

0 comments on commit b4167b1

Please sign in to comment.