mod_http_cache: fixed S3 URL parser to allow mybucketsubdomain.com.s3.amazonaws.com

This commit is contained in:
Chris Rienzo 2014-08-12 16:07:56 -04:00
parent cda7ecc4b2
commit f0ec893f43
2 changed files with 47 additions and 7 deletions

View File

@ -105,6 +105,39 @@ char *aws_s3_signature(char *signature, int signature_length, const char *string
return signature; return signature;
} }
/**
* Reverse string substring search
*/
static char *my_strrstr(const char *haystack, const char *needle)
{
char *s;
size_t needle_len;
size_t haystack_len;
if (zstr(haystack)) {
return NULL;
}
if (zstr(needle)) {
return (char *)haystack;
}
needle_len = strlen(needle);
haystack_len = strlen(haystack);
if (needle_len > haystack_len) {
return NULL;
}
s = (char *)(haystack + haystack_len - needle_len);
do {
if (!strncmp(s, needle, needle_len)) {
return s;
}
} while (s-- != haystack);
return NULL;
}
/** /**
* Parse bucket and object from URL * Parse bucket and object from URL
* @param url to parse. This value is modified. * @param url to parse. This value is modified.
@ -113,7 +146,7 @@ char *aws_s3_signature(char *signature, int signature_length, const char *string
*/ */
void aws_s3_parse_url(char *url, char **bucket, char **object) void aws_s3_parse_url(char *url, char **bucket, char **object)
{ {
char *bucket_start; char *bucket_start = NULL;
char *bucket_end; char *bucket_end;
char *object_start; char *object_start;
@ -124,15 +157,18 @@ void aws_s3_parse_url(char *url, char **bucket, char **object)
return; return;
} }
/* expect: http(s)://bucket.s3.amazonaws.com/object */ /* expect: http(s)://bucket.foo-bar.s3.amazonaws.com/object */
bucket_start = strstr(url, "://"); if (!strncasecmp(url, "https://", 8)) {
if (!bucket_start) { bucket_start = url + 8;
} else if (!strncasecmp(url, "http://", 7)) {
bucket_start = url + 7;
}
if (zstr(bucket_start)) {
/* invalid URL */ /* invalid URL */
return; return;
} }
bucket_start += 3;
bucket_end = my_strrstr(bucket_start, ".s3");
bucket_end = strchr(bucket_start, '.');
if (!bucket_end) { if (!bucket_end) {
/* invalid URL */ /* invalid URL */
return; return;

View File

@ -111,6 +111,10 @@ static void test_parse_url(void)
aws_s3_parse_url(strdup("https://my-bucket-with-dash.s3-us-west-2.amazonaws.com/greeting/file/1002/Lumino.mp3"), &bucket, &object); aws_s3_parse_url(strdup("https://my-bucket-with-dash.s3-us-west-2.amazonaws.com/greeting/file/1002/Lumino.mp3"), &bucket, &object);
ASSERT_STRING_EQUALS("my-bucket-with-dash", bucket); ASSERT_STRING_EQUALS("my-bucket-with-dash", bucket);
ASSERT_STRING_EQUALS("greeting/file/1002/Lumino.mp3", object); ASSERT_STRING_EQUALS("greeting/file/1002/Lumino.mp3", object);
aws_s3_parse_url(strdup("http://quotes.s3.foo.bar.s3.amazonaws.com/greeting/file/1002/Lumino.mp3"), &bucket, &object);
ASSERT_STRING_EQUALS("quotes.s3.foo.bar", bucket);
ASSERT_STRING_EQUALS("greeting/file/1002/Lumino.mp3", object);
} }
/** /**