/[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 627 - (show annotations)
Sat Nov 29 22:02:08 2008 UTC (15 years, 4 months ago) by dpavlin
File size: 3640 byte(s)
split out Continuity based bits to Frey::Server::Continuity
and work a bit on Frey::Mojo
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 ",dump( @_ );
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 $url = URI->new($url);
49 }
50
51 my $path = $url->path;
52
53 # eval {
54 {
55
56 if ( $path =~ m{/reload(.*)} ) {
57
58 $ENV{FREY_NO_LOG} = 1;
59 my $cmd = "perl -c $0";
60 warn "# check syntax with $cmd";
61 if ( system($cmd) == 0 ) {
62 my $server = Frey::Server->new;
63 $self->load_config;
64 Module::Reload->check;
65 warn "# reload done";
66 $self->print( refresh( $1, 1 ) );
67 return;
68 } else {
69 warn "ERROR: $?";
70 }
71 $ENV{FREY_NO_LOG} = 0;
72
73 } elsif ( $path =~ m{/exit(.*)} ) {
74 # FIXME do we need some kind of check here for production? :-)
75 # ./bin/dev.sh will restart us during development
76 $self->print( refresh( $1, 2 ) );
77 exit;
78 }
79
80 my $html;
81
82 sub rest2class {
83 my $class = shift;
84 $class =~ s/-/::/; # sigh!
85 return $class;
86 }
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 $params->{request_url} = $url,
117 $run->{$_} = $params->{$_} foreach keys %$params;
118 $f = Frey::Run->new( class => $class, params => $run, run => $2, request_url => $url );
119 } elsif (
120 $path =~ m{/([^/]+)/?$}
121 ) {
122 my $class = rest2class $1;
123 warn "# introspect $class";
124 $run->{class} ||= $class;
125 $f = Frey::Run->new( class => 'Frey::Introspect', params => $run, request_url => $url );
126 } else {
127 $f = Frey::Run->new( class => 'Frey::ClassBrowser', params => $run, request_url => $url );
128 }
129
130 if ( $f ) {
131 $f->clean_status;
132 # $f->add_status( { request => $req } );
133 $f->status_parts;
134 if ( my $html = $f->html ) {
135 warn "## html ",length($html)," bytes";
136 $self->print( $html );
137 } else {
138 confess "no output from $f";
139 }
140 } else {
141 confess "# can't call request on nothing!";
142 }
143
144 };
145
146 if ( $@ ) {
147 warn "SERVER ERROR: $@";
148 # $req->conn->send_error( 404 ); # FIXME this should probably be 500, but we can't ship page with it
149 $self->print( qq{<pre class="frey-error">$@<pre>\r\n\r\n} );
150 # Carp::REPL::repl;
151 }
152
153 }
154
155 sub refresh {
156 my ( $url, $time ) = @_;
157 $url ||= '/';
158 $time ||= 1;
159 warn "# refresh $url";
160 qq|
161 <html>
162 <head>
163 <META HTTP-EQUIV="Refresh" CONTENT="$time; URL=$url"></META>
164 </head>
165 <body>
166 Refresh <a href="$url"><tt>$url</tt></a> in $time sec
167 </body>
168 </html>
169 \n\r\n\r
170 |; # XXX newlines at end are important to flush content to browser
171 }
172
173 1;

  ViewVC Help
Powered by ViewVC 1.1.26