diff --git a/dub.sdl b/dub.sdl index 6d7c5b4..4eac4e1 100644 --- a/dub.sdl +++ b/dub.sdl @@ -6,4 +6,4 @@ dependency "dxml" version="~>0.4.1" dependency "pegged" version=">=0.0.0" dependency "sumtype" version="~>0.8.13" -dependency "vibe-d:web" version=">=0.0.0" +dependency "vibe-d:web" version=">0.8.5" diff --git a/source/cartastraccia/actor.d b/source/cartastraccia/actor.d index 9e7a5ef..e6eaadc 100644 --- a/source/cartastraccia/actor.d +++ b/source/cartastraccia/actor.d @@ -45,10 +45,10 @@ (ref InvalidRSS i) { logWarn("Invalid feed at: "~path); logWarn("Caused by entry \""~i.element~"\": "~i.content); - logWarn("Task exiting."); + busyListen(rss); }, (ref ValidRSS vr) { - busyListen(vr); + busyListen(rss); }); } @@ -57,8 +57,11 @@ */ enum FeedActorRequest { DATA_CLI, DATA_HTML, QUIT } +enum FeedActorResponse { INVALID, VALID } + alias RequestDataLength = ulong; + static immutable ulong chunkSize = 4096; private: @@ -66,35 +69,44 @@ /** * Listen for messages from the webserver */ -void busyListen(ref ValidRSS rss) { - while(true) { - // receive the webserver task - auto webTask = receiveOnly!Task; +void busyListen(ref RSS rss) { + rss.match!( + (ref InvalidRSS i) { + auto webTask = receiveOnly!Task; + webTask.send(FeedActorResponse.INVALID); + }, + (ref ValidRSS vr) { + while(true) { - // receive the actual request - receive( - (FeedActorRequest r) { + // receive the webserver task + auto webTask = receiveOnly!Task; + webTask.send(FeedActorResponse.VALID); + + // receive the actual request + receive( + (FeedActorRequest r) { - if(r == FeedActorRequest.DATA_CLI) { - logInfo("Received CLI request from task: "~webTask.getDebugID()); - immutable string data = dumpRSS!(FeedActorRequest.DATA_CLI)(rss); - webTask.dispatchCLI(data); + if(r == FeedActorRequest.DATA_CLI) { + logInfo("Received CLI request from task: "~webTask.getDebugID()); + immutable string data = dumpRSS!(FeedActorRequest.DATA_CLI)(vr); + webTask.dispatchCLI(data); - } else if(r == FeedActorRequest.DATA_HTML) { - logInfo("Received HTML request from task: "~webTask.getDebugID()); - webTask.dispatchHTML(rss.channels); + } else if(r == FeedActorRequest.DATA_HTML) { + logInfo("Received HTML request from task: "~webTask.getDebugID()); + webTask.dispatchHTML(vr.channels); - } else if(r == FeedActorRequest.QUIT){ - logDebug("Task exiting due to quit request."); - return; + } else if(r == FeedActorRequest.QUIT){ + logDebug("Task exiting due to quit request."); + return; - }}, + }}, - (Variant v) { - logFatal("Invalid message received from webserver."); + (Variant v) { + logFatal("Invalid message received from webserver."); + }); + } }); - } } void dispatchCLI(scope Task task, immutable string data) diff --git a/source/cartastraccia/endpoint.d b/source/cartastraccia/endpoint.d index 325b9da..cccd0b2 100644 --- a/source/cartastraccia/endpoint.d +++ b/source/cartastraccia/endpoint.d @@ -42,13 +42,21 @@ ChannelItems[] channelItems; - feedList.tryMatch!( + feedList.match!( + (InvalidFeeds i) {}, (RSSFeed[] fl) { ChannelItems[] tmpCh; fl.each!( (RSSFeed f) { // send task for response from server tasks[f.name].send(Task.getThis()); + + auto resp = receiveOnly!FeedActorResponse; + if(resp == FeedActorResponse.INVALID) { + tasks.remove(f.name); + return; + } + // send data request tasks[f.name].send(FeedActorRequest.DATA_HTML); @@ -85,6 +93,12 @@ (RSSFeed f) { // send task for response from server tasks[f.name].send(Task.getThis()); + + auto resp = receiveOnly!FeedActorResponse; + if(resp == FeedActorResponse.INVALID) { + tasks.remove(f.name); + return; + } // send data request tasks[f.name].send(FeedActorRequest.DATA_CLI); // receive data length