Esempio n. 1
0
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;
}
Esempio n. 2
0
 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;
 }
Esempio n. 3
0
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;
}