raw 0.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/doc/CONTRIBUTORS +106 -0
- data/doc/LICENSE +32 -0
- data/doc/coding_conventions.txt +11 -0
- data/lib/raw.rb +42 -0
- data/lib/raw/adapter.rb +113 -0
- data/lib/raw/adapter/cgi.rb +41 -0
- data/lib/raw/adapter/fastcgi.rb +48 -0
- data/lib/raw/adapter/mongrel.rb +146 -0
- data/lib/raw/adapter/script.rb +94 -0
- data/lib/raw/adapter/webrick.rb +144 -0
- data/lib/raw/adapter/webrick/vcr.rb +91 -0
- data/lib/raw/cgi.rb +323 -0
- data/lib/raw/cgi/cookie.rb +47 -0
- data/lib/raw/cgi/http.rb +62 -0
- data/lib/raw/compiler.rb +138 -0
- data/lib/raw/compiler/filter/cleanup.rb +21 -0
- data/lib/raw/compiler/filter/elements.rb +166 -0
- data/lib/raw/compiler/filter/elements/element.rb +210 -0
- data/lib/raw/compiler/filter/localization.rb +23 -0
- data/lib/raw/compiler/filter/markup.rb +32 -0
- data/lib/raw/compiler/filter/morph.rb +123 -0
- data/lib/raw/compiler/filter/morph/each.rb +34 -0
- data/lib/raw/compiler/filter/morph/for.rb +11 -0
- data/lib/raw/compiler/filter/morph/if.rb +26 -0
- data/lib/raw/compiler/filter/morph/selected_if.rb +43 -0
- data/lib/raw/compiler/filter/morph/standard.rb +55 -0
- data/lib/raw/compiler/filter/morph/times.rb +27 -0
- data/lib/raw/compiler/filter/script.rb +116 -0
- data/lib/raw/compiler/filter/squeeze.rb +16 -0
- data/lib/raw/compiler/filter/static_include.rb +74 -0
- data/lib/raw/compiler/filter/template.rb +121 -0
- data/lib/raw/compiler/reloader.rb +96 -0
- data/lib/raw/context.rb +154 -0
- data/lib/raw/context/flash.rb +157 -0
- data/lib/raw/context/global.rb +88 -0
- data/lib/raw/context/request.rb +338 -0
- data/lib/raw/context/response.rb +57 -0
- data/lib/raw/context/session.rb +198 -0
- data/lib/raw/context/session/drb.rb +11 -0
- data/lib/raw/context/session/file.rb +15 -0
- data/lib/raw/context/session/memcached.rb +13 -0
- data/lib/raw/context/session/memory.rb +12 -0
- data/lib/raw/context/session/og.rb +15 -0
- data/lib/raw/context/session/pstore.rb +13 -0
- data/lib/raw/control.rb +18 -0
- data/lib/raw/control/attribute.rb +91 -0
- data/lib/raw/control/attribute/checkbox.rb +25 -0
- data/lib/raw/control/attribute/datetime.rb +21 -0
- data/lib/raw/control/attribute/file.rb +20 -0
- data/lib/raw/control/attribute/fixnum.rb +26 -0
- data/lib/raw/control/attribute/float.rb +26 -0
- data/lib/raw/control/attribute/options.rb +38 -0
- data/lib/raw/control/attribute/password.rb +16 -0
- data/lib/raw/control/attribute/text.rb +16 -0
- data/lib/raw/control/attribute/textarea.rb +16 -0
- data/lib/raw/control/none.rb +16 -0
- data/lib/raw/control/relation.rb +59 -0
- data/lib/raw/control/relation/belongs_to.rb +0 -0
- data/lib/raw/control/relation/has_many.rb +97 -0
- data/lib/raw/control/relation/joins_many.rb +0 -0
- data/lib/raw/control/relation/many_to_many.rb +0 -0
- data/lib/raw/control/relation/refers_to.rb +29 -0
- data/lib/raw/controller.rb +37 -0
- data/lib/raw/controller/publishable.rb +160 -0
- data/lib/raw/dispatcher.rb +209 -0
- data/lib/raw/dispatcher/format.rb +108 -0
- data/lib/raw/dispatcher/format/atom.rb +31 -0
- data/lib/raw/dispatcher/format/css.rb +0 -0
- data/lib/raw/dispatcher/format/html.rb +42 -0
- data/lib/raw/dispatcher/format/json.rb +31 -0
- data/lib/raw/dispatcher/format/rss.rb +33 -0
- data/lib/raw/dispatcher/format/xoxo.rb +31 -0
- data/lib/raw/dispatcher/mounter.rb +60 -0
- data/lib/raw/dispatcher/router.rb +111 -0
- data/lib/raw/errors.rb +19 -0
- data/lib/raw/helper.rb +86 -0
- data/lib/raw/helper/benchmark.rb +23 -0
- data/lib/raw/helper/buffer.rb +60 -0
- data/lib/raw/helper/cookie.rb +32 -0
- data/lib/raw/helper/debug.rb +28 -0
- data/lib/raw/helper/default.rb +16 -0
- data/lib/raw/helper/feed.rb +451 -0
- data/lib/raw/helper/form.rb +284 -0
- data/lib/raw/helper/javascript.rb +59 -0
- data/lib/raw/helper/layout.rb +40 -0
- data/lib/raw/helper/navigation.rb +87 -0
- data/lib/raw/helper/pager.rb +305 -0
- data/lib/raw/helper/table.rb +247 -0
- data/lib/raw/helper/xhtml.rb +218 -0
- data/lib/raw/helper/xml.rb +125 -0
- data/lib/raw/mixin/magick.rb +35 -0
- data/lib/raw/mixin/sweeper.rb +71 -0
- data/lib/raw/mixin/thumbnails.rb +1 -0
- data/lib/raw/mixin/webfile.rb +165 -0
- data/lib/raw/render.rb +271 -0
- data/lib/raw/render/builder.rb +26 -0
- data/lib/raw/render/caching.rb +81 -0
- data/lib/raw/render/call.rb +43 -0
- data/lib/raw/render/send_file.rb +46 -0
- data/lib/raw/render/stream.rb +39 -0
- data/lib/raw/scaffold.rb +13 -0
- data/lib/raw/scaffold/controller.rb +25 -0
- data/lib/raw/scaffold/model.rb +157 -0
- data/lib/raw/test.rb +5 -0
- data/lib/raw/test/assertions.rb +169 -0
- data/lib/raw/test/context.rb +55 -0
- data/lib/raw/test/testcase.rb +79 -0
- data/lib/raw/util/attr.rb +128 -0
- data/lib/raw/util/encode_uri.rb +149 -0
- data/lib/raw/util/html_filter.rb +538 -0
- data/lib/raw/util/markup.rb +130 -0
- data/test/glue/tc_webfile.rb +1 -0
- data/test/nitro/CONFIG.rb +3 -0
- data/test/nitro/adapter/raw_post1.bin +9 -0
- data/test/nitro/adapter/tc_webrick.rb +16 -0
- data/test/nitro/cgi/tc_cookie.rb +14 -0
- data/test/nitro/cgi/tc_request.rb +61 -0
- data/test/nitro/compiler/tc_client_morpher.rb +47 -0
- data/test/nitro/compiler/tc_compiler.rb +25 -0
- data/test/nitro/dispatcher/tc_mounter.rb +47 -0
- data/test/nitro/helper/tc_feed.rb +135 -0
- data/test/nitro/helper/tc_navbar.rb +74 -0
- data/test/nitro/helper/tc_pager.rb +35 -0
- data/test/nitro/helper/tc_table.rb +68 -0
- data/test/nitro/helper/tc_xhtml.rb +19 -0
- data/test/nitro/tc_caching.rb +19 -0
- data/test/nitro/tc_cgi.rb +222 -0
- data/test/nitro/tc_context.rb +17 -0
- data/test/nitro/tc_controller.rb +103 -0
- data/test/nitro/tc_controller_aspect.rb +32 -0
- data/test/nitro/tc_controller_params.rb +885 -0
- data/test/nitro/tc_dispatcher.rb +109 -0
- data/test/nitro/tc_element.rb +85 -0
- data/test/nitro/tc_flash.rb +59 -0
- data/test/nitro/tc_helper.rb +47 -0
- data/test/nitro/tc_render.rb +119 -0
- data/test/nitro/tc_router.rb +61 -0
- data/test/nitro/tc_server.rb +35 -0
- data/test/nitro/tc_session.rb +66 -0
- data/test/nitro/tc_template.rb +71 -0
- data/test/nitro/util/tc_encode_url.rb +87 -0
- data/test/nitro/util/tc_markup.rb +31 -0
- data/test/public/blog/another/very_litle/index.xhtml +1 -0
- data/test/public/blog/inc1.xhtml +2 -0
- data/test/public/blog/inc2.xhtml +1 -0
- data/test/public/blog/list.xhtml +9 -0
- data/test/public/dummy_mailer/registration.xhtml +5 -0
- metadata +244 -0
data/doc/CONTRIBUTORS
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
LEAD DEVELOPER:
|
|
2
|
+
|
|
3
|
+
* George K. Moschovitis <george.moschovitis@gmail.com>
|
|
4
|
+
Project leader, architecture and design, main coder,
|
|
5
|
+
documentation, maintainer (http://www.gmosx.com).
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
TEAM NITRO:
|
|
9
|
+
|
|
10
|
+
Team Nitro is group of important contributors to the project.
|
|
11
|
+
|
|
12
|
+
* Jonas Pfenniger <zimba.tm@gmail.com>
|
|
13
|
+
Patches, new features, bug fixes.
|
|
14
|
+
|
|
15
|
+
* Bryan Soto <bryan.a.soto@gmail.com>
|
|
16
|
+
Patches, bug fixes, docs, quality assurance, community
|
|
17
|
+
management.
|
|
18
|
+
|
|
19
|
+
* Guillaume Pierronnet <guillaume.pierronnet@laposte.net>
|
|
20
|
+
Patches, new features, bug fixes.
|
|
21
|
+
|
|
22
|
+
* Thomas Sawyer <transfire@gmail.com>
|
|
23
|
+
Small bug fixes, patches.
|
|
24
|
+
|
|
25
|
+
* Jonathan Buch <jonathan.buch@gmail.net>
|
|
26
|
+
Patches, documentation.
|
|
27
|
+
|
|
28
|
+
* Fabian Buch <fabian@fabian-buch.de>
|
|
29
|
+
FeedHelper, various patches.
|
|
30
|
+
|
|
31
|
+
* Michael Fellinger <m.fellinger@gmail.com>
|
|
32
|
+
Patches, bug fixes.
|
|
33
|
+
|
|
34
|
+
IDEAS, ADDITIONAL CODING, SUPPORT:
|
|
35
|
+
|
|
36
|
+
* Rob Pitt <rob@motionpath.co.uk>
|
|
37
|
+
Patches, Bug fixes, Scaffolding improvements.
|
|
38
|
+
|
|
39
|
+
* Chris Farmiloe <chris.farmiloe@farmiloe.com>
|
|
40
|
+
Patches, new features, bug fixes.
|
|
41
|
+
|
|
42
|
+
* Aidan Rogers <aidan@infurious.com>
|
|
43
|
+
Documentation, Bug reports, patches.
|
|
44
|
+
|
|
45
|
+
* James Britt <james_b@neurogami.com>
|
|
46
|
+
Evangelising, documentation, design, additional code, bug reports.
|
|
47
|
+
|
|
48
|
+
* Aleksi Niemela <Aleksi.Niemela@cs.helsinki.fi>
|
|
49
|
+
Bug fixes, patches, documentation.
|
|
50
|
+
|
|
51
|
+
* Brian Bugh <brian@xsi-design.com>
|
|
52
|
+
Fixes, Patches.
|
|
53
|
+
|
|
54
|
+
* Gabriele Renzi <surrender_it@yahoo.it>
|
|
55
|
+
Patches, new features.
|
|
56
|
+
|
|
57
|
+
* Fang Sun <nusgnaf@gmail.com>
|
|
58
|
+
Patches.
|
|
59
|
+
|
|
60
|
+
* <neokolor@gmx.de>
|
|
61
|
+
Patches.
|
|
62
|
+
|
|
63
|
+
* Zed A. Shaw <zedshaw@zedshaw.com>
|
|
64
|
+
SCGI adapter.
|
|
65
|
+
|
|
66
|
+
* Peter Abrahamsen <rainhead@gmail.com>
|
|
67
|
+
Documentation, small patches.
|
|
68
|
+
|
|
69
|
+
* Massimo Maria Ghisalberti
|
|
70
|
+
Patches.
|
|
71
|
+
|
|
72
|
+
* John A. Lambert
|
|
73
|
+
Patches.
|
|
74
|
+
|
|
75
|
+
* Dan Yoder <dan@zeraweb.com>
|
|
76
|
+
Original 'Elements' implementation, bug reports.
|
|
77
|
+
|
|
78
|
+
* Joshua Hoke
|
|
79
|
+
Patches.
|
|
80
|
+
|
|
81
|
+
* Michael Neumann <mneumann@ntecs.de>
|
|
82
|
+
Wee integration, patches.
|
|
83
|
+
|
|
84
|
+
* Alexander Lazic <al-nitrogen@none.at>
|
|
85
|
+
Patches, bug reports.
|
|
86
|
+
|
|
87
|
+
* Darrick W <darrick@innatesoftware.com>
|
|
88
|
+
Patches.
|
|
89
|
+
|
|
90
|
+
* Anastasios Koutoumanos <ak@navel.gr>
|
|
91
|
+
Ideas, bug reports.
|
|
92
|
+
|
|
93
|
+
* Kostas Nasis <kostas@nasis.com>
|
|
94
|
+
Ideas and bug reports.
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
DONATIONS:
|
|
98
|
+
|
|
99
|
+
The following people have genereously donated money for the
|
|
100
|
+
advancement of the Nitro project:
|
|
101
|
+
|
|
102
|
+
* Jonas Pfenniger <zimba.tm@gmail.com>
|
|
103
|
+
|
|
104
|
+
* Emmanuel Piperakis
|
|
105
|
+
|
|
106
|
+
* Matt Bowen <matt.bowen@farweststeel.com>
|
data/doc/LICENSE
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
The BSD License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2004-2007, George K. Moschovitis. (http://www.gmosx.com)
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
|
7
|
+
modification, are permitted provided that the following conditions are
|
|
8
|
+
met:
|
|
9
|
+
|
|
10
|
+
* Redistributions of source code must retain the above copyright
|
|
11
|
+
notice, this list of conditions and the following disclaimer.
|
|
12
|
+
|
|
13
|
+
* Redistributions in binary form must reproduce the above copyright
|
|
14
|
+
notice, this list of conditions and the following disclaimer in the
|
|
15
|
+
documentation and/or other materials provided with the distribution.
|
|
16
|
+
|
|
17
|
+
* Neither the name of Nitro nor the names of its contributors may be
|
|
18
|
+
used to endorse or promote products derived from this software
|
|
19
|
+
without specific prior written permission.
|
|
20
|
+
|
|
21
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
22
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
23
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
24
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
25
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
26
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
27
|
+
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
28
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
29
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
30
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
31
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
32
|
+
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Coding conventions:
|
|
2
|
+
|
|
3
|
+
* Use two spaces for identation.
|
|
4
|
+
* Try to make the source code lines less than 64 chars wide. This
|
|
5
|
+
improves the visibility. But please, do not go out of the way
|
|
6
|
+
(artificially breaking your code) to enforce this rule.
|
|
7
|
+
* Use "" as delimeter for both static and dynamic strings.
|
|
8
|
+
* Use
|
|
9
|
+
alias :new :old
|
|
10
|
+
instead of
|
|
11
|
+
alias_method :new, :old
|
data/lib/raw.rb
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# = Raw, Rapid Applications for the Web
|
|
2
|
+
#
|
|
3
|
+
# Copyright (c) 2004-2007, George Moschovitis (http://www.gmosx.com)
|
|
4
|
+
#
|
|
5
|
+
# Raw (http://www.nitroproject.org) is copyrighted free software
|
|
6
|
+
# created and maintained by George Moschovitis
|
|
7
|
+
# (mailto:george.moschovitis@gmail.com) and released under the
|
|
8
|
+
# standard BSD Licence. For details consult the file doc/LICENCE.
|
|
9
|
+
|
|
10
|
+
module Raw
|
|
11
|
+
# The version of Raw.
|
|
12
|
+
|
|
13
|
+
Version = "0.50.0"
|
|
14
|
+
|
|
15
|
+
# Library path.
|
|
16
|
+
|
|
17
|
+
LibPath = File.dirname(__FILE__)
|
|
18
|
+
|
|
19
|
+
# The Mixin namespace
|
|
20
|
+
|
|
21
|
+
module Mixin; end
|
|
22
|
+
|
|
23
|
+
# Include the Mixin namespace.
|
|
24
|
+
|
|
25
|
+
include Mixin
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Include Raw::Mixin in the TopLevel for extra convienience.
|
|
29
|
+
|
|
30
|
+
include Raw::Mixin unless $NITRO_DONT_INCLUDE_MIXINS
|
|
31
|
+
|
|
32
|
+
#--
|
|
33
|
+
# gmosx: leave them here.
|
|
34
|
+
#++
|
|
35
|
+
|
|
36
|
+
require "raw/errors"
|
|
37
|
+
require "raw/context"
|
|
38
|
+
require "raw/context/global"
|
|
39
|
+
require "raw/controller"
|
|
40
|
+
require "raw/dispatcher"
|
|
41
|
+
require "raw/render"
|
|
42
|
+
require "raw/scaffold"
|
data/lib/raw/adapter.rb
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
require "cgi"
|
|
2
|
+
require "socket"
|
|
3
|
+
|
|
4
|
+
require "facets/core/string/demodulize"
|
|
5
|
+
require "facets/core/string/underscore"
|
|
6
|
+
require "facets/core/string/humanize"
|
|
7
|
+
|
|
8
|
+
require "raw/cgi"
|
|
9
|
+
|
|
10
|
+
# Speeds things up, more compatible with OSX.
|
|
11
|
+
|
|
12
|
+
Socket.do_not_reverse_lookup = true
|
|
13
|
+
|
|
14
|
+
module Raw
|
|
15
|
+
|
|
16
|
+
# The base Adapter class. All other adapters extend this class.
|
|
17
|
+
# An adapter conceptually connects Nitro with a Front Web Server.
|
|
18
|
+
# Please notice that many Adapters (for example Webrick and
|
|
19
|
+
# Mongrel implement an 'inline' Front Web Server).
|
|
20
|
+
#
|
|
21
|
+
# The Adapter typically initializes a Handler to handle the
|
|
22
|
+
# http requests.
|
|
23
|
+
|
|
24
|
+
class Adapter
|
|
25
|
+
|
|
26
|
+
# Initialize the adapter.
|
|
27
|
+
|
|
28
|
+
def initialize
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Setup the adapter (used as a hook).
|
|
32
|
+
|
|
33
|
+
def setup(app)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Start the adapter.
|
|
37
|
+
|
|
38
|
+
def start(app)
|
|
39
|
+
info "Starting #{self.class.name.demodulize.underscore.humanize} on #{app.address}:#{app.port}"
|
|
40
|
+
info "Press Ctrl-C to shutdown; Run with --help for options."
|
|
41
|
+
|
|
42
|
+
setup(app)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Stop the adapter.
|
|
46
|
+
|
|
47
|
+
def stop
|
|
48
|
+
info "Stoping #{self.class.name.demodulize.underscore.humanize}."
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# This mixin provides default functionality to adapter handlers.
|
|
54
|
+
|
|
55
|
+
module AdapterHandlerMixin
|
|
56
|
+
|
|
57
|
+
# Handle a context. Returns the generated output.
|
|
58
|
+
|
|
59
|
+
def handle_context(context)
|
|
60
|
+
Cgi.parse_params(context)
|
|
61
|
+
Cgi.parse_cookies(context)
|
|
62
|
+
|
|
63
|
+
controller, action, query, params, ext = @application.dispatcher.dispatch_context(context)
|
|
64
|
+
context.content_type = context.format.content_type
|
|
65
|
+
|
|
66
|
+
Thread.current[:CURRENT_CONTROLLER] = controller
|
|
67
|
+
controller = controller.new(context)
|
|
68
|
+
|
|
69
|
+
controller.send(action, params)
|
|
70
|
+
# res.chunked = true if controller.out.is_a?(IO) and context["SERVER_PROTOCOL"] == "HTTP/1.1"
|
|
71
|
+
rescue RenderExit, ActionExit => e1
|
|
72
|
+
# Just stop rendering.
|
|
73
|
+
|
|
74
|
+
rescue ActionError => e2
|
|
75
|
+
# Client Error family of errors, typically send 4XX
|
|
76
|
+
# status code.
|
|
77
|
+
debug e2.to_s if $DBG
|
|
78
|
+
|
|
79
|
+
rescue Object => e3
|
|
80
|
+
# Server Error family of errors, typically send 5XX
|
|
81
|
+
# status code.
|
|
82
|
+
error "Error while handling '#{context.uri}'"
|
|
83
|
+
error pp_exception(e3)
|
|
84
|
+
|
|
85
|
+
ensure
|
|
86
|
+
Og.manager.put_store if defined?(Og) and Og.respond_to?(:manager) and Og.manager
|
|
87
|
+
return context.output_buffer
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Try to rewrite the path to a filename.
|
|
91
|
+
|
|
92
|
+
def rewrite(req)
|
|
93
|
+
if req.path_info == "/"
|
|
94
|
+
req.path_info = "/index.html"
|
|
95
|
+
elsif req.path_info =~ /^([^.]+)$/
|
|
96
|
+
req.path_info = "#{$1}.html"
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Rewrite back to the original path.
|
|
101
|
+
|
|
102
|
+
def unrewrite(req)
|
|
103
|
+
if req.path_info == "/index.html"
|
|
104
|
+
req.path_info = "/"
|
|
105
|
+
elsif req.path_info =~ /^([^.]+)\.html$/
|
|
106
|
+
req.path_info = $1
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require "cgi"
|
|
2
|
+
require "stringio"
|
|
3
|
+
require "tempfile"
|
|
4
|
+
|
|
5
|
+
require "raw/adapter"
|
|
6
|
+
|
|
7
|
+
#--
|
|
8
|
+
# Adapt the default CGI object to suit Nitro.
|
|
9
|
+
#++
|
|
10
|
+
|
|
11
|
+
class CGI # :nodoc: all
|
|
12
|
+
def env
|
|
13
|
+
ENV
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# No multi-threading.
|
|
18
|
+
|
|
19
|
+
Og.thread_safe = false if defined?(Og) and Og.respond_to?(:thread_safe)
|
|
20
|
+
|
|
21
|
+
module Raw
|
|
22
|
+
|
|
23
|
+
# A plain CGI adapter. To be used only in development
|
|
24
|
+
# environments, this adapter is *extremely* slow for
|
|
25
|
+
# live/production environments. This adapter is provided for
|
|
26
|
+
# the sake of completeness.
|
|
27
|
+
|
|
28
|
+
class CgiAdapter
|
|
29
|
+
#--
|
|
30
|
+
# No need for connection pooling, CGI uses process.
|
|
31
|
+
#++
|
|
32
|
+
|
|
33
|
+
def self.start(server)
|
|
34
|
+
cgi = CGI.new
|
|
35
|
+
Router.strip_path = cgi.env["SCRIPT_NAME"]
|
|
36
|
+
Cgi.process(server, cgi, $stdin, $stdout)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require 'cgi'
|
|
2
|
+
require 'fcgi'
|
|
3
|
+
|
|
4
|
+
require "raw/context"
|
|
5
|
+
require "raw/dispatcher"
|
|
6
|
+
require "raw/cgi"
|
|
7
|
+
|
|
8
|
+
# Speeds things up, more comaptible with OSX.
|
|
9
|
+
|
|
10
|
+
Socket.do_not_reverse_lookup = true
|
|
11
|
+
|
|
12
|
+
# No multi-threading.
|
|
13
|
+
|
|
14
|
+
Og.thread_safe = false if defined?(Og) and Og.respond_to?(:thread_safe)
|
|
15
|
+
|
|
16
|
+
module Raw
|
|
17
|
+
|
|
18
|
+
# FastCGI Adaptor. FastCGI is a language independent,
|
|
19
|
+
# scalable, open extension to CGI that provides high
|
|
20
|
+
# performance without the limitations of server
|
|
21
|
+
# specific APIs.
|
|
22
|
+
#
|
|
23
|
+
# === Sessions
|
|
24
|
+
#
|
|
25
|
+
# As FCGI is process based, you have can't use the default
|
|
26
|
+
# in-memory session store. For production web sites you should
|
|
27
|
+
# use the drb session store. Moreover, there is no need for
|
|
28
|
+
# DB connection pooling in Og.
|
|
29
|
+
#
|
|
30
|
+
#--
|
|
31
|
+
# gmosx: I always thought that the concept of FastCGI is stupid!
|
|
32
|
+
# Why don't you use a proxy setup? (For example Apache + Mongrel)
|
|
33
|
+
#++
|
|
34
|
+
|
|
35
|
+
class FastCGI
|
|
36
|
+
|
|
37
|
+
def self.start(server)
|
|
38
|
+
FCGI.each do |cgi|
|
|
39
|
+
begin
|
|
40
|
+
Cgi.process(server, cgi, cgi.in, cgi.out)
|
|
41
|
+
cgi.finish
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
require "stringio"
|
|
2
|
+
|
|
3
|
+
require "mongrel"
|
|
4
|
+
require "mongrel/handlers"
|
|
5
|
+
|
|
6
|
+
require "raw/adapter"
|
|
7
|
+
|
|
8
|
+
#--
|
|
9
|
+
# Customize Mongrel to make compatible with Nitro.
|
|
10
|
+
#++
|
|
11
|
+
|
|
12
|
+
module Mongrel # :nodoc: all
|
|
13
|
+
|
|
14
|
+
class HttpRequest
|
|
15
|
+
def method_missing(name, *args)
|
|
16
|
+
if @params.has_key?(name.to_s.upcase)
|
|
17
|
+
return @params[name.to_s.upcase]
|
|
18
|
+
elsif name.to_s =~ /\A(.*)=\Z/ && @params.has_key?($1.upcase)
|
|
19
|
+
@params[$1.upcase] = args[0]
|
|
20
|
+
else
|
|
21
|
+
super
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module Raw
|
|
29
|
+
|
|
30
|
+
# A Mongrel Adapter.
|
|
31
|
+
#
|
|
32
|
+
# Mongrel is a fast HTTP library and server for Ruby that is
|
|
33
|
+
# intended for hosting Ruby web applications of any kind using
|
|
34
|
+
# plain HTTP rather than FastCGI or SCGI.
|
|
35
|
+
#
|
|
36
|
+
# This is the preferred adapter for production Nitro
|
|
37
|
+
# applications.
|
|
38
|
+
|
|
39
|
+
class MongrelAdapter < Adapter
|
|
40
|
+
|
|
41
|
+
def start(application)
|
|
42
|
+
super
|
|
43
|
+
|
|
44
|
+
@mongrel = Mongrel::Configurator.new(:host => application.address) do
|
|
45
|
+
listener(:port => application.port) do
|
|
46
|
+
uri "/", :handler => MongrelHandler.new(application)
|
|
47
|
+
trap("INT") { stop(application) }
|
|
48
|
+
run
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
@mongrel.join()
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def stop
|
|
56
|
+
super
|
|
57
|
+
@mongrel.stop()
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# The Mongrel Handler, handles an HTTP request.
|
|
63
|
+
|
|
64
|
+
class MongrelHandler < Mongrel::HttpHandler
|
|
65
|
+
include AdapterHandlerMixin
|
|
66
|
+
|
|
67
|
+
def initialize(application)
|
|
68
|
+
@application = application
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Handle a static file. Also handles cached pages. Typically
|
|
72
|
+
# *not* used in production applications.
|
|
73
|
+
|
|
74
|
+
def handle_file(req, res)
|
|
75
|
+
return false unless @application.handle_static_files
|
|
76
|
+
|
|
77
|
+
filename = File.join(@application.public_dir, req.path_info).squeeze("/")
|
|
78
|
+
|
|
79
|
+
File.open(filename, "rb") do |f|
|
|
80
|
+
# TODO: check whether path circumvents public_root directory?
|
|
81
|
+
res.status = 200
|
|
82
|
+
res.body << f.read # XXX inefficient for large files, may cause leaks
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
return true
|
|
86
|
+
rescue Errno::ENOENT => ex # TODO: Lookup Win32 error for 'file missing'
|
|
87
|
+
return false
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Handle the request.
|
|
91
|
+
#--
|
|
92
|
+
# TODO: recode this like the camping mongrel handler.
|
|
93
|
+
#++
|
|
94
|
+
|
|
95
|
+
def process(req, res)
|
|
96
|
+
# Perform default rewriting rules.
|
|
97
|
+
|
|
98
|
+
rewrite(req)
|
|
99
|
+
|
|
100
|
+
# First, try to serve a static file from disk.
|
|
101
|
+
|
|
102
|
+
return if handle_file(req, res)
|
|
103
|
+
|
|
104
|
+
context = Context.new(@application)
|
|
105
|
+
|
|
106
|
+
if req.body.is_a? String
|
|
107
|
+
context.in = StringIO.new(req.body)
|
|
108
|
+
else
|
|
109
|
+
context.in = req.body
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
context.headers = {}
|
|
113
|
+
req.params.each { |h, v|
|
|
114
|
+
if h =~ /\AHTTP_(.*)\Z/
|
|
115
|
+
context.headers[$1.gsub("_", "-")] = v
|
|
116
|
+
end
|
|
117
|
+
context.headers[h] = v
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
# hackfix: make it behave like webrick and fcgi
|
|
121
|
+
context.headers["REQUEST_URI"] << "?#{context.headers['QUERY_STRING']}" if context.headers["QUERY_STRING"]
|
|
122
|
+
context.headers["QUERY_STRING"] ||= ""
|
|
123
|
+
|
|
124
|
+
output = handle_context(context)
|
|
125
|
+
|
|
126
|
+
# THINK: what is the error code if a request without a handler
|
|
127
|
+
# is comming?!
|
|
128
|
+
|
|
129
|
+
res.start(context.status, true) do |head, out|
|
|
130
|
+
context.response_headers.each do |key, value|
|
|
131
|
+
head[key] = value
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
context.response_cookies.each do |cookie|
|
|
135
|
+
head["Set-Cookie"] = cookie
|
|
136
|
+
end if context.response_cookies
|
|
137
|
+
|
|
138
|
+
out.write(output)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
context.close
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|