From 1812a076a74a0f87603ea6e282107e1803b7235d Mon Sep 17 00:00:00 2001 From: Les De Ridder Date: Tue, 14 Feb 2017 00:52:27 +0100 Subject: [PATCH] Implement basic Belfius mobile site API client --- .gitignore | 7 +++ dub.json | 14 ++++++ dub.selections.json | 11 +++++ source/app.d | 106 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+) create mode 100644 .gitignore create mode 100644 dub.json create mode 100644 dub.selections.json create mode 100644 source/app.d diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..71e60f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.dub +docs.json +__dummy.html +*.o +*.obj +__test__*__ +belfius-balance diff --git a/dub.json b/dub.json new file mode 100644 index 0000000..3432337 --- /dev/null +++ b/dub.json @@ -0,0 +1,14 @@ +{ + "authors": [ + "Les De Ridder" + ], + "name": "belfius-balance", + "license": "NCSA", + "copyright": "Copyright © 2017, Les De Ridder", + "dependencies": { + "vibe-d": "~>0.7.28" + }, + "versions": [ + "VibeDefaultMain" + ] +} diff --git a/dub.selections.json b/dub.selections.json new file mode 100644 index 0000000..1ae2f64 --- /dev/null +++ b/dub.selections.json @@ -0,0 +1,11 @@ +{ + "fileVersion": 1, + "versions": { + "diet-ng": "1.1.3", + "libasync": "0.7.9", + "libevent": "2.0.2+2.0.16", + "memutils": "0.4.9", + "openssl": "1.1.5+1.0.1g", + "vibe-d": "0.7.30" + } +} diff --git a/source/app.d b/source/app.d new file mode 100644 index 0000000..2f0ad59 --- /dev/null +++ b/source/app.d @@ -0,0 +1,106 @@ +import std.stdio; + +import vibe.d; +import vibe.data.json; +import vibe.textfilter.urlencode; + +void helloWorld(HTTPServerRequest req, + HTTPServerResponse res) +{ + res.writeBody("Hello"); +} + + +class ApiRequest +{ +} + +class OpenSession : ApiRequest +{ + string applicationType; + string locale; + string[string] attributes; + + this(string applicationType, string locale, string[string] attributes) + { + this.applicationType = applicationType; + this.locale = locale; + this.attributes = attributes; + } +} + +class ApiMessage +{ + string executionMode; + string protocolVersion; + Json[string][] requests; + + this(string executionMode) + { + this.executionMode = executionMode; + this.protocolVersion = "2.1"; + + Json[string] requestArray; + this.requests = [requestArray]; + } + + void addRequest(T : ApiRequest)(string name, T request) + { + requests[0][name] = request.serializeToJson; + } +} + +class ApiClient +{ + enum string Endpoint = "https://m.belfius.be/F2CRenderingDexiaToClient/GEPARendering/machineIdentifier=s0/"; + + private string _locale; + + this(string locale) + { + _locale = locale; + } + + void connect() + { + auto openSessionRequest = new OpenSession("yui3a", _locale, ["application": "Container", "P": "P055"]); + + auto response = sendRequest("sequential", openSessionRequest); + + writeln(response); + } + + Json sendRequest(T : ApiRequest)(string executionMode, T request) + { + auto message = new ApiMessage(executionMode); + message.addRequest(T.stringof, request); + + auto response = requestHTTP(Endpoint, + (scope request) { + request.method = HTTPMethod.POST; + request.headers["Accept"] = "*/*"; + request.headers["Content-Type"] = "application/x-www-form-urlencoded"; + request.headers["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36"; + request.writeBody(cast(ubyte[])("request=" ~ message.serializeToJsonString.urlEncode)); + } + ).bodyReader.readAllUTF8; + + return response.parseJsonString; + } +} + +shared static this() +{ + auto router = new URLRouter; + router.get("/hello", &helloWorld); + + auto settings = new HTTPServerSettings; + settings.sessionStore = new MemorySessionStore; + settings.port = 8080; + settings.bindAddresses = ["::1", "127.0.0.1"]; + + listenHTTP(settings, router); + + auto apiClient = new ApiClient("nl_BE"); + apiClient.connect(); +}