Ticket #12216: 0001-12216-haikudepot-desktop-app-can-now-have-server-url.patch

File 0001-12216-haikudepot-desktop-app-can-now-have-server-url.patch, 8.2 KB (added by apl-haiku, 9 years ago)
  • src/apps/haikudepot/model/WebAppInterface.cpp

    From a61f0364d8b4119819e7b13c8a10875baa66bf42 Mon Sep 17 00:00:00 2001
    From: Andrew Lindesay <apl@lindesay.co.nz>
    Date: Sat, 18 Jul 2015 22:24:49 +1200
    Subject: [PATCH] 12216 haikudepot desktop app can now have server url
     specified and force repository code to "haikuports"
    
    ---
     src/apps/haikudepot/model/WebAppInterface.cpp | 94 ++++++++++++++++++++++++---
     src/apps/haikudepot/model/WebAppInterface.h   |  3 +
     src/apps/haikudepot/ui/App.cpp                | 23 ++++++-
     3 files changed, 107 insertions(+), 13 deletions(-)
    
    diff --git a/src/apps/haikudepot/model/WebAppInterface.cpp b/src/apps/haikudepot/model/WebAppInterface.cpp
    index 22a0a43db..e8d5137 100644
    a b  
    2121#include "PackageInfo.h"
    2222
    2323
     24#define CODE_REPOSITORY_DEFAULT "haikuports"
     25#define BASEURL_DEFAULT "https://depot.haiku-os.org"
     26
     27
    2428class JsonBuilder {
    2529public:
    2630    JsonBuilder()
    enum {  
    269273};
    270274
    271275
     276BString WebAppInterface::fBaseUrl = BString(BASEURL_DEFAULT);
     277
     278
    272279WebAppInterface::WebAppInterface()
    273280    :
    274281    fLanguage("en")
    WebAppInterface::SetAuthorization(const BString& username,  
    313320}
    314321
    315322
     323static bool
     324arguments_is_url_valid(const BString& value)
     325{
     326    if (value.Length() < 8) {
     327        fprintf(stderr,"the url is less than 8 characters in length\n");
     328        return false;
     329    }
     330
     331    int32 schemeEnd = value.FindFirst("://");
     332
     333    if (schemeEnd == B_ERROR) {
     334        fprintf(stderr,"the url does not contain the '://' string\n");
     335        return false;
     336    }
     337
     338    BString scheme;
     339    value.CopyInto(scheme, 0, schemeEnd);
     340 
     341    if (scheme != "http" && scheme != "https") {
     342        fprintf(stderr,"the url scheme should be 'http' or 'https'\n");
     343        return false;
     344    }
     345
     346    if (value.Length()-1 == value.FindLast("/")) {
     347        fprintf(stderr,"the url should be be terminated with a '/'\n");
     348        return false;
     349    }
     350
     351    return true;
     352}
     353
     354
     355/*! This method will set the web app base URL, returning a status to
     356    indicate if the URL was acceptable.
     357    \return B_OK if the base URL was valid and B_BAD_VALUE if not.
     358 */
     359
     360status_t
     361WebAppInterface::SetBaseUrl(const BString& url) {
     362    if (!arguments_is_url_valid(url))
     363        return B_BAD_VALUE;
     364
     365    fBaseUrl.SetTo(url);
     366
     367    return B_OK;
     368}
     369
     370
    316371void
    317372WebAppInterface::SetPreferredLanguage(const BString& language)
    318373{
    WebAppInterface::RetrievePackageInfo(const BString& packageName,  
    333388                .AddValue("name", packageName)
    334389                .AddValue("architectureCode", architecture)
    335390                .AddValue("naturalLanguageCode", fLanguage)
     391                .AddValue("repositoryCode", CODE_REPOSITORY_DEFAULT)
    336392                .AddValue("versionType", "NONE")
    337393            .EndObject()
    338394        .EndArray()
    WebAppInterface::RetrieveBulkPackageInfo(const StringList& packageNames,  
    358414                .AddArray("architectureCodes")
    359415                    .AddStrings(packageArchitectures)
    360416                .EndArray()
     417                .AddArray("repositoryCodes")
     418                    .AddItem(CODE_REPOSITORY_DEFAULT)
     419                .EndArray()
    361420                .AddValue("naturalLanguageCode", fLanguage)
    362421                .AddValue("versionType", "LATEST")
    363422                .AddArray("filter")
    status_t  
    378437WebAppInterface::RetrievePackageIcon(const BString& packageName,
    379438    BDataIO* stream)
    380439{
    381     BString urlString = "https://depot.haiku-os.org/pkgicon/";
    382     urlString << packageName << ".hvif";
     440    BString urlString = _FormFullUrl(BString("/pkgicon/") << packageName
     441        << ".hvif");
     442    bool isSecure = 0 == urlString.FindFirst("https://");
    383443
    384444    BUrl url(urlString);
    385445
    386446    ProtocolListener listener;
    387447    listener.SetDownloadIO(stream);
    388448
    389     BHttpRequest request(url, true, "HTTP", &listener);
     449    BHttpRequest request(url, isSecure, "HTTP", &listener);
    390450    request.SetMethod(B_HTTP_GET);
    391451
    392452    thread_id thread = request.Run();
    WebAppInterface::RetrieveUserRating(const BString& packageName,  
    446506                .AddValue("pkgVersionMicro", version.Micro(), true)
    447507                .AddValue("pkgVersionPreRelease", version.PreRelease(), true)
    448508                .AddValue("pkgVersionRevision", (int)version.Revision())
     509                .AddValue("repositoryCode", CODE_REPOSITORY_DEFAULT)
    449510            .EndObject()
    450511        .EndArray()
    451512    .End();
    WebAppInterface::CreateUserRating(const BString& packageName,  
    473534                .AddValue("rating", rating)
    474535                .AddValue("userRatingStabilityCode", stability, true)
    475536                .AddValue("comment", comment)
     537                .AddValue("repositoryCode", CODE_REPOSITORY_DEFAULT)
    476538                .AddValue("naturalLanguageCode", languageCode)
    477539            .EndObject()
    478540        .EndArray()
    status_t  
    520582WebAppInterface::RetrieveScreenshot(const BString& code,
    521583    int32 width, int32 height, BDataIO* stream)
    522584{
    523     BString urlString = "https://depot.haiku-os.org/pkgscreenshot/";
    524     urlString << code << ".png"
    525         << "?tw=" << width << "&th=" << height;
     585    BString urlString = _FormFullUrl(BString("/pkgscreenshot/") << code
     586        << ".png" << "?tw=" << width << "&th=" << height);
     587    bool isSecure = 0 == urlString.FindFirst("https://");
    526588
    527589    BUrl url(urlString);
    528590
    WebAppInterface::RetrieveScreenshot(const BString& code,  
    532594    BHttpHeaders headers;
    533595    headers.AddHeader("User-Agent", "X-HDS-Client");
    534596
    535     BHttpRequest request(url, true, "HTTP", &listener);
     597    BHttpRequest request(url, isSecure, "HTTP", &listener);
    536598    request.SetMethod(B_HTTP_GET);
    537599    request.SetHeaders(headers);
    538600
    WebAppInterface::AuthenticateUser(const BString& nickName,  
    625687// #pragma mark - private
    626688
    627689
     690BString
     691WebAppInterface::_FormFullUrl(const BString& suffix) const
     692{
     693    if (fBaseUrl.IsEmpty()) {
     694        fprintf(stderr,"illegal state - missing web app base url\n");
     695        exit(EXIT_FAILURE);
     696    }
     697
     698    return BString(fBaseUrl) << suffix;
     699}
     700
     701
    628702status_t
    629703WebAppInterface::_SendJsonRequest(const char* domain, BString jsonString,
    630704    uint32 flags, BMessage& reply) const
    WebAppInterface::_SendJsonRequest(const char* domain, BString jsonString,  
    632706    if ((flags & ENABLE_DEBUG) != 0)
    633707        printf("_SendJsonRequest(%s)\n", jsonString.String());
    634708
    635     BString urlString("https://depot.haiku-os.org/api/v1/");
    636     urlString << domain;
     709    BString urlString = _FormFullUrl(BString("/api/v1/") << domain);
     710    bool isSecure = 0 == urlString.FindFirst("https://");
    637711    BUrl url(urlString);
    638712
    639713    ProtocolListener listener;
    WebAppInterface::_SendJsonRequest(const char* domain, BString jsonString,  
    643717    headers.AddHeader("Content-Type", "application/json");
    644718    headers.AddHeader("User-Agent", "X-HDS-Client");
    645719
    646     BHttpRequest request(url, true, "HTTP", &listener, &context);
     720    BHttpRequest request(url, isSecure, "HTTP", &listener, &context);
    647721    request.SetMethod(B_HTTP_POST);
    648722    request.SetHeaders(headers);
    649723
  • src/apps/haikudepot/model/WebAppInterface.h

    diff --git a/src/apps/haikudepot/model/WebAppInterface.h b/src/apps/haikudepot/model/WebAppInterface.h
    index 23018b9..8cf8779 100644
    a b public:  
    3333            const BString&      Username() const
    3434                                    { return fUsername; }
    3535
     36    static  status_t            SetBaseUrl(const BString& url);
    3637            void                SetPreferredLanguage(const BString& language);
    3738            void                SetArchitecture(const BString& architecture);
    3839
    public:  
    100101                                    BMessage& message);
    101102
    102103private:
     104            BString             _FormFullUrl(const BString& suffix) const;
    103105            status_t            _SendJsonRequest(const char* domain,
    104106                                    BString jsonString, uint32 flags,
    105107                                    BMessage& reply) const;
    106108
    107109private:
     110    static  BString             fBaseUrl;
    108111            BString             fUsername;
    109112            BString             fPassword;
    110113            BString             fLanguage;
  • src/apps/haikudepot/ui/App.cpp

    diff --git a/src/apps/haikudepot/ui/App.cpp b/src/apps/haikudepot/ui/App.cpp
    index 65b145c..95a1a85 100644
    a b App::RefsReceived(BMessage* message)  
    118118void
    119119App::ArgvReceived(int32 argc, char* argv[])
    120120{
    121     for (int i = 1; i < argc; i++) {
    122         BEntry entry(argv[i], true);
    123         _Open(entry);
     121    for (int i = 1; i < argc;) {
     122        if (0 == strcmp("--webappbaseurl", argv[i])) {
     123            if (i == argc-1) {
     124                fprintf(stderr,"unexpected end of arguments; missing web app base url\n");
     125                Quit();
     126            }
     127
     128            if (B_OK != WebAppInterface::SetBaseUrl(argv[i+1])) {
     129                fprintf(stderr,"malformed web app base url; %s\n", argv[i+1]);
     130                Quit();
     131            }
     132            else
     133                fprintf(stderr,"did configure the web base url; %s\n",argv[i+1]);
     134
     135            i += 2;
     136        } else {
     137            BEntry entry(argv[i], true);
     138            _Open(entry);
     139            i ++;
     140        }
    124141    }
    125142}
    126143