[ANN] Mongrel HTTP Library 0.2.2 (Serving Directories)

Hey Folks,

Another announcement of Mongrel -- the fastest little web server library for Ruby yet. This release is nice in that it should build on win32 better and it now sports a small DirHandler that can serve directories and files. This means Mongrel is closer to replacing WEBrick as a Rails debug runner.

You can get the releases and information from:

* http://rubyforge.org/projects/mongrel/ -- project page
* http://mongrel.rubyforge.org/ -- RDoc documentation.

== Install and Upgrade

People who use(d) RubyGems can simply do:

  gem install mongrel

-or-

  gem upgrade

And they'll get the new gear. You can go back to the project page and download the source .tgz if you installed using that.

== Changes

* Fixed a header so that win32 folks can build it.
* Added all CGI parameters that didn't cause security or performance problems.
* Forced the sockets to not do reverse name lookup (huge performance hit for little benefit).
* Created a REQUEST_URI parameter that has the original untouched URI used in the request. This is the string used to lookup the handlers and create the SCRIPT_NAME and PATH_INFO parameters.
* Implemented a basic directory serving handler called DirHandler. It will serve files in a directory, print a simple directory listing, and tries to protect against malicious path requests.
* Some minor code clean-ups and additional documentation regarding constants used.

== The DirHandler

The really simple DirHandler is used like this (from the examples/simpletest.rb file):

h = Mongrel::HttpServer.new("0.0.0.0", "3000")
h.register("/files", Mongrel::DirHandler.new("."))
h.run.join

This simply sets things up so that when people go to /files, they get the contents of the current directory. The DirHandler expands the path you give it so that when requests come in, it can expand them too and make sure that both paths have the same prefix. If not it will reject them. There is also an option to turn off the directory listings using the second parameter to DirHandler.new().

This initial file serving is very simplistic since it doesn't map extensions to mime types yet. It should be a good start for some people though.

== Feedback

Thanks for all the feedback and bug reports so far. With directory serving and complete CGI parameters out of the way I'm going to start working on a Rails runner using Mongrel next, and possibly a caching system. Goal for the weekend will be to get a Rails application running in Mongrel standalone.

Enjoy!

Zed A. Shaw
http://www.zedshaw.com/

Like Daniel Sheppard in the previous version I'm getting errors when
attempting the following on windows:

irb(main):001:0> require_gem 'mongrel'
=> true
irb(main):002:0> p Mongrel
NameError: uninitialized constant Mongrel
        from (irb):2
irb(main):003:0>

Looking at the gem install itself, everything seems to have been created
correctly. I have a mongrel.rb in mongrel's lib dir, just can't seem to get
it to actually LOAD correctly. Any help would be great.

···

On 2/3/06, Zed Shaw <zedshaw@zedshaw.com> wrote:

Hey Folks,

Another announcement of Mongrel -- the fastest little web server
library for Ruby yet. This release is nice in that it should build
on win32 better and it now sports a small DirHandler that can serve
directories and files. This means Mongrel is closer to replacing
WEBrick as a Rails debug runner.

You can get the releases and information from:

* http://rubyforge.org/projects/mongrel/ -- project page
* http://mongrel.rubyforge.org/ -- RDoc documentation.

== Install and Upgrade

People who use(d) RubyGems can simply do:

  gem install mongrel

-or-

  gem upgrade

And they'll get the new gear. You can go back to the project page
and download the source .tgz if you installed using that.

== Changes

* Fixed a header so that win32 folks can build it.
* Added all CGI parameters that didn't cause security or performance
problems.
* Forced the sockets to not do reverse name lookup (huge performance
hit for little benefit).
* Created a REQUEST_URI parameter that has the original untouched URI
used in the request. This is the string used to lookup the handlers
and create the SCRIPT_NAME and PATH_INFO parameters.
* Implemented a basic directory serving handler called DirHandler.
It will serve files in a directory, print a simple directory listing,
and tries to protect against malicious path requests.
* Some minor code clean-ups and additional documentation regarding
constants used.

== The DirHandler

The really simple DirHandler is used like this (from the examples/
simpletest.rb file):

h = Mongrel::HttpServer.new("0.0.0.0", "3000")
h.register("/files", Mongrel::DirHandler.new("."))
h.run.join

This simply sets things up so that when people go to /files, they get
the contents of the current directory. The DirHandler expands the
path you give it so that when requests come in, it can expand them
too and make sure that both paths have the same prefix. If not it
will reject them. There is also an option to turn off the directory
listings using the second parameter to DirHandler.new().

This initial file serving is very simplistic since it doesn't map
extensions to mime types yet. It should be a good start for some
people though.

== Feedback

Thanks for all the feedback and bug reports so far. With directory
serving and complete CGI parameters out of the way I'm going to start
working on a Rails runner using Mongrel next, and possibly a caching
system. Goal for the weekend will be to get a Rails application
running in Mongrel standalone.

