mirror of
https://github.com/puma/puma.git
synced 2022-11-09 13:48:40 -05:00
Fixed a bug in the Error404Handler. Created the first Rails runner script.
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@21 19e92222-5c0b-0410-8929-a290d50e31e9
This commit is contained in:
parent
788e4f4902
commit
98a33bb304
6 changed files with 205 additions and 84 deletions
12
README
12
README
|
@ -11,7 +11,7 @@ scream without too many portability issues.
|
||||||
|
|
||||||
== Status
|
== Status
|
||||||
|
|
||||||
The 0.2.1 release of Mongrel features an HTTP core server that is the fastest possible
|
The 0.2.2 release of Mongrel features an HTTP core server that is the fastest possible
|
||||||
thing I could get without using something other than Ruby. It features a few bug fixes,
|
thing I could get without using something other than Ruby. It features a few bug fixes,
|
||||||
but mostly just a change to the Mongrel::HttpResponse class to make it more feature
|
but mostly just a change to the Mongrel::HttpResponse class to make it more feature
|
||||||
complete. The remaining development will be spent getting Mongrel to work with
|
complete. The remaining development will be spent getting Mongrel to work with
|
||||||
|
@ -28,6 +28,9 @@ page found at http://rubyforge.org/projects/mongrel/ thanks to Tom Copland.
|
||||||
I'll be looking to automate management of this, but feel free to use
|
I'll be looking to automate management of this, but feel free to use
|
||||||
rubyforge to post feature requests, bugs, and join the mailing list.
|
rubyforge to post feature requests, bugs, and join the mailing list.
|
||||||
|
|
||||||
|
Finally, it now supports all CGI parameters that don't cause a performance hit,
|
||||||
|
and it has a Mongrel::DirHandler which can serve files out of a directory and
|
||||||
|
do (optional) directory listings.
|
||||||
|
|
||||||
== Install
|
== Install
|
||||||
|
|
||||||
|
@ -40,7 +43,6 @@ who can build it for you.
|
||||||
|
|
||||||
Finally, the source includes a setup.rb for those who hate RubyGems.
|
Finally, the source includes a setup.rb for those who hate RubyGems.
|
||||||
|
|
||||||
|
|
||||||
== Usage
|
== Usage
|
||||||
|
|
||||||
The examples/simpletest.rb file has the following code as the simplest
|
The examples/simpletest.rb file has the following code as the simplest
|
||||||
|
@ -59,6 +61,7 @@ example:
|
||||||
|
|
||||||
h = Mongrel::HttpServer.new("0.0.0.0", "3000")
|
h = Mongrel::HttpServer.new("0.0.0.0", "3000")
|
||||||
h.register("/test", SimpleHandler.new)
|
h.register("/test", SimpleHandler.new)
|
||||||
|
h.register("/files", DirHandler.new("."))
|
||||||
h.run.join
|
h.run.join
|
||||||
|
|
||||||
If you run this and access port 3000 with a browser it will say
|
If you run this and access port 3000 with a browser it will say
|
||||||
|
@ -66,6 +69,11 @@ If you run this and access port 3000 with a browser it will say
|
||||||
give a simple 404. Check out the Mongrel::Error404Handler for a
|
give a simple 404. Check out the Mongrel::Error404Handler for a
|
||||||
basic way to give a more complex 404 message.
|
basic way to give a more complex 404 message.
|
||||||
|
|
||||||
|
This also shows the DirHandler with directory listings. This is still
|
||||||
|
rough but it should work for basic hosting. *File extension to mime
|
||||||
|
type mapping is missing though.*
|
||||||
|
|
||||||
|
|
||||||
== Speed
|
== Speed
|
||||||
|
|
||||||
The 0.2.1 release probably consists of the most effort I've ever put into
|
The 0.2.1 release probably consists of the most effort I've ever put into
|
||||||
|
|
2
Rakefile
2
Rakefile
|
@ -27,4 +27,4 @@ setup_extension("http11", "http11")
|
||||||
|
|
||||||
summary = "An experimental fast simple web server for Ruby."
|
summary = "An experimental fast simple web server for Ruby."
|
||||||
test_file = "test/test_ws.rb"
|
test_file = "test/test_ws.rb"
|
||||||
setup_gem("mongrel", "0.2.1", "Zed A. Shaw", summary, [], test_file)
|
setup_gem("mongrel", "0.2.2", "Zed A. Shaw", summary, [], test_file)
|
||||||
|
|
73
examples/mongrel_rails.rb
Normal file
73
examples/mongrel_rails.rb
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
require 'mongrel'
|
||||||
|
require 'cgi'
|
||||||
|
require 'config/environment'
|
||||||
|
|
||||||
|
class CGIFixed < ::CGI
|
||||||
|
public :env_table
|
||||||
|
|
||||||
|
def initialize(params, data, out, *args)
|
||||||
|
@env_table = params
|
||||||
|
@args = *args
|
||||||
|
@input = StringIO.new(data)
|
||||||
|
@out = out
|
||||||
|
super(*args)
|
||||||
|
end
|
||||||
|
|
||||||
|
def args
|
||||||
|
@args
|
||||||
|
end
|
||||||
|
|
||||||
|
def env_table
|
||||||
|
@env_table
|
||||||
|
end
|
||||||
|
|
||||||
|
def stdinput
|
||||||
|
@input
|
||||||
|
end
|
||||||
|
|
||||||
|
def stdoutput
|
||||||
|
@out
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
class RailsHandler < Mongrel::HttpHandler
|
||||||
|
def initialize
|
||||||
|
@guard = Mutex.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def process(request, response)
|
||||||
|
# not static, need to talk to rails
|
||||||
|
return if response.socket.closed?
|
||||||
|
|
||||||
|
cgi = CGIFixed.new(request.params, request.body, response.socket)
|
||||||
|
begin
|
||||||
|
|
||||||
|
@guard.synchronize do
|
||||||
|
# Rails is not thread safe so must be run entirely within synchronize
|
||||||
|
Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
|
||||||
|
end
|
||||||
|
|
||||||
|
response.send_status
|
||||||
|
response.send_body
|
||||||
|
rescue IOError
|
||||||
|
@log.error("received IOError #$! when handling client. Your web server doesn't like me.")
|
||||||
|
rescue Object => rails_error
|
||||||
|
@log.error("calling Dispatcher.dispatch", rails_error)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if ARGV.length != 3
|
||||||
|
STDERR.puts "usage: mongrel_rails.rb <host> <port> <docroot>"
|
||||||
|
exit(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
h = Mongrel::HttpServer.new(ARGV[0], ARGV[1])
|
||||||
|
h.register("/", Mongrel::DirHandler.new(ARGV[2]))
|
||||||
|
h.register("/app", RailsHandler.new)
|
||||||
|
h.run
|
||||||
|
|
||||||
|
puts "Mongrel running on #{ARGV[0]}:#{ARGV[1]} with docroot #{ARGV[2]}"
|
||||||
|
|
||||||
|
h.acceptor.join
|
|
@ -4,14 +4,24 @@ require 'yaml'
|
||||||
class SimpleHandler < Mongrel::HttpHandler
|
class SimpleHandler < Mongrel::HttpHandler
|
||||||
def process(request, response)
|
def process(request, response)
|
||||||
response.start do |head,out|
|
response.start do |head,out|
|
||||||
head["Content-Type"] = "text/plain"
|
head["Content-Type"] = "text/html"
|
||||||
out.write("hello!\n")
|
out << "<html><body>Your request:<br />"
|
||||||
|
out << "<pre>#{request.params.to_yaml}</pre>"
|
||||||
|
out << "<a href=\"/files\">View the files.</a></body></html>"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
h = Mongrel::HttpServer.new("0.0.0.0", "3000")
|
if ARGV.length != 3
|
||||||
h.register("/test", SimpleHandler.new)
|
STDERR.puts "usage: simpletest.rb <host> <port> <docroot>"
|
||||||
h.register("/files", Mongrel::DirHandler.new("."))
|
exit(1)
|
||||||
h.run.join
|
end
|
||||||
|
|
||||||
|
h = Mongrel::HttpServer.new(ARGV[0], ARGV[1])
|
||||||
|
h.register("/", SimpleHandler.new)
|
||||||
|
h.register("/files", Mongrel::DirHandler.new(ARGV[2]))
|
||||||
|
h.run
|
||||||
|
|
||||||
|
puts "Mongrel running on #{ARGV[0]}:#{ARGV[1]} with docroot #{ARGV[2]}"
|
||||||
|
|
||||||
|
h.acceptor.join
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#line 1 "http11_parser.rl"
|
#line 1 "ext/http11/http11_parser.rl"
|
||||||
#include "http11_parser.h"
|
#include "http11_parser.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -9,28 +9,28 @@
|
||||||
#define MARK(S,F) assert((F) - (S)->mark >= 0); (S)->mark = (F);
|
#define MARK(S,F) assert((F) - (S)->mark >= 0); (S)->mark = (F);
|
||||||
|
|
||||||
/** machine **/
|
/** machine **/
|
||||||
#line 98 "http11_parser.rl"
|
#line 98 "ext/http11/http11_parser.rl"
|
||||||
|
|
||||||
|
|
||||||
/** Data **/
|
/** Data **/
|
||||||
|
|
||||||
#line 18 "http11_parser.c"
|
#line 18 "ext/http11/http11_parser.c"
|
||||||
static int http_parser_start = 0;
|
static int http_parser_start = 0;
|
||||||
|
|
||||||
static int http_parser_first_final = 56;
|
static int http_parser_first_final = 56;
|
||||||
|
|
||||||
static int http_parser_error = 1;
|
static int http_parser_error = 1;
|
||||||
|
|
||||||
#line 102 "http11_parser.rl"
|
#line 102 "ext/http11/http11_parser.rl"
|
||||||
|
|
||||||
int http_parser_init(http_parser *parser) {
|
int http_parser_init(http_parser *parser) {
|
||||||
int cs = 0;
|
int cs = 0;
|
||||||
|
|
||||||
#line 30 "http11_parser.c"
|
#line 30 "ext/http11/http11_parser.c"
|
||||||
{
|
{
|
||||||
cs = http_parser_start;
|
cs = http_parser_start;
|
||||||
}
|
}
|
||||||
#line 106 "http11_parser.rl"
|
#line 106 "ext/http11/http11_parser.rl"
|
||||||
parser->cs = cs;
|
parser->cs = cs;
|
||||||
parser->body_start = NULL;
|
parser->body_start = NULL;
|
||||||
parser->content_len = 0;
|
parser->content_len = 0;
|
||||||
|
@ -50,7 +50,7 @@ size_t http_parser_execute(http_parser *parser, const char *buffer, size_t len)
|
||||||
pe = buffer+len;
|
pe = buffer+len;
|
||||||
|
|
||||||
|
|
||||||
#line 54 "http11_parser.c"
|
#line 54 "ext/http11/http11_parser.c"
|
||||||
{
|
{
|
||||||
p -= 1;
|
p -= 1;
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
|
@ -70,14 +70,14 @@ case 0:
|
||||||
st1:
|
st1:
|
||||||
goto _out1;
|
goto _out1;
|
||||||
tr13:
|
tr13:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st2;
|
goto st2;
|
||||||
st2:
|
st2:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out2;
|
goto _out2;
|
||||||
case 2:
|
case 2:
|
||||||
#line 81 "http11_parser.c"
|
#line 81 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 69 )
|
if ( (*p) == 69 )
|
||||||
goto st3;
|
goto st3;
|
||||||
goto st1;
|
goto st1;
|
||||||
|
@ -117,7 +117,7 @@ case 7:
|
||||||
goto tr33;
|
goto tr33;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr33:
|
tr33:
|
||||||
#line 29 "http11_parser.rl"
|
#line 29 "ext/http11/http11_parser.rl"
|
||||||
{
|
{
|
||||||
if(parser->request_method != NULL)
|
if(parser->request_method != NULL)
|
||||||
parser->request_method(parser->data, parser->mark, p - parser->mark);
|
parser->request_method(parser->data, parser->mark, p - parser->mark);
|
||||||
|
@ -127,7 +127,7 @@ st8:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out8;
|
goto _out8;
|
||||||
case 8:
|
case 8:
|
||||||
#line 131 "http11_parser.c"
|
#line 131 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 42: goto tr27;
|
case 42: goto tr27;
|
||||||
case 43: goto tr28;
|
case 43: goto tr28;
|
||||||
|
@ -144,26 +144,26 @@ case 8:
|
||||||
goto tr28;
|
goto tr28;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr27:
|
tr27:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st9;
|
goto st9;
|
||||||
st9:
|
st9:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out9;
|
goto _out9;
|
||||||
case 9:
|
case 9:
|
||||||
#line 155 "http11_parser.c"
|
#line 155 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 32 )
|
if ( (*p) == 32 )
|
||||||
goto tr34;
|
goto tr34;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr34:
|
tr34:
|
||||||
#line 33 "http11_parser.rl"
|
#line 33 "ext/http11/http11_parser.rl"
|
||||||
{
|
{
|
||||||
if(parser->request_uri != NULL)
|
if(parser->request_uri != NULL)
|
||||||
parser->request_uri(parser->data, parser->mark, p - parser->mark);
|
parser->request_uri(parser->data, parser->mark, p - parser->mark);
|
||||||
}
|
}
|
||||||
goto st10;
|
goto st10;
|
||||||
tr48:
|
tr48:
|
||||||
#line 37 "http11_parser.rl"
|
#line 37 "ext/http11/http11_parser.rl"
|
||||||
{
|
{
|
||||||
if(parser->query_string != NULL)
|
if(parser->query_string != NULL)
|
||||||
parser->query_string(parser->data, parser->mark, p - parser->mark);
|
parser->query_string(parser->data, parser->mark, p - parser->mark);
|
||||||
|
@ -173,19 +173,19 @@ st10:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out10;
|
goto _out10;
|
||||||
case 10:
|
case 10:
|
||||||
#line 177 "http11_parser.c"
|
#line 177 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 72 )
|
if ( (*p) == 72 )
|
||||||
goto tr11;
|
goto tr11;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr11:
|
tr11:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st11;
|
goto st11;
|
||||||
st11:
|
st11:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out11;
|
goto _out11;
|
||||||
case 11:
|
case 11:
|
||||||
#line 189 "http11_parser.c"
|
#line 189 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 84 )
|
if ( (*p) == 84 )
|
||||||
goto st12;
|
goto st12;
|
||||||
goto st1;
|
goto st1;
|
||||||
|
@ -243,7 +243,7 @@ case 18:
|
||||||
goto st18;
|
goto st18;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr37:
|
tr37:
|
||||||
#line 42 "http11_parser.rl"
|
#line 42 "ext/http11/http11_parser.rl"
|
||||||
{
|
{
|
||||||
if(parser->http_version != NULL)
|
if(parser->http_version != NULL)
|
||||||
parser->http_version(parser->data, parser->mark, p - parser->mark);
|
parser->http_version(parser->data, parser->mark, p - parser->mark);
|
||||||
|
@ -253,7 +253,7 @@ st19:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out19;
|
goto _out19;
|
||||||
case 19:
|
case 19:
|
||||||
#line 257 "http11_parser.c"
|
#line 257 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 10 )
|
if ( (*p) == 10 )
|
||||||
goto st20;
|
goto st20;
|
||||||
goto st1;
|
goto st1;
|
||||||
|
@ -293,7 +293,7 @@ case 21:
|
||||||
goto tr40;
|
goto tr40;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr40:
|
tr40:
|
||||||
#line 46 "http11_parser.rl"
|
#line 46 "ext/http11/http11_parser.rl"
|
||||||
{
|
{
|
||||||
parser->body_start = p+1; goto _out56;
|
parser->body_start = p+1; goto _out56;
|
||||||
}
|
}
|
||||||
|
@ -302,17 +302,17 @@ st56:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out56;
|
goto _out56;
|
||||||
case 56:
|
case 56:
|
||||||
#line 306 "http11_parser.c"
|
#line 306 "ext/http11/http11_parser.c"
|
||||||
goto st1;
|
goto st1;
|
||||||
tr36:
|
tr36:
|
||||||
#line 16 "http11_parser.rl"
|
#line 16 "ext/http11/http11_parser.rl"
|
||||||
{ parser->field_start = p; }
|
{ parser->field_start = p; }
|
||||||
goto st22;
|
goto st22;
|
||||||
st22:
|
st22:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out22;
|
goto _out22;
|
||||||
case 22:
|
case 22:
|
||||||
#line 316 "http11_parser.c"
|
#line 316 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 33: goto st22;
|
case 33: goto st22;
|
||||||
case 58: goto tr32;
|
case 58: goto tr32;
|
||||||
|
@ -338,7 +338,7 @@ case 22:
|
||||||
goto st22;
|
goto st22;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr32:
|
tr32:
|
||||||
#line 17 "http11_parser.rl"
|
#line 17 "ext/http11/http11_parser.rl"
|
||||||
{
|
{
|
||||||
parser->field_len = (p - parser->field_start);
|
parser->field_len = (p - parser->field_start);
|
||||||
}
|
}
|
||||||
|
@ -347,24 +347,24 @@ st23:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out23;
|
goto _out23;
|
||||||
case 23:
|
case 23:
|
||||||
#line 351 "http11_parser.c"
|
#line 351 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 13 )
|
if ( (*p) == 13 )
|
||||||
goto tr56;
|
goto tr56;
|
||||||
goto tr55;
|
goto tr55;
|
||||||
tr55:
|
tr55:
|
||||||
#line 21 "http11_parser.rl"
|
#line 21 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st24;
|
goto st24;
|
||||||
st24:
|
st24:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out24;
|
goto _out24;
|
||||||
case 24:
|
case 24:
|
||||||
#line 363 "http11_parser.c"
|
#line 363 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 13 )
|
if ( (*p) == 13 )
|
||||||
goto tr51;
|
goto tr51;
|
||||||
goto st24;
|
goto st24;
|
||||||
tr51:
|
tr51:
|
||||||
#line 22 "http11_parser.rl"
|
#line 22 "ext/http11/http11_parser.rl"
|
||||||
{
|
{
|
||||||
if(parser->http_field != NULL) {
|
if(parser->http_field != NULL) {
|
||||||
parser->http_field(parser->data,
|
parser->http_field(parser->data,
|
||||||
|
@ -374,9 +374,9 @@ tr51:
|
||||||
}
|
}
|
||||||
goto st25;
|
goto st25;
|
||||||
tr56:
|
tr56:
|
||||||
#line 21 "http11_parser.rl"
|
#line 21 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
#line 22 "http11_parser.rl"
|
#line 22 "ext/http11/http11_parser.rl"
|
||||||
{
|
{
|
||||||
if(parser->http_field != NULL) {
|
if(parser->http_field != NULL) {
|
||||||
parser->http_field(parser->data,
|
parser->http_field(parser->data,
|
||||||
|
@ -389,7 +389,7 @@ st25:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out25;
|
goto _out25;
|
||||||
case 25:
|
case 25:
|
||||||
#line 393 "http11_parser.c"
|
#line 393 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 10: goto st26;
|
case 10: goto st26;
|
||||||
case 13: goto tr51;
|
case 13: goto tr51;
|
||||||
|
@ -424,14 +424,14 @@ case 26:
|
||||||
goto tr42;
|
goto tr42;
|
||||||
goto st24;
|
goto st24;
|
||||||
tr42:
|
tr42:
|
||||||
#line 16 "http11_parser.rl"
|
#line 16 "ext/http11/http11_parser.rl"
|
||||||
{ parser->field_start = p; }
|
{ parser->field_start = p; }
|
||||||
goto st27;
|
goto st27;
|
||||||
st27:
|
st27:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out27;
|
goto _out27;
|
||||||
case 27:
|
case 27:
|
||||||
#line 435 "http11_parser.c"
|
#line 435 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 13: goto tr51;
|
case 13: goto tr51;
|
||||||
case 33: goto st27;
|
case 33: goto st27;
|
||||||
|
@ -458,14 +458,14 @@ case 27:
|
||||||
goto st27;
|
goto st27;
|
||||||
goto st24;
|
goto st24;
|
||||||
tr28:
|
tr28:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st28;
|
goto st28;
|
||||||
st28:
|
st28:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out28;
|
goto _out28;
|
||||||
case 28:
|
case 28:
|
||||||
#line 469 "http11_parser.c"
|
#line 469 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 43: goto st28;
|
case 43: goto st28;
|
||||||
case 58: goto st29;
|
case 58: goto st29;
|
||||||
|
@ -483,14 +483,14 @@ case 28:
|
||||||
goto st28;
|
goto st28;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr30:
|
tr30:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st29;
|
goto st29;
|
||||||
st29:
|
st29:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out29;
|
goto _out29;
|
||||||
case 29:
|
case 29:
|
||||||
#line 494 "http11_parser.c"
|
#line 494 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 32: goto tr34;
|
case 32: goto tr34;
|
||||||
case 37: goto st30;
|
case 37: goto st30;
|
||||||
|
@ -531,14 +531,14 @@ case 31:
|
||||||
goto st29;
|
goto st29;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr29:
|
tr29:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st32;
|
goto st32;
|
||||||
st32:
|
st32:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out32;
|
goto _out32;
|
||||||
case 32:
|
case 32:
|
||||||
#line 542 "http11_parser.c"
|
#line 542 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 32: goto tr34;
|
case 32: goto tr34;
|
||||||
case 37: goto st34;
|
case 37: goto st34;
|
||||||
|
@ -599,7 +599,7 @@ case 35:
|
||||||
goto st33;
|
goto st33;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr46:
|
tr46:
|
||||||
#line 33 "http11_parser.rl"
|
#line 33 "ext/http11/http11_parser.rl"
|
||||||
{
|
{
|
||||||
if(parser->request_uri != NULL)
|
if(parser->request_uri != NULL)
|
||||||
parser->request_uri(parser->data, parser->mark, p - parser->mark);
|
parser->request_uri(parser->data, parser->mark, p - parser->mark);
|
||||||
|
@ -609,7 +609,7 @@ st36:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out36;
|
goto _out36;
|
||||||
case 36:
|
case 36:
|
||||||
#line 613 "http11_parser.c"
|
#line 613 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 32: goto tr48;
|
case 32: goto tr48;
|
||||||
case 37: goto tr54;
|
case 37: goto tr54;
|
||||||
|
@ -624,14 +624,14 @@ case 36:
|
||||||
goto st1;
|
goto st1;
|
||||||
goto tr53;
|
goto tr53;
|
||||||
tr53:
|
tr53:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st37;
|
goto st37;
|
||||||
st37:
|
st37:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out37;
|
goto _out37;
|
||||||
case 37:
|
case 37:
|
||||||
#line 635 "http11_parser.c"
|
#line 635 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 32: goto tr48;
|
case 32: goto tr48;
|
||||||
case 37: goto st38;
|
case 37: goto st38;
|
||||||
|
@ -646,14 +646,14 @@ case 37:
|
||||||
goto st1;
|
goto st1;
|
||||||
goto st37;
|
goto st37;
|
||||||
tr54:
|
tr54:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st38;
|
goto st38;
|
||||||
st38:
|
st38:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out38;
|
goto _out38;
|
||||||
case 38:
|
case 38:
|
||||||
#line 657 "http11_parser.c"
|
#line 657 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) < 65 ) {
|
if ( (*p) < 65 ) {
|
||||||
if ( 48 <= (*p) && (*p) <= 57 )
|
if ( 48 <= (*p) && (*p) <= 57 )
|
||||||
goto st39;
|
goto st39;
|
||||||
|
@ -677,14 +677,14 @@ case 39:
|
||||||
goto st37;
|
goto st37;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr14:
|
tr14:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st40;
|
goto st40;
|
||||||
st40:
|
st40:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out40;
|
goto _out40;
|
||||||
case 40:
|
case 40:
|
||||||
#line 688 "http11_parser.c"
|
#line 688 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 69 )
|
if ( (*p) == 69 )
|
||||||
goto st41;
|
goto st41;
|
||||||
goto st1;
|
goto st1;
|
||||||
|
@ -696,14 +696,14 @@ case 41:
|
||||||
goto st7;
|
goto st7;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr15:
|
tr15:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st42;
|
goto st42;
|
||||||
st42:
|
st42:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out42;
|
goto _out42;
|
||||||
case 42:
|
case 42:
|
||||||
#line 707 "http11_parser.c"
|
#line 707 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 69 )
|
if ( (*p) == 69 )
|
||||||
goto st43;
|
goto st43;
|
||||||
goto st1;
|
goto st1;
|
||||||
|
@ -722,14 +722,14 @@ case 44:
|
||||||
goto st7;
|
goto st7;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr16:
|
tr16:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st45;
|
goto st45;
|
||||||
st45:
|
st45:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out45;
|
goto _out45;
|
||||||
case 45:
|
case 45:
|
||||||
#line 733 "http11_parser.c"
|
#line 733 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 80 )
|
if ( (*p) == 80 )
|
||||||
goto st46;
|
goto st46;
|
||||||
goto st1;
|
goto st1;
|
||||||
|
@ -769,14 +769,14 @@ case 50:
|
||||||
goto st7;
|
goto st7;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr17:
|
tr17:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st51;
|
goto st51;
|
||||||
st51:
|
st51:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out51;
|
goto _out51;
|
||||||
case 51:
|
case 51:
|
||||||
#line 780 "http11_parser.c"
|
#line 780 "ext/http11/http11_parser.c"
|
||||||
switch( (*p) ) {
|
switch( (*p) ) {
|
||||||
case 79: goto st52;
|
case 79: goto st52;
|
||||||
case 85: goto st41;
|
case 85: goto st41;
|
||||||
|
@ -790,14 +790,14 @@ case 52:
|
||||||
goto st41;
|
goto st41;
|
||||||
goto st1;
|
goto st1;
|
||||||
tr18:
|
tr18:
|
||||||
#line 14 "http11_parser.rl"
|
#line 14 "ext/http11/http11_parser.rl"
|
||||||
{ MARK(parser, p); }
|
{ MARK(parser, p); }
|
||||||
goto st53;
|
goto st53;
|
||||||
st53:
|
st53:
|
||||||
if ( ++p == pe )
|
if ( ++p == pe )
|
||||||
goto _out53;
|
goto _out53;
|
||||||
case 53:
|
case 53:
|
||||||
#line 801 "http11_parser.c"
|
#line 801 "ext/http11/http11_parser.c"
|
||||||
if ( (*p) == 82 )
|
if ( (*p) == 82 )
|
||||||
goto st54;
|
goto st54;
|
||||||
goto st1;
|
goto st1;
|
||||||
|
@ -875,15 +875,15 @@ case 55:
|
||||||
|
|
||||||
_out: {}
|
_out: {}
|
||||||
}
|
}
|
||||||
#line 125 "http11_parser.rl"
|
#line 125 "ext/http11/http11_parser.rl"
|
||||||
|
|
||||||
parser->cs = cs;
|
parser->cs = cs;
|
||||||
parser->nread = p - buffer;
|
parser->nread = p - buffer;
|
||||||
if(parser->body_start) {
|
if(parser->body_start) {
|
||||||
/* final \r\n combo encountered so stop right here */
|
/* final \r\n combo encountered so stop right here */
|
||||||
|
|
||||||
#line 886 "http11_parser.c"
|
#line 886 "ext/http11/http11_parser.c"
|
||||||
#line 131 "http11_parser.rl"
|
#line 131 "ext/http11/http11_parser.rl"
|
||||||
parser->nread++;
|
parser->nread++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -895,8 +895,8 @@ int http_parser_finish(http_parser *parser)
|
||||||
int cs = parser->cs;
|
int cs = parser->cs;
|
||||||
|
|
||||||
|
|
||||||
#line 899 "http11_parser.c"
|
#line 899 "ext/http11/http11_parser.c"
|
||||||
#line 142 "http11_parser.rl"
|
#line 142 "ext/http11/http11_parser.rl"
|
||||||
|
|
||||||
parser->cs = cs;
|
parser->cs = cs;
|
||||||
|
|
||||||
|
|
|
@ -239,18 +239,30 @@ module Mongrel
|
||||||
@body.rewind
|
@body.rewind
|
||||||
end
|
end
|
||||||
|
|
||||||
# This takes whatever has been done to header and body and then writes it in the
|
def send_status
|
||||||
# proper format to make an HTTP/1.1 response.
|
@socket.write("HTTP/1.1 #{@status} #{HTTP_STATUS_CODES[@status]}\r\nContent-Length: #{@body.length}\r\nConnection: close\r\n")
|
||||||
def finished
|
end
|
||||||
|
|
||||||
|
def send_header
|
||||||
@header.out.rewind
|
@header.out.rewind
|
||||||
|
@socket.write(@header.out.read)
|
||||||
|
@socket.write("\r\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
def send_body
|
||||||
@body.rewind
|
@body.rewind
|
||||||
|
|
||||||
# connection: close is also added to ensure that the client does not pipeline.
|
# connection: close is also added to ensure that the client does not pipeline.
|
||||||
@socket.write("HTTP/1.1 #{@status} #{HTTP_STATUS_CODES[@status]}\r\nContent-Length: #{@body.length}\r\nConnection: close\r\n")
|
|
||||||
@socket.write(@header.out.read)
|
|
||||||
@socket.write("\r\n")
|
|
||||||
@socket.write(@body.read)
|
@socket.write(@body.read)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# This takes whatever has been done to header and body and then writes it in the
|
||||||
|
# proper format to make an HTTP/1.1 response.
|
||||||
|
def finished
|
||||||
|
send_status
|
||||||
|
send_header
|
||||||
|
send_body
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -408,7 +420,7 @@ module Mongrel
|
||||||
# Sets the message to return. This is constructed once for the handler
|
# Sets the message to return. This is constructed once for the handler
|
||||||
# so it's pretty efficient.
|
# so it's pretty efficient.
|
||||||
def initialize(msg)
|
def initialize(msg)
|
||||||
@response = HttpServer::ERROR_404_RESPONSE + msg
|
@response = Const::ERROR_404_RESPONSE + msg
|
||||||
end
|
end
|
||||||
|
|
||||||
# Just kicks back the standard 404 response with your special message.
|
# Just kicks back the standard 404 response with your special message.
|
||||||
|
@ -429,21 +441,40 @@ module Mongrel
|
||||||
# that the final expanded path includes the root path. If it doesn't
|
# that the final expanded path includes the root path. If it doesn't
|
||||||
# than it simply gives a 404.
|
# than it simply gives a 404.
|
||||||
class DirHandler < HttpHandler
|
class DirHandler < HttpHandler
|
||||||
|
attr_reader :path
|
||||||
|
|
||||||
|
# You give it the path to the directory root and an (optional)
|
||||||
def initialize(path, listing_allowed=true)
|
def initialize(path, listing_allowed=true)
|
||||||
@path = File.expand_path(path)
|
@path = File.expand_path(path)
|
||||||
@listing_allowed=listing_allowed
|
@listing_allowed=listing_allowed
|
||||||
puts "DIR: #@path"
|
end
|
||||||
|
|
||||||
|
# Checks if the given path can be served and returns the full path (or nil if not).
|
||||||
|
def can_serve(path_info)
|
||||||
|
req = File.expand_path(path_info, @path)
|
||||||
|
if req.index(@path) != 0 or !File.exist? req
|
||||||
|
return nil
|
||||||
|
else
|
||||||
|
return req
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_dir_listing(base, dir, response)
|
def send_dir_listing(base, dir, response)
|
||||||
|
base.chop! if base[-1] == "/"[-1]
|
||||||
|
|
||||||
if @listing_allowed
|
if @listing_allowed
|
||||||
response.start(200) do |head,out|
|
response.start(200) do |head,out|
|
||||||
head['Content-Type'] = "text/html"
|
head['Content-Type'] = "text/html"
|
||||||
out << "<html><head><title>Directory Listing</title></head><body>"
|
out << "<html><head><title>Directory Listing</title></head><body>"
|
||||||
Dir.entries(dir).each do |child|
|
Dir.entries(dir).each do |child|
|
||||||
|
next if child == "."
|
||||||
|
|
||||||
|
if child == ".."
|
||||||
|
out << "<a href=\"#{base}/#{child}\">Up to parent..</a><br/>"
|
||||||
|
else
|
||||||
out << "<a href=\"#{base}/#{child}\">#{child}</a><br/>"
|
out << "<a href=\"#{base}/#{child}\">#{child}</a><br/>"
|
||||||
end
|
end
|
||||||
|
end
|
||||||
out << "</body></html>"
|
out << "</body></html>"
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -464,9 +495,9 @@ module Mongrel
|
||||||
|
|
||||||
|
|
||||||
def process(request, response)
|
def process(request, response)
|
||||||
req = File.expand_path("." + request.params['PATH_INFO'], @path)
|
path_info = request.params['PATH_INFO']
|
||||||
puts "FIND: #{req}"
|
req = can_serve path_info
|
||||||
if req.index(@path) != 0 or !File.exist? req
|
if not req
|
||||||
# not found, return a 404
|
# not found, return a 404
|
||||||
response.start(404) do |head,out|
|
response.start(404) do |head,out|
|
||||||
out << "File not found"
|
out << "File not found"
|
||||||
|
@ -481,9 +512,8 @@ module Mongrel
|
||||||
rescue => details
|
rescue => details
|
||||||
response.reset
|
response.reset
|
||||||
response.start(403) do |head,out|
|
response.start(403) do |head,out|
|
||||||
out << "Error accessing file"
|
out << "Error accessing file: #{details}"
|
||||||
end
|
end
|
||||||
STDERR.puts "ERROR: #{details}"
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue