status_t WebAppInterface::RetrievePackageIcon(const BString& packageName, BDataIO* stream) { BString urlString = "https://depot.haiku-os.org/pkgicon/"; urlString << packageName << ".hvif"; BUrl url(urlString); ProtocolListener listener; listener.SetDownloadIO(stream); BHttpRequest request(url, true, "HTTP", &listener); request.SetMethod(B_HTTP_GET); thread_id thread = request.Run(); wait_for_thread(thread, NULL); const BHttpResult& result = dynamic_cast<const BHttpResult&>( request.Result()); int32 statusCode = result.StatusCode(); if (statusCode == 200) return B_OK; return B_ERROR; }
status_t WebAppInterface::_SendJsonRequest(BString jsonString, BMessage& reply) const { BUrl url("https://depot.haiku-os.org/api/v1/pkg"); ProtocolListener listener; BUrlContext context; BHttpHeaders headers; // Content-Type headers.AddHeader("Content-Type", "application/json"); headers.AddHeader("User-Agent", "X-HDS-Client"); BHttpRequest request(url, true, "HTTP", &listener, &context); // Authentication if (!fUsername.IsEmpty() && !fPassword.IsEmpty()) { request.SetUserName(fUsername); request.SetPassword(fPassword); } request.SetMethod(B_HTTP_POST); request.SetHeaders(headers); BMemoryIO* data = new BMemoryIO( jsonString.String(), jsonString.Length() - 1); request.AdoptInputData(data, jsonString.Length() - 1); BMallocIO replyData; listener.SetDownloadIO(&replyData); // listener.SetDebug(true); thread_id thread = request.Run(); wait_for_thread(thread, NULL); const BHttpResult& result = dynamic_cast<const BHttpResult&>( request.Result()); int32 statusCode = result.StatusCode(); if (statusCode != 200) { printf("Response code: %" B_PRId32 "\n", statusCode); return B_ERROR; } jsonString.SetTo(static_cast<const char*>(replyData.Buffer()), replyData.BufferLength()); if (jsonString.Length() == 0) return B_ERROR; BJson parser; status_t status = parser.Parse(reply, jsonString); if (status == B_BAD_DATA) { // printf("Parser choked on JSON:\n%s\n", jsonString.String()); } return status; }
status_t WebAppInterface::RetrievePackageInfo(const BString& packageName, BMessage& message) { BUrl url("https://depot.haiku-os.org/api/v1/pkg"); ProtocolListener listener; BUrlContext context; BHttpHeaders headers; // Content-Type headers.AddHeader("Content-Type", "application/json"); BHttpRequest request(url, true, "HTTP", &listener, &context); // Authentication if (!fUsername.IsEmpty() && !fPassword.IsEmpty()) { request.SetUserName(fUsername); request.SetPassword(fPassword); } request.SetMethod(B_HTTP_POST); request.SetHeaders(headers); BString jsonString = JsonBuilder() .AddValue("jsonrpc", "2.0") .AddValue("id", ++fRequestIndex) .AddValue("method", "getPkg") .AddArray("params") .AddObject() .AddValue("name", packageName) .AddValue("architectureCode", "x86_gcc2") .AddValue("naturalLanguageCode", "en") .AddValue("versionType", "NONE") .EndObject() .EndArray() .End(); printf("Sending JSON:\n%s\n", jsonString.String()); BMemoryIO* data = new BMemoryIO( jsonString.String(), jsonString.Length() - 1); request.AdoptInputData(data, jsonString.Length() - 1); BMallocIO replyData; listener.SetDownloadIO(&replyData); // listener.SetDebug(true); thread_id thread = request.Run(); wait_for_thread(thread, NULL); const BHttpResult& result = dynamic_cast<const BHttpResult&>( request.Result()); int32 statusCode = result.StatusCode(); if (statusCode == 200) return B_OK; printf("Response code: %" B_PRId32 "\n", statusCode); return B_ERROR; }