/[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 886 - (show annotations)
Wed Dec 24 13:50:55 2008 UTC (15 years, 4 months ago) by dpavlin
File size: 3792 byte(s)
invoke all methods and not only those with as_
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 my $content_type = 'text/plain';
59
60 eval {
61
62 if ( $path =~ m{/reload(.*)} ) {
63
64 $ENV{FREY_NO_LOG} = 1;
65 my $cmd = "perl -c $0";
66 warn "# check syntax with $cmd";
67 if ( system($cmd) == 0 ) {
68 my $server = Frey::Server->new;
69 $self->load_config;
70 # Module::Reload->check;
71 warn "# reload done";
72 $self->print( refresh( $1, 0 ) );
73 return;
74 } else {
75 warn "ERROR: $?";
76 }
77 $ENV{FREY_NO_LOG} = 0;
78
79 } elsif ( $path =~ m{/exit(.*)} ) {
80 # FIXME do we need some kind of check here for production? :-)
81 # ./bin/dev.sh will restart us during development
82 $self->print( refresh( $1, 2 ) );
83 exit;
84 }
85
86 my $html;
87
88 sub rest2class {
89 my $class = shift;
90 $class =~ s/-/::/; # sigh!
91 return $class;
92 }
93
94 my $f;
95
96 # shared run params
97 my $run = {
98 request_url => $url,
99 # debug => 1,
100 };
101
102 if (
103 $path =~ m{/Frey[:-]+ObjectBrowser}
104 ) {
105 $f = Frey::ObjectBrowser->new( fey_class => $params->{class} );
106 # $f->request( $req );
107 } elsif (
108 $path =~ m{/Frey[:-]+ObjectDesigner}
109 ) {
110 $f = Frey::ObjectDesigner->new( fey_class => $params->{class} );
111 # $f->request( $req );
112 } elsif ( $path =~ $self->editor->url_regex ) {
113 $self->print( $self->editor->command( $path ) );
114 return;
115 } elsif (
116 $path =~ m{/([^/]+)/(\w+)/?([^/]+)?}
117 ) {
118 my $class = rest2class $1;
119 warn "# run $path -> $class $2";
120 $run->{format} = $3 if $3;
121 $run->{$_} = $params->{$_} foreach keys %$params;
122 $f = Frey::Run->new( class => $class, params => $run, run => $2 );
123 } elsif (
124 $path =~ m{/([^/]+)/?$}
125 ) {
126 my $class = rest2class $1;
127 warn "# introspect $class";
128 $run->{class} ||= $class;
129 $f = Frey::Run->new( class => 'Frey::Introspect', params => $run );
130 } else {
131 $f = Frey::Run->new( class => 'Frey::Class::Browser', params => $run );
132 }
133
134 if ( $f ) {
135 $f->clean_status;
136 # $f->add_status( { request => $req } );
137 $f->status_parts;
138 if ( my $html = $f->html ) {
139 warn "## html ",length($html)," bytes";
140 $self->print( $html );
141 } else {
142 confess "no output from $f";
143 }
144 } else {
145 confess "# can't call request on nothing!";
146 }
147
148 $content_type = $f->content_type;
149 };
150
151 if ( $@ ) {
152 warn "SERVER ERROR: $@";
153 # $req->conn->send_error( 404 ); # FIXME this should probably be 500, but we can't ship page with it
154 $content_type = 'text/html';
155 $self->print( qq{<pre class="frey-error">$@<pre>\r\n\r\n} );
156 # Carp::REPL::repl;
157 }
158
159 return $content_type;
160 }
161
162 sub refresh {
163 my ( $url, $time ) = @_;
164 $url ||= '/';
165 $time ||= 0;
166 warn "# refresh $url";
167 qq|
168 <html>
169 <head>
170 <META HTTP-EQUIV="Refresh" CONTENT="$time; URL=$url"></META>
171 </head>
172 <body>
173 Refresh <a href="$url"><tt>$url</tt></a> in $time sec
174 </body>
175 </html>
176 \n\r\n\r
177 |; # XXX newlines at end are important to flush content to browser
178 }
179
180 1;

  ViewVC Help
Powered by ViewVC 1.1.26