HaikuDepot: desktop app can now have server url specified

* Enables us to test to other HD servers

Completes Task #12216
This commit is contained in:
Andrew Lindesay
2015-07-19 08:46:26 -05:00
committed by Alexander von Gluck IV
parent 874bb4ede9
commit 93407f0c87
3 changed files with 107 additions and 13 deletions
+84 -10
View File
@@ -21,6 +21,10 @@
#include "PackageInfo.h" #include "PackageInfo.h"
#define CODE_REPOSITORY_DEFAULT "haikuports"
#define BASEURL_DEFAULT "https://depot.haiku-os.org"
class JsonBuilder { class JsonBuilder {
public: public:
JsonBuilder() JsonBuilder()
@@ -269,6 +273,9 @@ enum {
}; };
BString WebAppInterface::fBaseUrl = BString(BASEURL_DEFAULT);
WebAppInterface::WebAppInterface() WebAppInterface::WebAppInterface()
: :
fLanguage("en") fLanguage("en")
@@ -313,6 +320,54 @@ WebAppInterface::SetAuthorization(const BString& username,
} }
static bool
arguments_is_url_valid(const BString& value)
{
if (value.Length() < 8) {
fprintf(stderr,"the url is less than 8 characters in length\n");
return false;
}
int32 schemeEnd = value.FindFirst("://");
if (schemeEnd == B_ERROR) {
fprintf(stderr,"the url does not contain the '://' string\n");
return false;
}
BString scheme;
value.CopyInto(scheme, 0, schemeEnd);
if (scheme != "http" && scheme != "https") {
fprintf(stderr,"the url scheme should be 'http' or 'https'\n");
return false;
}
if (value.Length()-1 == value.FindLast("/")) {
fprintf(stderr,"the url should be be terminated with a '/'\n");
return false;
}
return true;
}
/*! This method will set the web app base URL, returning a status to
indicate if the URL was acceptable.
\return B_OK if the base URL was valid and B_BAD_VALUE if not.
*/
status_t
WebAppInterface::SetBaseUrl(const BString& url) {
if (!arguments_is_url_valid(url))
return B_BAD_VALUE;
fBaseUrl.SetTo(url);
return B_OK;
}
void void
WebAppInterface::SetPreferredLanguage(const BString& language) WebAppInterface::SetPreferredLanguage(const BString& language)
{ {
@@ -333,6 +388,7 @@ WebAppInterface::RetrievePackageInfo(const BString& packageName,
.AddValue("name", packageName) .AddValue("name", packageName)
.AddValue("architectureCode", architecture) .AddValue("architectureCode", architecture)
.AddValue("naturalLanguageCode", fLanguage) .AddValue("naturalLanguageCode", fLanguage)
.AddValue("repositoryCode", CODE_REPOSITORY_DEFAULT)
.AddValue("versionType", "NONE") .AddValue("versionType", "NONE")
.EndObject() .EndObject()
.EndArray() .EndArray()
@@ -358,6 +414,9 @@ WebAppInterface::RetrieveBulkPackageInfo(const StringList& packageNames,
.AddArray("architectureCodes") .AddArray("architectureCodes")
.AddStrings(packageArchitectures) .AddStrings(packageArchitectures)
.EndArray() .EndArray()
.AddArray("repositoryCodes")
.AddItem(CODE_REPOSITORY_DEFAULT)
.EndArray()
.AddValue("naturalLanguageCode", fLanguage) .AddValue("naturalLanguageCode", fLanguage)
.AddValue("versionType", "LATEST") .AddValue("versionType", "LATEST")
.AddArray("filter") .AddArray("filter")
@@ -378,15 +437,16 @@ status_t
WebAppInterface::RetrievePackageIcon(const BString& packageName, WebAppInterface::RetrievePackageIcon(const BString& packageName,
BDataIO* stream) BDataIO* stream)
{ {
BString urlString = "https://depot.haiku-os.org/pkgicon/"; BString urlString = _FormFullUrl(BString("/pkgicon/") << packageName
urlString << packageName << ".hvif"; << ".hvif");
bool isSecure = 0 == urlString.FindFirst("https://");
BUrl url(urlString); BUrl url(urlString);
ProtocolListener listener; ProtocolListener listener;
listener.SetDownloadIO(stream); listener.SetDownloadIO(stream);
BHttpRequest request(url, true, "HTTP", &listener); BHttpRequest request(url, isSecure, "HTTP", &listener);
request.SetMethod(B_HTTP_GET); request.SetMethod(B_HTTP_GET);
thread_id thread = request.Run(); thread_id thread = request.Run();
@@ -446,6 +506,7 @@ WebAppInterface::RetrieveUserRating(const BString& packageName,
.AddValue("pkgVersionMicro", version.Micro(), true) .AddValue("pkgVersionMicro", version.Micro(), true)
.AddValue("pkgVersionPreRelease", version.PreRelease(), true) .AddValue("pkgVersionPreRelease", version.PreRelease(), true)
.AddValue("pkgVersionRevision", (int)version.Revision()) .AddValue("pkgVersionRevision", (int)version.Revision())
.AddValue("repositoryCode", CODE_REPOSITORY_DEFAULT)
.EndObject() .EndObject()
.EndArray() .EndArray()
.End(); .End();
@@ -473,6 +534,7 @@ WebAppInterface::CreateUserRating(const BString& packageName,
.AddValue("rating", rating) .AddValue("rating", rating)
.AddValue("userRatingStabilityCode", stability, true) .AddValue("userRatingStabilityCode", stability, true)
.AddValue("comment", comment) .AddValue("comment", comment)
.AddValue("repositoryCode", CODE_REPOSITORY_DEFAULT)
.AddValue("naturalLanguageCode", languageCode) .AddValue("naturalLanguageCode", languageCode)
.EndObject() .EndObject()
.EndArray() .EndArray()
@@ -520,9 +582,9 @@ status_t
WebAppInterface::RetrieveScreenshot(const BString& code, WebAppInterface::RetrieveScreenshot(const BString& code,
int32 width, int32 height, BDataIO* stream) int32 width, int32 height, BDataIO* stream)
{ {
BString urlString = "https://depot.haiku-os.org/pkgscreenshot/"; BString urlString = _FormFullUrl(BString("/pkgscreenshot/") << code
urlString << code << ".png" << ".png" << "?tw=" << width << "&th=" << height);
<< "?tw=" << width << "&th=" << height; bool isSecure = 0 == urlString.FindFirst("https://");
BUrl url(urlString); BUrl url(urlString);
@@ -532,7 +594,7 @@ WebAppInterface::RetrieveScreenshot(const BString& code,
BHttpHeaders headers; BHttpHeaders headers;
headers.AddHeader("User-Agent", "X-HDS-Client"); headers.AddHeader("User-Agent", "X-HDS-Client");
BHttpRequest request(url, true, "HTTP", &listener); BHttpRequest request(url, isSecure, "HTTP", &listener);
request.SetMethod(B_HTTP_GET); request.SetMethod(B_HTTP_GET);
request.SetHeaders(headers); request.SetHeaders(headers);
@@ -625,6 +687,18 @@ WebAppInterface::AuthenticateUser(const BString& nickName,
// #pragma mark - private // #pragma mark - private
BString
WebAppInterface::_FormFullUrl(const BString& suffix) const
{
if (fBaseUrl.IsEmpty()) {
fprintf(stderr,"illegal state - missing web app base url\n");
exit(EXIT_FAILURE);
}
return BString(fBaseUrl) << suffix;
}
status_t status_t
WebAppInterface::_SendJsonRequest(const char* domain, BString jsonString, WebAppInterface::_SendJsonRequest(const char* domain, BString jsonString,
uint32 flags, BMessage& reply) const uint32 flags, BMessage& reply) const
@@ -632,8 +706,8 @@ WebAppInterface::_SendJsonRequest(const char* domain, BString jsonString,
if ((flags & ENABLE_DEBUG) != 0) if ((flags & ENABLE_DEBUG) != 0)
printf("_SendJsonRequest(%s)\n", jsonString.String()); printf("_SendJsonRequest(%s)\n", jsonString.String());
BString urlString("https://depot.haiku-os.org/api/v1/"); BString urlString = _FormFullUrl(BString("/api/v1/") << domain);
urlString << domain; bool isSecure = 0 == urlString.FindFirst("https://");
BUrl url(urlString); BUrl url(urlString);
ProtocolListener listener; ProtocolListener listener;
@@ -643,7 +717,7 @@ WebAppInterface::_SendJsonRequest(const char* domain, BString jsonString,
headers.AddHeader("Content-Type", "application/json"); headers.AddHeader("Content-Type", "application/json");
headers.AddHeader("User-Agent", "X-HDS-Client"); headers.AddHeader("User-Agent", "X-HDS-Client");
BHttpRequest request(url, true, "HTTP", &listener, &context); BHttpRequest request(url, isSecure, "HTTP", &listener, &context);
request.SetMethod(B_HTTP_POST); request.SetMethod(B_HTTP_POST);
request.SetHeaders(headers); request.SetHeaders(headers);
@@ -33,6 +33,7 @@ public:
const BString& Username() const const BString& Username() const
{ return fUsername; } { return fUsername; }
static status_t SetBaseUrl(const BString& url);
void SetPreferredLanguage(const BString& language); void SetPreferredLanguage(const BString& language);
void SetArchitecture(const BString& architecture); void SetArchitecture(const BString& architecture);
@@ -100,11 +101,13 @@ public:
BMessage& message); BMessage& message);
private: private:
BString _FormFullUrl(const BString& suffix) const;
status_t _SendJsonRequest(const char* domain, status_t _SendJsonRequest(const char* domain,
BString jsonString, uint32 flags, BString jsonString, uint32 flags,
BMessage& reply) const; BMessage& reply) const;
private: private:
static BString fBaseUrl;
BString fUsername; BString fUsername;
BString fPassword; BString fPassword;
BString fLanguage; BString fLanguage;
+18 -1
View File
@@ -118,9 +118,26 @@ App::RefsReceived(BMessage* message)
void void
App::ArgvReceived(int32 argc, char* argv[]) App::ArgvReceived(int32 argc, char* argv[])
{ {
for (int i = 1; i < argc; i++) { for (int i = 1; i < argc;) {
if (0 == strcmp("--webappbaseurl", argv[i])) {
if (i == argc-1) {
fprintf(stderr,"unexpected end of arguments; missing web app base url\n");
Quit();
}
if (B_OK != WebAppInterface::SetBaseUrl(argv[i+1])) {
fprintf(stderr,"malformed web app base url; %s\n", argv[i+1]);
Quit();
}
else
fprintf(stderr,"did configure the web base url; %s\n",argv[i+1]);
i += 2;
} else {
BEntry entry(argv[i], true); BEntry entry(argv[i], true);
_Open(entry); _Open(entry);
i ++;
}
} }
} }