/[Frey]/trunk/lib/Frey/Server.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /trunk/lib/Frey/Server.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 653 - (show annotations)
Sun Nov 30 23:49:32 2008 UTC (15 years, 4 months ago) by dpavlin
File size: 3577 byte(s)
first request_url cleanup
1 package Frey::Server;
2
3 use Moose;
4 extends 'Frey::Editor';
5 with 'Frey::Config';
6
7 use Data::Dump qw/dump/;
8
9 use Frey::Run;
10
11 has 'port' => (
12 documentation => 'port on which server listen',
13 is => 'ro',
14 isa => 'Int',
15 default => sub {
16 my $self = shift;
17 $ENV{FREY_PORT} || $self->config->{port} || 16001
18 },
19 );
20
21 has 'editor' => (
22 is => 'ro',
23 isa => 'Frey::Editor',
24 lazy => 1,
25 default => sub {
26 Frey::Editor->new;
27 },
28 );
29
30 =head2 request
31
32 This is simple dispatcher for our server. Currently it's in flux and
33 documented only in source code.
34
35 =cut
36
37 sub print {
38 my $self = shift;
39 warn "# print ", join(' ', map { length $_ } @_ );
40 $self->{_print}->( @_ );
41 }
42
43 sub request {
44 my ( $self, $url, $params ) = @_;
45
46 if ( my $ref = ref($url) ) {
47 die "url not URI but ", dump( $url ) unless $ref =~ m{^URI};
48 } else {
49 $url = URI->new($url);
50 }
51
52 my $path = $url->path;
53
54 eval {
55 # {
56
57 if ( $path =~ m{/reload(.*)} ) {
58
59 $ENV{FREY_NO_LOG} = 1;
60 my $cmd = "perl -c $0";
61 warn "# check syntax with $cmd";
62 if ( system($cmd) == 0 ) {
63 my $server = Frey::Server->new;
64 $self->load_config;
65 # Module::Reload->check;
66 warn "# reload done";
67 $self->print( refresh( $1, 0 ) );
68 return;
69 } else {
70 warn "ERROR: $?";
71 }
72 $ENV{FREY_NO_LOG} = 0;
73
74 } elsif ( $path =~ m{/exit(.*)} ) {
75 # FIXME do we need some kind of check here for production? :-)
76 # ./bin/dev.sh will restart us during development
77 $self->print( refresh( $1, 2 ) );
78 exit;
79 }
80
81 my $html;
82
83 sub rest2class {
84 my $class = shift;
85 $class =~ s/-/::/; # sigh!
86 return $class;
87 }
88
89 my $f;
90
91 # shared run params
92 my $run = {
93 request_url => $url,
94 # debug => 1,
95 };
96
97 if (
98 $path =~ m{/Frey[:-]+ObjectBrowser}
99 ) {
100 $f = Frey::ObjectBrowser->new( fey_class => $params->{class} );
101 # $f->request( $req );
102 } elsif (
103 $path =~ m{/Frey[:-]+ObjectDesigner}
104 ) {
105 $f = Frey::ObjectDesigner->new( fey_class => $params->{class} );
106 # $f->request( $req );
107 } elsif ( $path =~ $self->editor->url_regex ) {
108 $self->print( $self->editor->command( $path ) );
109 return;
110 } elsif (
111 $path =~ m{/([^/]+)/(\w*as_\w+)/?([^/]+)?}
112 ) {
113 my $class = rest2class $1;
114 warn "# run $path -> $class $2";
115 $run->{format} = $3 if $3;
116 $run->{$_} = $params->{$_} foreach keys %$params;
117 $f = Frey::Run->new( class => $class, params => $run, run => $2 );
118 } elsif (
119 $path =~ m{/([^/]+)/?$}
120 ) {
121 my $class = rest2class $1;
122 warn "# introspect $class";
123 $run->{class} ||= $class;
124 $f = Frey::Run->new( class => 'Frey::Introspect', params => $run );
125 } else {
126 $f = Frey::Run->new( class => 'Frey::ClassBrowser', params => $run );
127 }
128
129 if ( $f ) {
130 $f->clean_status;
131 # $f->add_status( { request => $req } );
132 $f->status_parts;
133 if ( my $html = $f->html ) {
134 warn "## html ",length($html)," bytes";
135 $self->print( $html );
136 } else {
137 confess "no output from $f";
138 }
139 } else {
140 confess "# can't call request on nothing!";
141 }
142
143 };
144
145 if ( $@ ) {
146 warn "SERVER ERROR: $@";
147 # $req->conn->send_error( 404 ); # FIXME this should probably be 500, but we can't ship page with it
148 $self->print( qq{<pre class="frey-error">$@<pre>\r\n\r\n} );
149 # Carp::REPL::repl;
150 }
151
152 }
153
154 sub refresh {
155 my ( $url, $time ) = @_;
156 $url ||= '/';
157 $time ||= 0;
158 warn "# refresh $url";
159 qq|
160 <html>
161 <head>
162 <META HTTP-EQUIV="Refresh" CONTENT="$time; URL=$url"></META>
163 </head>
164 <body>
165 Refresh <a href="$url"><tt>$url</tt></a> in $time sec
166 </body>
167 </html>
168 \n\r\n\r
169 |; # XXX newlines at end are important to flush content to browser
170 }
171
172 1;

  ViewVC Help
Powered by ViewVC 1.1.26