File Coverage

blib/lib/Plack/Middleware/Camelcadedb.pm
Criterion Covered Total %
statement 12 45 26.6
branch 0 12 0.0
condition 0 3 0.0
subroutine 4 9 44.4
pod 0 3 0.0
total 16 72 22.2


line stmt bran cond sub pod time code
1             package Plack::Middleware::Camelcadedb;
2              
3             =head1 NAME
4              
5             Plack::Middleware::Camelcadedb - interactive debugging for Plack applications
6              
7             =head1 SYNOPSIS
8              
9             # should be the first/one of the first modules to be loaded
10             use Plack::Middleware::Camelcadedb (
11             remote_host => "localhost:9000",
12             );
13             use Plack::Builder;
14              
15             builder {
16             enable "Camelcadedb";
17             $app;
18             };
19              
20             You will also need to configure remote debugging in IntelliJ as described in the
21             L
22             section of the L
23             wiki.
24              
25             =head1 DESCRIPTION
26              
27             This module provides a thin integration layer on top of L.
28              
29             At the beginning of each request, the middleware connects to IntelliJ to
30             allow remote debugging. If IntelliJ is not running or not set up for debugging,
31             execution continues as normal.
32              
33             =cut
34              
35 1     1   612 use strict;
  1         2  
  1         26  
36 1     1   4 use warnings;
  1         2  
  1         44  
37              
38             our $VERSION = '0.03';
39              
40             use constant {
41 1         114 DEBUG_SINGLE_STEP_ON => 0x20,
42             DEBUG_USE_SUB_ADDRESS => 0x40,
43             DEBUG_REPORT_GOTO => 0x80,
44             DEBUG_ALL => 0x7ff,
45 1     1   5 };
  1         2  
46              
47             use constant {
48 1         427 DEBUG_OFF => 0x0,
49             DEBUG_PREPARE_FLAGS => # 0x73c
50             DEBUG_ALL & ~(DEBUG_USE_SUB_ADDRESS|DEBUG_REPORT_GOTO|DEBUG_SINGLE_STEP_ON),
51 1     1   6 };
  1         2  
52              
53             our @ISA;
54              
55             sub import {
56 0     0     my ($class, %args) = @_;
57              
58             die "Specify 'remote_host'"
59 0 0         unless $args{remote_host};
60 0           my ($host, $port) = split /:/, $args{remote_host}, 2;
61              
62 0           $ENV{PERL5_DEBUG_HOST} = $host;
63 0           $ENV{PERL5_DEBUG_PORT} = $port;
64 0           $ENV{PERL5_DEBUG_ROLE} = 'client';
65 0           $ENV{PERL5_DEBUG_AUTOSTART} = 0;
66              
67 0 0         if ($args{enbugger}) {
68 0           require Enbugger;
69              
70 0           Enbugger->VERSION(2.014);
71 0           Enbugger->load_source;
72             }
73              
74 0           my $inc_path = $args{debug_client_path};
75 0 0         unshift @INC, ref $inc_path ? @$inc_path : $inc_path
    0          
76             if $inc_path;
77 0           require Devel::Camelcadedb;
78              
79 0           $^P = DEBUG_PREPARE_FLAGS;
80              
81 0           require Plack::Middleware;
82 0           require Plack::Request;
83 0           require Plack::Response;
84 0           require Plack::Util;
85              
86 0           @ISA = qw(Plack::Middleware);
87             }
88              
89             sub reopen_camelcadedb_connection {
90 0     0 0   DB::connect_or_reconnect();
91 0 0         DB::enable() if DB::is_connected();
92             }
93              
94             sub close_camelcadedb_connection {
95 0     0 0   DB::disconnect();
96 0           DB::disable();
97             # this works around uWSGI bug fixed by
98             # https://github.com/unbit/uwsgi/commit/c6f61719106908b82ba2714fd9d2836fb1c27f22
99 0           $^P = DEBUG_OFF;
100             }
101              
102             sub call {
103 0     0 0   my($self, $env) = @_;
104              
105 0           reopen_camelcadedb_connection();
106              
107 0           my $res = $self->app->($env);
108             Plack::Util::response_cb($res, sub {
109             return sub {
110             # use $_[0] to try to avoid a copy
111 0 0 0       if (!defined $_[0] && DB::is_connected()) {
112 0           close_camelcadedb_connection();
113             }
114              
115 0           return $_[0];
116 0     0     };
117 0           });
118             }
119              
120             1;
121              
122             __END__