Enjoy!

Zed A. Shaw
http://www.zedshaw.com/

--
===Tanner Burson===
tanner.burson@gmail.com
http://tannerburson.com <---Might even work one day...

* Fixed a header so that win32 folks can build it.

What do I need to try to build it on win32? Can someone point me to the right compiler?

-Sascha Ebach

Sorry for the double post, but as it turns out I get an Identical error on
my Debian box as well, so something in the install seems to be a bit
fubar'd.

···

On 2/3/06, Tanner Burson <tanner.burson@gmail.com> wrote:

On 2/3/06, Zed Shaw <zedshaw@zedshaw.com> wrote:
>
> Hey Folks,
>
> Another announcement of Mongrel -- the fastest little web server
> library for Ruby yet. This release is nice in that it should build
> on win32 better and it now sports a small DirHandler that can serve
> directories and files. This means Mongrel is closer to replacing
> WEBrick as a Rails debug runner.
>
> You can get the releases and information from:
>
> * http://rubyforge.org/projects/mongrel/ -- project page
> * http://mongrel.rubyforge.org/ -- RDoc documentation.
>
> == Install and Upgrade
>
> People who use(d) RubyGems can simply do:
>
> gem install mongrel
>
> -or-
>
> gem upgrade
>
> And they'll get the new gear. You can go back to the project page
> and download the source .tgz if you installed using that.
>
> == Changes
>
> * Fixed a header so that win32 folks can build it.
> * Added all CGI parameters that didn't cause security or performance
> problems.
> * Forced the sockets to not do reverse name lookup (huge performance
> hit for little benefit).
> * Created a REQUEST_URI parameter that has the original untouched URI
> used in the request. This is the string used to lookup the handlers
> and create the SCRIPT_NAME and PATH_INFO parameters.
> * Implemented a basic directory serving handler called DirHandler.
> It will serve files in a directory, print a simple directory listing,
> and tries to protect against malicious path requests.
> * Some minor code clean-ups and additional documentation regarding
> constants used.
>
> == The DirHandler
>
> The really simple DirHandler is used like this (from the examples/
> simpletest.rb file):
>
> h = Mongrel::HttpServer.new("0.0.0.0", "3000")
> h.register("/files", Mongrel::DirHandler.new("."))
> h.run.join
>
> This simply sets things up so that when people go to /files, they get
> the contents of the current directory. The DirHandler expands the
> path you give it so that when requests come in, it can expand them
> too and make sure that both paths have the same prefix. If not it
> will reject them. There is also an option to turn off the directory
> listings using the second parameter to DirHandler.new().
>
> This initial file serving is very simplistic since it doesn't map
> extensions to mime types yet. It should be a good start for some
> people though.
>
>
> == Feedback
>
> Thanks for all the feedback and bug reports so far. With directory
> serving and complete CGI parameters out of the way I'm going to start
> working on a Rails runner using Mongrel next, and possibly a caching
> system. Goal for the weekend will be to get a Rails application
> running in Mongrel standalone.
>
> Enjoy!
>
> Zed A. Shaw
> http://www.zedshaw.com/
>
>
>
>
Like Daniel Sheppard in the previous version I'm getting errors when
attempting the following on windows:

irb(main):001:0> require_gem 'mongrel'
=> true
irb(main):002:0> p Mongrel
NameError: uninitialized constant Mongrel
        from (irb):2
irb(main):003:0>

Looking at the gem install itself, everything seems to have been created
correctly. I have a mongrel.rb in mongrel's lib dir, just can't seem to
get it to actually LOAD correctly. Any help would be great.

--
===Tanner Burson===
tanner.burson@gmail.com
http://tannerburson.com <---Might even work one day...

Sascha Ebach wrote:

* Fixed a header so that win32 folks can build it.

What do I need to try to build it on win32? Can someone point me to the right compiler?

-Sascha Ebach

Microsoft Visual C++ Toolkit 2003

Did you make sure to require rubygems first? Here's my install:

[zedshaw@dinky ~]$ irb -rubygems
irb(main):001:0> require 'mongrel'
=> true
irb(main):002:0>
[zedshaw@dinky ~]$
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'mongrel'
=> true
[zedshaw@dinky ~]$ irb
irb(main):001:0> require 'mongrel'
LoadError: no such file to load -- http11
        from ./mongrel.rb:2:in `require'
        from ./mongrel.rb:2
        from (irb):1
irb(main):002:0>

If you do irb -rubygems then it works. If you require 'rubygems' first it
works. If you do neither it blows up.

Let me know if that fixes it for you.

Zed A. Shaw

···

On 2/3/06, Tanner Burson <tanner.burson@gmail.com> wrote:

Like Daniel Sheppard in the previous version I'm getting errors when
attempting the following on windows:

irb(main):001:0> require_gem 'mongrel'
=> true
irb(main):002:0> p Mongrel
NameError: uninitialized constant Mongrel
        from (irb):2
irb(main):003:0>

Looking at the gem install itself, everything seems to have been created
correctly. I have a mongrel.rb in mongrel's lib dir, just can't seem to
get it to actually LOAD correctly. Any help would be great.

Sorry for the double post, but as it turns out I get an Identical error on
my Debian box as well, so something in the install seems to be a bit
fubar'd.

--
===Tanner Burson==tanner.burson@gmail.com
http://tannerburson.com <---Might even work one day...

Did you make sure to require rubygems first? Here's my install:

[zedshaw@dinky ~]$ irb -rubygems
irb(main):001:0> require 'mongrel'
=> true
irb(main):002:0>
[zedshaw@dinky ~]$
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'mongrel'
=> true
[zedshaw@dinky ~]$ irb
irb(main):001:0> require 'mongrel'
LoadError: no such file to load -- http11
        from ./mongrel.rb:2:in `require'
        from ./mongrel.rb:2
        from (irb):1
irb(main):002:0>

If you do irb -rubygems then it works. If you require 'rubygems' first it
works. If you do neither it blows up.

Let me know if that fixes it for you.

Zed A. Shaw
http://www.zedshaw.com/

Nope, different error now. (Other gems work just fine, so I don't think
it's my gem install)

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'mongrel'
NameError: uninitialized constant Mongrel
        from ./mongrel.rb:4
        from
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21:in `require'
        from (irb):2
irb(main):003:0>

···

On 2/3/06, zedshaw@zedshaw.com <zedshaw@zedshaw.com> wrote:

On 2/3/06, Tanner Burson <tanner.burson@gmail.com> wrote:
>> Like Daniel Sheppard in the previous version I'm getting errors when
>> attempting the following on windows:
>>
>> irb(main):001:0> require_gem 'mongrel'
>> => true
>> irb(main):002:0> p Mongrel
>> NameError: uninitialized constant Mongrel
>> from (irb):2
>> irb(main):003:0>
>>
>> Looking at the gem install itself, everything seems to have been
created
>> correctly. I have a mongrel.rb in mongrel's lib dir, just can't seem
to
>> get it to actually LOAD correctly. Any help would be great.
>>
>>
>
> Sorry for the double post, but as it turns out I get an Identical error
on
> my Debian box as well, so something in the install seems to be a bit
> fubar'd.
>
> --
> ===Tanner Burson==tanner.burson@gmail.com
> http://tannerburson.com <---Might even work one day...
>

--
===Tanner Burson===
tanner.burson@gmail.com
http://tannerburson.com <---Might even work one day...

Did you make sure to require rubygems first? Here's my install:

<snip>

Nope, different error now. (Other gems work just fine, so I don't think
it's my gem install)

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'mongrel'
NameError: uninitialized constant Mongrel
        from ./mongrel.rb:4
        from
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21:in
`require'
        from (irb):2
irb(main):003:0>

Are you sure that you don't have any previous versions of Mongrel
installed via source? Or is ./mongrel.rb a file you're working on that's
getting loaded when you do require? The reason I ask is "from
./mongrel.rb:4" means that you're trying to use Mongrel modules at line 4.
When I look at line 4 of the mongrel.rb library it's a "require
'stringio'" line. So, that error has to be coming from somewhere else.

Make sure you can identify all the "mongrel.rb" files on your system and
that you're not loading the wrong one on accident.

Zed A. Shaw

···

On 2/3/06, zedshaw@zedshaw.com <zedshaw@zedshaw.com> wrote:

>>
>> Did you make sure to require rubygems first? Here's my install:
<snip>

> Nope, different error now. (Other gems work just fine, so I don't think
> it's my gem install)
>
> irb(main):001:0> require 'rubygems'
> => true
> irb(main):002:0> require 'mongrel'
> NameError: uninitialized constant Mongrel
> from ./mongrel.rb:4
> from
> /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21:in
> `require'
> from (irb):2
> irb(main):003:0>

Are you sure that you don't have any previous versions of Mongrel
installed via source? Or is ./mongrel.rb a file you're working on that's
getting loaded when you do require? The reason I ask is "from
./mongrel.rb:4" means that you're trying to use Mongrel modules at line 4.
When I look at line 4 of the mongrel.rb library it's a "require
'stringio'" line. So, that error has to be coming from somewhere else.

Make sure you can identify all the "mongrel.rb" files on your system and
that you're not loading the wrong one on accident.

Hah, interesting side note. Don't name the test file mongrel.rb when
attempting to test a file with a library named mongrel.rb. Well that was an
interesting bug to track down. Thanks

Zed A. Shaw

···

On 2/3/06, zedshaw@zedshaw.com <zedshaw@zedshaw.com> wrote:

> On 2/3/06, zedshaw@zedshaw.com <zedshaw@zedshaw.com> wrote:
http://www.zedshaw.com/

--
===Tanner Burson===
tanner.burson@gmail.com
http://tannerburson.com <---Might even work one day...