void KprZeroconfDiscoverServerCallback(KprZeroconfBrowser self, KprZeroconfServiceInfo service, Boolean alive) { #define kKPRZeroconfKinomaDiscoverURL "xkpr://%s/discover" #define kKPRZeroconfKinomaDiscoverJSON "{\"id\":\"%s\",\"uuid\":\"%s\",\"url\":\"http://%s:%lu/\",\"protocol\":\"zeroconf\"}" #define kKPRZeroconfKinomaForgetURL "xkpr://%s/forget" #define kKPRZeroconfKinomaForgetJSON "{\"id\":\"%s\",\"uuid\":\"%s\",\"protocol\":\"zeroconf\"}" FskErr err = kFskErrNone; char id[256]; char url[1024]; char json[2048]; UInt32 size; KprMessage message = NULL; char* authority = NULL; bailIfError(KprZeroconfServiceNewAuthority(service->type, &authority)); if (alive) { snprintf(url, sizeof(url), kKPRZeroconfKinomaDiscoverURL, self->authority); snprintf(json, sizeof(json), kKPRZeroconfKinomaDiscoverJSON, authority, service->name, service->ip, service->port); } else { snprintf(url, sizeof(url), kKPRZeroconfKinomaForgetURL, self->authority); snprintf(json, sizeof(json), kKPRZeroconfKinomaForgetJSON, authority, service->name); } size = FskStrLen(json); bailIfError(KprMessageNew(&message, url)); bailIfError(KprMessageSetRequestBody(message, json, size)); FskStrNumToStr(size, id, sizeof(id)); bailIfError(KprMessageSetRequestHeader(message, kFskStrContentLength, id)); bailIfError(KprMessageSetRequestHeader(message, kFskStrContentType, "application/json")); KprMessageInvoke(message, NULL, NULL, NULL); FskMemPtrDispose(authority); return; bail: KprMessageDispose(message); FskMemPtrDispose(authority); }
void KPR_message_setRequestHeader(xsMachine* the) { KprMessage self = kprGetHostData(xsThis, this, message); xsStringValue name = xsToString(xsArg(0)); xsStringValue value = xsToString(xsArg(1)); (void)KprMessageSetRequestHeader(self, name, value); }
void KPRLibrarySniffPodcast(xsMachine *the) { KprMessage message; KprFunctionTarget target; xsThrowIfFskErr(KprMessageNew(&message, xsToString(xsArg(1)))); xsThrowIfFskErr(KprMessageSetRequestHeader(message, "Range", "bytes=0-4095")); xsThrowIfFskErr(KprFunctionTargetNew(&target, the, &xsArg(2))); xsThrowIfFskErr(KprMessageInvoke(message, KPRLibrarySniffPodcastComplete, KprFunctionTargetDispose, target)); }
void KprHTTPClientInvoke(KprService service UNUSED, KprMessage message) { FskErr err = kFskErrNone; KprHTTPClient self = gKprHTTPClient; if (KprMessageContinue(message)) { KprHTTPTarget target = NULL; KprHTTPCacheValue cached = NULL; char* value; FskInstrumentedItemSendMessageDebug(message, kprInstrumentedMessageHTTPBegin, message) bailIfError(KprHTTPTargetNew(&target, message)); if (!message->method || !FskStrCompare(message->method, "GET")) KprHTTPCacheFetch(self->cache, message->url, &cached); if (cached) { if (KprHTTPCacheValueIsFresh(cached)) { if (KprHTTPClientReadCache(message, cached) == kFskErrNone) { KprMessageTransform(message, gHTTPService.machine); KprHTTPClientResumeTarget(target); return; } } else { value = FskAssociativeArrayElementGetString(cached->headers, kprHTTPHeaderLastModified); if (value) (void)KprMessageSetRequestHeader(message, kprHTTPHeaderIfModifiedSince, value); value = FskAssociativeArrayElementGetString(cached->headers, kprHTTPHeaderETag); if (value) (void)KprMessageSetRequestHeader(message, kprHTTPHeaderIfNoneMatch, value); target->cached = cached; } } KprHTTPClientCookiesGet(message->url, &value); if (value) { (void)KprMessageSetRequestHeader(message, kprHTTPHeaderCookie, value); FskMemPtrDispose(value); } KprHTTPClientAddTarget(target); return; bail: message->error = err; } FskThreadPostCallback(KprShellGetThread(gShell), (FskThreadCallback)KprMessageComplete, message, NULL, NULL, NULL); }