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

  ViewVC Help
Powered by ViewVC 1.1.26