- if ( AddAuthorityToFileURL() ) {
- url->_flags = (addedPercentEncoding ? 0 : POSIX_AND_URL_PATHS_MATCH ) | (isDirectory ? IS_DIRECTORY : 0) | IS_DECOMPOSABLE | HAS_SCHEME | HAS_HOST | HAS_PATH | ORIGINAL_AND_URL_STRINGS_MATCH | IS_CANONICAL_FILE_URL;
- _setSchemeTypeInFlags(&url->_flags, kHasFileScheme);
- url->_ranges = (CFRange *)CFAllocatorAllocate(alloc, sizeof(CFRange) * 3, 0);
- url->_ranges[0] = CFRangeMake(0, 4); // scheme "file"
- url->_ranges[1] = CFRangeMake(7, 9); // host "localhost"
- url->_ranges[2] = CFRangeMake(16, CFStringGetLength(urlString)- 16);
+ // if buffer contains an absolute path, ignore baseURL (if provided)
+ baseURL = NULL;
+ }
+ else if ( baseURL == NULL ) {
+ // if buffer contains a relative path and no baseURL is provided, use the current working directory
+ baseURL = _CFURLCreateCurrentDirectoryURL(CFGetAllocator(uninitializedURL));
+ releaseBaseURL = true;
+ }
+ CFStringRef urlString = CreateStringFromFileSystemRepresentationByAddingPercentEscapes(alloc, buffer, bufLen, isDirectory, isAbsolute, false /*windowsPath*/, &addedPercentEncoding);
+ if ( urlString ) {
+ _CFURLInit(url, urlString, baseURL, FALSE);
+
+ // hard coded parse
+ if ( isAbsolute ) {
+ if ( AddAuthorityToFileURL() ) {
+ url->_flags = (addedPercentEncoding ? 0 : POSIX_AND_URL_PATHS_MATCH ) | (isDirectory ? IS_DIRECTORY : 0) | IS_DECOMPOSABLE | HAS_SCHEME | HAS_HOST | HAS_PATH | ORIGINAL_AND_URL_STRINGS_MATCH | IS_CANONICAL_FILE_URL;
+ _setSchemeTypeInFlags(&url->_flags, kHasFileScheme);
+ url->_ranges = (CFRange *)CFAllocatorAllocate(alloc, sizeof(CFRange) * 3, 0);
+ url->_ranges[0] = CFRangeMake(0, 4); // scheme "file"
+ url->_ranges[1] = CFRangeMake(7, 9); // host "localhost"
+ url->_ranges[2] = CFRangeMake(16, CFStringGetLength(urlString)- 16);
+ }
+ else {
+ url->_flags = (addedPercentEncoding ? 0 : POSIX_AND_URL_PATHS_MATCH ) | (isDirectory ? IS_DIRECTORY : 0) | IS_DECOMPOSABLE | HAS_SCHEME | HAS_PATH | ORIGINAL_AND_URL_STRINGS_MATCH | IS_CANONICAL_FILE_URL;
+ _setSchemeTypeInFlags(&url->_flags, kHasFileScheme);
+ url->_ranges = (CFRange *)CFAllocatorAllocate(alloc, sizeof(CFRange) * 2, 0);
+ url->_ranges[0] = CFRangeMake(0, 4); // scheme "file"
+ url->_ranges[1] = CFRangeMake(7, CFStringGetLength(urlString)- 7);
+ }
+ } else {
+ url->_flags = (addedPercentEncoding ? 0 : POSIX_AND_URL_PATHS_MATCH ) | (isDirectory ? IS_DIRECTORY : 0) | IS_DECOMPOSABLE | HAS_PATH | ORIGINAL_AND_URL_STRINGS_MATCH;
+ url->_ranges = (CFRange *)CFAllocatorAllocate(alloc, sizeof(CFRange), 0);
+ *(url->_ranges) = CFRangeMake(0, CFStringGetLength(url->_string));