[dancer-users] passing client/socket error from server to dancer app
Paul Clements
paul.clements at us.sios.com
Sat Feb 13 14:43:01 EST 2021
I asked a similar question a few weeks ago, and am circling back
because I am still in need of a solution. As it turns out, without a
way to handle client/socket disconnect, I am having trouble finding a
suitable working combination of Dancer2/PSGI Server. I've tried
several, and while Twiggy does give an error (SIGPIPE) on client
disconnect, my app is not AnyEvent- (or even thread-) based, so the
forking servers (e.g., Starman) are a better fit (without rewriting
substantial amounts of code).
At this point, I'm wondering if a fairly simple change to Dancer2
might be acceptable. It's a minimal change, but gives the Dancer2 app
a way to know when a client disconnect has occurred in a "delayed"
handler.
Specifically, it turns out that many/most servers return "undef" from
their write routines once the socket is closed. So, the idea is to
allow that information to pass back to the app:
diff --git a/lib/Dancer2/Core/DSL.pm b/lib/Dancer2/Core/DSL.pm
index fd29ac74..9adb3e28 100644
--- a/lib/Dancer2/Core/DSL.pm
+++ b/lib/Dancer2/Core/DSL.pm
@@ -329,7 +329,7 @@ sub content {
eval {
$Dancer2::Core::Route::WRITER->write(@_);
- 1;
+ # use write's return code instead # 1;
} or do {
my $error = $@ || 'Zombie Error';
$Dancer2::Core::Route::ERROR_HANDLER
It doesn't seem like the constant 1 return code from "content" is
something that anyone would be relying on, so changing it shouldn't
hurt (?), but would provide a way to get the error information back to
the app, e.g.:
my $client_ok = content $data;
if (!defined($client_ok)) { # something's wrong!
Thanks,
Paul
More information about the dancer-users
mailing list