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

  ViewVC Help
Powered by ViewVC 1.1.26