CRESTRequestRef CRESTRequestCreateWithBytes(UInt8 const *bytes, ssize_t len) { CFURLRef url; CRESTRequestRef request; CFHTTPMessageRef message; message = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, true); request = calloc(1, sizeof(struct CRESTRequest)); assert(request); bool isAppended = CFHTTPMessageAppendBytes(message, bytes, (CFIndex) len); bool isComplete = CFHTTPMessageIsHeaderComplete(message); if( ! ( isAppended && isComplete ) ) { CFRelease(message); CRESTRequestDealloc(request); return NULL; } url = CFHTTPMessageCopyRequestURL(message); CFMutableDictionaryRef params = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFStringRef query = CFURLCopyQueryString(url, NULL); if( query ) { parseParams(params, query); CFRelease(query); } CFDataRef bodyData = CFHTTPMessageCopyBody(message); if( CFDataGetLength(bodyData) ) { CFStringRef bodyString = CFStringCreateFromExternalRepresentation(kCFAllocatorDefault, bodyData, kCFStringEncodingUTF8); parseParams(params, bodyString); CFRelease(bodyString); } CFRelease(bodyData); request->method = CFHTTPMessageCopyRequestMethod(message); request->path = CFURLCopyPath(url); request->params = (CFDictionaryRef) params; CFRelease(url); CFRelease(message); return request; }
CF::String URL::GetQueryString( void ) { CF::String str; CFStringRef cfStr; if( this->_cfObject == NULL ) { return str; } cfStr = CFURLCopyQueryString( this->_cfObject, NULL ); if( cfStr != NULL ) { str = cfStr; CFRelease( cfStr ); } return str; }
static netfsError Mount9P(void *v, CFURLRef url, CFStringRef mntpointstr, CFDictionaryRef opts, CFDictionaryRef * info) { CFMutableDictionaryRef dict; CFMutableStringRef mntoptsstr; CFStringRef str; CFNumberRef num; Context9P *ctx; char *host, *mntpoint, *mntopts; int32_t mntflags; int e; TRACE(); ctx = v; if (ctx == NULL || url == NULL || mntpointstr == NULL || info == NULL || !CFURLCanBeDecomposed(url)) return EINVAL; DEBUG("url=%s opts=%s", NetFSCFStringtoCString(CFURLGetString(url)), NetFSCFStringtoCString(CFCopyDescription(opts))); mntoptsstr = NULL; host = mntpoint = mntopts = NULL; *info = dict = CreateDict9P(); if (dict == NULL) return ENOMEM; str = CFURLCopyHostName(url); if (str == NULL) goto error; host = NetFSCFStringtoCString(str); CFRelease(str); if (host == NULL) goto error; mntpoint = NetFSCFStringtoCString(mntpointstr); if (mntpoint == NULL) goto error; mntflags = 0; if (opts != NULL) { num = (CFNumberRef) CFDictionaryGetValue(opts, kNetFSMountFlagsKey); CFNumberGetValue(num, kCFNumberSInt32Type, &mntflags); } mntoptsstr = CFStringCreateMutableCopy(kCFAllocatorDefault, 0, CFSTR("-o")); if (mntoptsstr == NULL) goto error; if (ctx->user && ctx->pass) CFStringAppendFormat(mntoptsstr, NULL, CFSTR("uname=%@,pass=%@"), ctx->user, ctx->pass); else CFStringAppend(mntoptsstr, CFSTR("noauth")); /* query if there's any */ str = CFURLCopyQueryString(url, CFSTR("")); if (str && CFStringGetLength(str) > 0) { CFStringAppend(mntoptsstr, CFSTR(",")); CFStringAppend(mntoptsstr, str); CFRelease(str); } mntopts = NetFSCFStringtoCString(mntoptsstr); if (mntopts == NULL) goto error; DEBUG("host=%s mntpoint=%s mntopts=%s", host, mntpoint, mntopts); if (DoMount9P(host, mntpoint, mntopts, mntflags) < 0) goto error; CFDictionarySetValue(dict, kNetFSMountPathKey, mntpointstr); if (ctx->user) CFDictionarySetValue(dict, kNetFSMountedByUserKey, ctx->user); else CFDictionarySetValue(dict, kNetFSMountedByGuestKey, kCFBooleanTrue); if (mntoptsstr) CFRelease(mntoptsstr); free(host); free(mntpoint); free(mntopts); return 0; error: e = errno; *info = NULL; CFRelease(dict); if (mntoptsstr) CFRelease(mntoptsstr); free(host); free(mntpoint); free(mntopts); return e; }
static CFArrayRef _SecIdentityCopyPossiblePaths( CFStringRef name) { // utility function to build and return an array of possible paths for the given name. // if name is not a URL, this returns a single-element array. // if name is a URL, the array may contain 1..N elements, one for each level of the path hierarchy. CFMutableArrayRef names = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); if (!name) { return names; } CFIndex oldLength = CFStringGetLength(name); CFArrayAppendValue(names, name); CFURLRef url = CFURLCreateWithString(NULL, name, NULL); if (url) { if (CFURLCanBeDecomposed(url)) { // first, remove the query portion of this URL, if any CFStringRef qs = CFURLCopyQueryString(url, NULL); if (qs) { CFMutableStringRef newName = CFStringCreateMutableCopy(NULL, oldLength, name); if (newName) { CFIndex qsLength = CFStringGetLength(qs) + 1; // include the '?' CFStringDelete(newName, CFRangeMake(oldLength-qsLength, qsLength)); CFRelease(url); url = CFURLCreateWithString(NULL, newName, NULL); CFArraySetValueAtIndex(names, 0, newName); CFRelease(newName); } CFRelease(qs); } // now add an entry for each level of the path while (url) { CFURLRef parent = CFURLCreateCopyDeletingLastPathComponent(NULL, url); if (parent) { CFStringRef parentURLString = CFURLGetString(parent); if (parentURLString) { CFIndex newLength = CFStringGetLength(parentURLString); // check that string length has decreased as expected; for file URLs, // CFURLCreateCopyDeletingLastPathComponent can insert './' or '../' if ((newLength >= oldLength) || (!CFStringHasPrefix(name, parentURLString))) { CFRelease(parent); CFRelease(url); break; } oldLength = newLength; CFArrayAppendValue(names, parentURLString); } } CFRelease(url); url = parent; } } else { CFRelease(url); } } // finally, add wildcard entries for each subdomain url = CFURLCreateWithString(NULL, name, NULL); if (url) { if (CFURLCanBeDecomposed(url)) { CFStringRef netLocString = CFURLCopyNetLocation(url); if (netLocString) { // first strip off port number, if present CFStringRef tmpLocString = netLocString; CFArrayRef hostnameArray = CFStringCreateArrayBySeparatingStrings(NULL, netLocString, CFSTR(":")); tmpLocString = (CFStringRef)CFRetain((CFStringRef)CFArrayGetValueAtIndex(hostnameArray, 0)); CFRelease(netLocString); CFRelease(hostnameArray); netLocString = tmpLocString; // split remaining string into domain components hostnameArray = CFStringCreateArrayBySeparatingStrings(NULL, netLocString, CFSTR(".")); CFIndex subdomainCount = CFArrayGetCount(hostnameArray); CFIndex i = 0; while (++i < subdomainCount) { CFIndex j = i; CFMutableStringRef wildcardString = CFStringCreateMutable(NULL, 0); if (wildcardString) { CFStringAppendCString(wildcardString, "*", kCFStringEncodingUTF8); while (j < subdomainCount) { CFStringRef domainString = (CFStringRef)CFArrayGetValueAtIndex(hostnameArray, j++); if (CFStringGetLength(domainString) > 0) { CFStringAppendCString(wildcardString, ".", kCFStringEncodingUTF8); CFStringAppend(wildcardString, domainString); } } if (CFStringGetLength(wildcardString) > 1) { CFArrayAppendValue(names, wildcardString); } CFRelease(wildcardString); } } CFRelease(hostnameArray); CFRelease(netLocString); } } CFRelease(url); } return names; }