Set up one or more new Arrow::Dispatcher objects. The configspec argument can either be the path to a config file, or a hash of config files. See the .instance method for more about how to use this method.
# File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 127 127: def self::create( configspec ) 128: 129: # Normalize configurations. Expected either a configfile path in a 130: # String, or a Hash of configfiles 131: case configspec 132: when String 133: configs = { :__default__ => configspec } 134: when Hash 135: configs = configspec 136: else 137: raise ArgumentError, "Invalid config hash %p" % [configspec] 138: end 139: 140: # Create the dispatchers and return the first one to support the 141: # old-style create, i.e., 142: # dispatcher = Arrow::Dispatcher.create( configfile ) 143: @@Instance = create_configured_dispatchers( configs ) 144: @@Instance.values.first 145: rescue ::Exception => err 146: 147: # Try to log fatal errors to both the Apache server log and a crashfile 148: # before passing the exception along. 149: errmsg = "%s failed to start (%s): %s: %s" % [ 150: self.name, 151: err.class.name, 152: err.message, 153: err.backtrace.join("\n ") 154: ] 155: 156: logfile = File.join( Dir.tmpdir, "arrow-fatal.log.#{$$}" ) 157: File.open( logfile, IO::WRONLY|IO::TRUNC|IO::CREAT ) {|ofh| 158: ofh.puts( errmsg ) 159: ofh.flush 160: } 161: 162: if defined?( Apache ) 163: Apache.request.server.log_crit( errmsg ) 164: end 165: 166: Kernel.raise( err ) 167: end
Create dispatchers for the config files given in configspec and return them in a Hash keyed by both the configname key and the expanded path to the configuration file.
# File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 198 198: def self::create_configured_dispatchers( configspec ) 199: instances = {} 200: 201: # Load a dispatcher for each config 202: configspec.each do |key, configfile| 203: 204: # Normalize the path to the config file and make sure it's not 205: # loaded yet. If it is, link it to the current key and skip to the 206: # next. 207: configfile = File.expand_path( configfile ) 208: if instances.key?( configfile ) 209: instances[ key ] = instances[ configfile ] 210: next 211: end 212: 213: # If a config file is given, load it. If it's not, just use the 214: # default config. 215: if configfile 216: config = Arrow::Config.load( configfile ) 217: else 218: config = Arrow::Config.new 219: end 220: 221: # Create a dispatcher and put it in the table by both its key and 222: # the normalized path to its configfile. 223: instances[ key ] = instances[ configfile ] = new( key, config ) 224: end 225: 226: return instances 227: end
Create one or more dispatchers from the specified hosts_file, which is a YAML file that maps arrow configurations onto a symbol that can be used to refer to it.
# File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 173 173: def self::create_from_hosts_file( hosts_file ) 174: configs = nil 175: 176: if hosts_file.respond_to?( :read ) 177: configs = YAML.load( hosts_file.read ) 178: else 179: hosts_file.untaint 180: configs = YAML.load_file( hosts_file ) 181: end 182: 183: # Convert the keys to Symbols and the values to untainted Strings. 184: configs.each do |key,config| 185: sym = key.to_s.dup.untaint.to_sym 186: configs[ sym ] = configs.delete( key ) 187: configs[ sym ].untaint 188: end 189: 190: @@Instance = self.create_configured_dispatchers( configs ) 191: return @@Instance 192: end
Get the instance of the Dispatcher set up under the given key, which can either be a Symbol or a String containing the path to a configfile. If no key is given, it defaults to :default, which is the key assigned when .create is given just a configfile argument.
# File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 103 103: def self::instance( key=:__default__ ) 104: rval = nil 105: 106: # Fetch the instance which corresponds to the given key 107: if key.is_a?( Symbol ) 108: Arrow::Logger.debug "Returning instance for key %p (one of %p): %p" % 109: [key, @@Instance.keys, @@Instance[key]] 110: rval = @@Instance[ key ] 111: else 112: Arrow::Logger.debug "Returning instance for configfile %p" % [key] 113: configfile = File.expand_path( key ) 114: self.create( configfile ) 115: rval = @@Instance[ configfile ] 116: end 117: 118: # Return either a configured Dispatcher instance or a FallbackHandler if 119: # no Dispatcher corresponds to the given key. 120: return rval || Arrow::FallbackHandler.new( key, @@Instance ) 121: end
Set up an Arrow::Dispatcher object based on the specified config (an Arrow::Config object).
# File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 236 236: def initialize( name, config ) 237: @name = name 238: @config = config 239: @broker = Arrow::Broker.new( config ) 240: 241: self.configure( config ) 242: rescue ::Exception => err 243: msg = "%s while creating dispatcher: %s\n%s" % 244: [ err.class.name, err.message, err.backtrace.join("\n\t") ] 245: self.log.error( msg ) 246: msg.gsub!( /%/, '%%' ) 247: Apache.request.server.log_crit( msg ) unless !defined?( Apache ) 248: end
Child init mod_ruby handler
# File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 275 275: def child_init( req ) # :nodoc 276: self.log.notice "Dispatcher configured for %s" % [ req.server.hostname ] 277: return Apache::OK 278: end
(Re)configure the dispatcher based on the values in the given config (an Arrow::Config object).
# File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 261 261: def configure( config ) 262: 263: self.log.notice "Configuring a dispatcher for '%s' from '%s': child server %d" % 264: [ Apache.request.server.hostname, config.name, Process.pid ] 265: 266: # Configure any modules that have mixed in Arrow::Configurable 267: Arrow::Configurable.configure_modules( config, self ) 268: 269: end
The content handler method. Dispatches requests to registered applets based on the requests PATH_INFO.
# File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 283 283: def handler( req ) 284: self.log.info "--- Dispatching request %p ---------------" % [req] 285: self.log.debug "Request headers are: %s" % [untable(req.headers_in)] 286: 287: if (( reason = @config.changed_reason )) 288: self.log.notice "** Reloading configuration: #{reason} ***" 289: @config.reload 290: @broker = Arrow::Broker.new( @config ) 291: self.configure( @config ) 292: end 293: 294: if ! @broker 295: self.log.error "Fatal: No broker." 296: return Apache::SERVER_ERROR 297: end 298: 299: txn = Arrow::Transaction.new( req, @config, @broker ) 300: 301: self.log.debug "Delegating transaction %p" % [txn] 302: unless output = @broker.delegate( txn ) 303: self.log.info "Declining transaction (Applets returned: %p)" % output 304: return Apache::DECLINED 305: end 306: 307: # If the transaction succeeded, set up the Apache::Request object, add 308: # headers, add session state, etc. If it failed, log the failure and let 309: # the status be returned as-is. 310: response_body = nil 311: self.log.debug "Transaction has status %d" % [txn.status] 312: 313: # Render the output before anything else, as there might be 314: # session/header manipulation left to be done somewhere in the 315: # render. If the response is true, the applets have handled output 316: # themselves. 317: if output && output != true 318: rendertime = Benchmark.measure do 319: response_body = output.to_s 320: end 321: self.log.debug "Output render time: %s" % 322: rendertime.format( '%8.4us usr %8.4ys sys %8.4ts wall %8.4r' ) 323: req.headers_out['content-length'] = response_body.length.to_s unless 324: req.headers_out['content-length'] 325: end 326: 327: # If the transaction has a session, save it 328: txn.session.save if txn.session? 329: 330: # Add cookies to the response headers 331: txn.add_cookie_headers 332: 333: self.log.debug "HTTP response status is: %d" % [txn.status] 334: self.log.debug "Response headers were: %s" % [untable(req.headers_out)] 335: txn.send_http_header 336: txn.print( response_body ) if response_body 337: 338: self.log.info "--- Done with request %p (%s)---------------" % 339: [ req, req.status_line ] 340: 341: req.sync = true 342: return txn.handler_status 343: rescue ::Exception => err 344: self.log.error "Dispatcher caught an unhandled %s: %s:\n\t%s" % 345: [ err.class.name, err.message, err.backtrace.join("\n\t") ] 346: return Apache::SERVER_ERROR 347: 348: ensure 349: # Make sure session locks are released 350: txn.session.finish if txn && txn.session? 351: end
Return a human-readable representation of the receiver as a String.
# File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 355 355: def inspect 356: return "#<%s:0x%x config: %s>" % [ 357: self.class.name, 358: self.object_id, 359: @config.name, 360: ] 361: end
--- SEC00047
--- ""
--- - name: name rw: R a_desc: |+ The key used to indentify this dispatcher
--- - methods: - visibility: public aref: M000435 name: create sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 127</span>\n\ 127: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">create</span>( <span class=\"ruby-identifier\">configspec</span> )\n\ 128: \n\ 129: <span class=\"ruby-comment cmt\"># Normalize configurations. Expected either a configfile path in a</span>\n\ 130: <span class=\"ruby-comment cmt\"># String, or a Hash of configfiles</span>\n\ 131: <span class=\"ruby-keyword kw\">case</span> <span class=\"ruby-identifier\">configspec</span>\n\ 132: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">String</span>\n\ 133: <span class=\"ruby-identifier\">configs</span> = { <span class=\"ruby-identifier\">:__default__</span> =<span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">configspec</span> }\n\ 134: <span class=\"ruby-keyword kw\">when</span> <span class=\"ruby-constant\">Hash</span>\n\ 135: <span class=\"ruby-identifier\">configs</span> = <span class=\"ruby-identifier\">configspec</span>\n\ 136: <span class=\"ruby-keyword kw\">else</span>\n\ 137: <span class=\"ruby-identifier\">raise</span> <span class=\"ruby-constant\">ArgumentError</span>, <span class=\"ruby-value str\">"Invalid config hash %p"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">configspec</span>]\n\ 138: <span class=\"ruby-keyword kw\">end</span>\n\ 139: \n\ 140: <span class=\"ruby-comment cmt\"># Create the dispatchers and return the first one to support the</span>\n\ 141: <span class=\"ruby-comment cmt\"># old-style create, i.e.,</span>\n\ 142: <span class=\"ruby-comment cmt\"># dispatcher = Arrow::Dispatcher.create( configfile )</span>\n\ 143: <span class=\"ruby-ivar\">@@Instance</span> = <span class=\"ruby-identifier\">create_configured_dispatchers</span>( <span class=\"ruby-identifier\">configs</span> )\n\ 144: <span class=\"ruby-ivar\">@@Instance</span>.<span class=\"ruby-identifier\">values</span>.<span class=\"ruby-identifier\">first</span>\n\ 145: <span class=\"ruby-keyword kw\">rescue</span> <span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Exception</span> =<span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">err</span>\n\ 146: \n\ 147: <span class=\"ruby-comment cmt\"># Try to log fatal errors to both the Apache server log and a crashfile</span>\n\ 148: <span class=\"ruby-comment cmt\"># before passing the exception along.</span>\n\ 149: <span class=\"ruby-identifier\">errmsg</span> = <span class=\"ruby-value str\">"%s failed to start (%s): %s: %s"</span> <span class=\"ruby-operator\">%</span> [\n\ 150: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">name</span>,\n\ 151: <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">name</span>,\n\ 152: <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span>,\n\ 153: <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">"\\n "</span>)\n\ 154: ]\n\ 155: \n\ 156: <span class=\"ruby-identifier\">logfile</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-constant\">Dir</span>.<span class=\"ruby-identifier\">tmpdir</span>, <span class=\"ruby-node\">"arrow-fatal.log.#{$$}"</span> )\n\ 157: <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">open</span>( <span class=\"ruby-identifier\">logfile</span>, <span class=\"ruby-constant\">IO</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">WRONLY</span><span class=\"ruby-operator\">|</span><span class=\"ruby-constant\">IO</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">TRUNC</span><span class=\"ruby-operator\">|</span><span class=\"ruby-constant\">IO</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">CREAT</span> ) {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">ofh</span><span class=\"ruby-operator\">|</span>\n\ 158: <span class=\"ruby-identifier\">ofh</span>.<span class=\"ruby-identifier\">puts</span>( <span class=\"ruby-identifier\">errmsg</span> )\n\ 159: <span class=\"ruby-identifier\">ofh</span>.<span class=\"ruby-identifier\">flush</span>\n\ 160: }\n\ 161: \n\ 162: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">defined?</span>( <span class=\"ruby-constant\">Apache</span> )\n\ 163: <span class=\"ruby-constant\">Apache</span>.<span class=\"ruby-identifier\">request</span>.<span class=\"ruby-identifier\">server</span>.<span class=\"ruby-identifier\">log_crit</span>( <span class=\"ruby-identifier\">errmsg</span> )\n\ 164: <span class=\"ruby-keyword kw\">end</span>\n\ 165: \n\ 166: <span class=\"ruby-constant\">Kernel</span>.<span class=\"ruby-identifier\">raise</span>( <span class=\"ruby-identifier\">err</span> )\n\ 167: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set up one or more <a href="Dispatcher.html#M000438">new</a> <a href="Dispatcher.html">Arrow::Dispatcher</a> objects. The <tt>configspec</tt> argument can either be the path to a config file, or a hash of config files. See the .<a href="Dispatcher.html#M000434">instance</a> method for more about how to use this method. </p> params: ( configspec ) - visibility: public aref: M000437 name: create_configured_dispatchers sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 198</span>\n\ 198: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">create_configured_dispatchers</span>( <span class=\"ruby-identifier\">configspec</span> )\n\ 199: <span class=\"ruby-identifier\">instances</span> = {}\n\ 200: \n\ 201: <span class=\"ruby-comment cmt\"># Load a dispatcher for each config</span>\n\ 202: <span class=\"ruby-identifier\">configspec</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">key</span>, <span class=\"ruby-identifier\">configfile</span><span class=\"ruby-operator\">|</span>\n\ 203: \n\ 204: <span class=\"ruby-comment cmt\"># Normalize the path to the config file and make sure it's not</span>\n\ 205: <span class=\"ruby-comment cmt\"># loaded yet. If it is, link it to the current key and skip to the</span>\n\ 206: <span class=\"ruby-comment cmt\"># next.</span>\n\ 207: <span class=\"ruby-identifier\">configfile</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">expand_path</span>( <span class=\"ruby-identifier\">configfile</span> )\n\ 208: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">instances</span>.<span class=\"ruby-identifier\">key?</span>( <span class=\"ruby-identifier\">configfile</span> )\n\ 209: <span class=\"ruby-identifier\">instances</span>[ <span class=\"ruby-identifier\">key</span> ] = <span class=\"ruby-identifier\">instances</span>[ <span class=\"ruby-identifier\">configfile</span> ]\n\ 210: <span class=\"ruby-keyword kw\">next</span>\n\ 211: <span class=\"ruby-keyword kw\">end</span>\n\ 212: \n\ 213: <span class=\"ruby-comment cmt\"># If a config file is given, load it. If it's not, just use the</span>\n\ 214: <span class=\"ruby-comment cmt\"># default config.</span>\n\ 215: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">configfile</span>\n\ 216: <span class=\"ruby-identifier\">config</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Config</span>.<span class=\"ruby-identifier\">load</span>( <span class=\"ruby-identifier\">configfile</span> )\n\ 217: <span class=\"ruby-keyword kw\">else</span>\n\ 218: <span class=\"ruby-identifier\">config</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Config</span>.<span class=\"ruby-identifier\">new</span>\n\ 219: <span class=\"ruby-keyword kw\">end</span>\n\ 220: \n\ 221: <span class=\"ruby-comment cmt\"># Create a dispatcher and put it in the table by both its key and</span>\n\ 222: <span class=\"ruby-comment cmt\"># the normalized path to its configfile.</span>\n\ 223: <span class=\"ruby-identifier\">instances</span>[ <span class=\"ruby-identifier\">key</span> ] = <span class=\"ruby-identifier\">instances</span>[ <span class=\"ruby-identifier\">configfile</span> ] = <span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">key</span>, <span class=\"ruby-identifier\">config</span> )\n\ 224: <span class=\"ruby-keyword kw\">end</span>\n\ 225: \n\ 226: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">instances</span>\n\ 227: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Create dispatchers for the config files given in <tt>configspec</tt> and return them in a Hash keyed by both the configname key and the expanded path to the configuration file. </p> params: ( configspec ) - visibility: public aref: M000436 name: create_from_hosts_file sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 173</span>\n\ 173: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">create_from_hosts_file</span>( <span class=\"ruby-identifier\">hosts_file</span> )\n\ 174: <span class=\"ruby-identifier\">configs</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 175: \n\ 176: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">hosts_file</span>.<span class=\"ruby-identifier\">respond_to?</span>( <span class=\"ruby-identifier\">:read</span> )\n\ 177: <span class=\"ruby-identifier\">configs</span> = <span class=\"ruby-constant\">YAML</span>.<span class=\"ruby-identifier\">load</span>( <span class=\"ruby-identifier\">hosts_file</span>.<span class=\"ruby-identifier\">read</span> ) \n\ 178: <span class=\"ruby-keyword kw\">else</span>\n\ 179: <span class=\"ruby-identifier\">hosts_file</span>.<span class=\"ruby-identifier\">untaint</span>\n\ 180: <span class=\"ruby-identifier\">configs</span> = <span class=\"ruby-constant\">YAML</span>.<span class=\"ruby-identifier\">load_file</span>( <span class=\"ruby-identifier\">hosts_file</span> )\n\ 181: <span class=\"ruby-keyword kw\">end</span>\n\ 182: \n\ 183: <span class=\"ruby-comment cmt\"># Convert the keys to Symbols and the values to untainted Strings.</span>\n\ 184: <span class=\"ruby-identifier\">configs</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">key</span>,<span class=\"ruby-identifier\">config</span><span class=\"ruby-operator\">|</span>\n\ 185: <span class=\"ruby-identifier\">sym</span> = <span class=\"ruby-identifier\">key</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">dup</span>.<span class=\"ruby-identifier\">untaint</span>.<span class=\"ruby-identifier\">to_sym</span>\n\ 186: <span class=\"ruby-identifier\">configs</span>[ <span class=\"ruby-identifier\">sym</span> ] = <span class=\"ruby-identifier\">configs</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">key</span> )\n\ 187: <span class=\"ruby-identifier\">configs</span>[ <span class=\"ruby-identifier\">sym</span> ].<span class=\"ruby-identifier\">untaint</span>\n\ 188: <span class=\"ruby-keyword kw\">end</span>\n\ 189: \n\ 190: <span class=\"ruby-ivar\">@@Instance</span> = <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">create_configured_dispatchers</span>( <span class=\"ruby-identifier\">configs</span> )\n\ 191: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-ivar\">@@Instance</span>\n\ 192: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Create one or more dispatchers from the specified <tt>hosts_file</tt>, which is a YAML file that maps arrow configurations onto a symbol that can be used to refer to it. </p> params: ( hosts_file ) - visibility: public aref: M000434 name: instance sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 103</span>\n\ 103: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-keyword kw\">self</span><span class=\"ruby-operator\">::</span><span class=\"ruby-identifier\">instance</span>( <span class=\"ruby-identifier\">key</span>=<span class=\"ruby-identifier\">:__default__</span> )\n\ 104: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 105: \n\ 106: <span class=\"ruby-comment cmt\"># Fetch the instance which corresponds to the given key</span>\n\ 107: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">key</span>.<span class=\"ruby-identifier\">is_a?</span>( <span class=\"ruby-constant\">Symbol</span> )\n\ 108: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Returning instance for key %p (one of %p): %p"</span> <span class=\"ruby-operator\">%</span>\n\ 109: [<span class=\"ruby-identifier\">key</span>, <span class=\"ruby-ivar\">@@Instance</span>.<span class=\"ruby-identifier\">keys</span>, <span class=\"ruby-ivar\">@@Instance</span>[<span class=\"ruby-identifier\">key</span>]]\n\ 110: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-ivar\">@@Instance</span>[ <span class=\"ruby-identifier\">key</span> ]\n\ 111: <span class=\"ruby-keyword kw\">else</span>\n\ 112: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Returning instance for configfile %p"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">key</span>]\n\ 113: <span class=\"ruby-identifier\">configfile</span> = <span class=\"ruby-constant\">File</span>.<span class=\"ruby-identifier\">expand_path</span>( <span class=\"ruby-identifier\">key</span> )\n\ 114: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">create</span>( <span class=\"ruby-identifier\">configfile</span> )\n\ 115: <span class=\"ruby-identifier\">rval</span> = <span class=\"ruby-ivar\">@@Instance</span>[ <span class=\"ruby-identifier\">configfile</span> ]\n\ 116: <span class=\"ruby-keyword kw\">end</span>\n\ 117: \n\ 118: <span class=\"ruby-comment cmt\"># Return either a configured Dispatcher instance or a FallbackHandler if</span>\n\ 119: <span class=\"ruby-comment cmt\"># no Dispatcher corresponds to the given key.</span>\n\ 120: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">rval</span> <span class=\"ruby-operator\">||</span> <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">FallbackHandler</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">key</span>, <span class=\"ruby-ivar\">@@Instance</span> )\n\ 121: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Get the <a href="Dispatcher.html#M000434">instance</a> of the <a href="Dispatcher.html">Dispatcher</a> set up under the given <tt>key</tt>, which can either be a Symbol or a String containing the path to a configfile. If no key is given, it defaults to :<em>default</em>, which is the key assigned when .<a href="Dispatcher.html#M000435">create</a> is given just a configfile argument. </p> params: ( key=:__default__ ) - visibility: public aref: M000438 name: new sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 236</span>\n\ 236: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">config</span> )\n\ 237: <span class=\"ruby-ivar\">@name</span> = <span class=\"ruby-identifier\">name</span>\n\ 238: <span class=\"ruby-ivar\">@config</span> = <span class=\"ruby-identifier\">config</span>\n\ 239: <span class=\"ruby-ivar\">@broker</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Broker</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">config</span> )\n\ 240: \n\ 241: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">configure</span>( <span class=\"ruby-identifier\">config</span> )\n\ 242: <span class=\"ruby-keyword kw\">rescue</span> <span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Exception</span> =<span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">err</span>\n\ 243: <span class=\"ruby-identifier\">msg</span> = <span class=\"ruby-value str\">"%s while creating dispatcher: %s\\n%s"</span> <span class=\"ruby-operator\">%</span>\n\ 244: [ <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">"\\n\\t"</span>) ]\n\ 245: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span>( <span class=\"ruby-identifier\">msg</span> )\n\ 246: <span class=\"ruby-identifier\">msg</span>.<span class=\"ruby-identifier\">gsub!</span>( <span class=\"ruby-regexp re\">/%/</span>, <span class=\"ruby-value str\">'%%'</span> )\n\ 247: <span class=\"ruby-constant\">Apache</span>.<span class=\"ruby-identifier\">request</span>.<span class=\"ruby-identifier\">server</span>.<span class=\"ruby-identifier\">log_crit</span>( <span class=\"ruby-identifier\">msg</span> ) <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-operator\">!</span><span class=\"ruby-keyword kw\">defined?</span>( <span class=\"ruby-constant\">Apache</span> )\n\ 248: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Set up an <a href="Dispatcher.html">Arrow::Dispatcher</a> object based on the specified <tt>config</tt> (an <a href="Config.html">Arrow::Config</a> object). </p> params: ( name, config ) category: Class type: Public - methods: - visibility: public aref: M000440 name: child_init sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 275</span>\n\ 275: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">child_init</span>( <span class=\"ruby-identifier\">req</span> ) <span class=\"ruby-comment cmt\"># :nodoc</span>\n\ 276: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">notice</span> <span class=\"ruby-value str\">"Dispatcher configured for %s"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">req</span>.<span class=\"ruby-identifier\">server</span>.<span class=\"ruby-identifier\">hostname</span> ]\n\ 277: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-constant\">Apache</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">OK</span>\n\ 278: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Child init mod_ruby <a href="Dispatcher.html#M000441">handler</a> </p> params: ( req ) - visibility: public aref: M000439 name: configure sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 261</span>\n\ 261: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">configure</span>( <span class=\"ruby-identifier\">config</span> )\n\ 262: \n\ 263: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">notice</span> <span class=\"ruby-value str\">"Configuring a dispatcher for '%s' from '%s': child server %d"</span> <span class=\"ruby-operator\">%</span>\n\ 264: [ <span class=\"ruby-constant\">Apache</span>.<span class=\"ruby-identifier\">request</span>.<span class=\"ruby-identifier\">server</span>.<span class=\"ruby-identifier\">hostname</span>, <span class=\"ruby-identifier\">config</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-constant\">Process</span>.<span class=\"ruby-identifier\">pid</span> ]\n\ 265: \n\ 266: <span class=\"ruby-comment cmt\"># Configure any modules that have mixed in Arrow::Configurable</span>\n\ 267: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Configurable</span>.<span class=\"ruby-identifier\">configure_modules</span>( <span class=\"ruby-identifier\">config</span>, <span class=\"ruby-keyword kw\">self</span> )\n\ 268: \n\ 269: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> (Re)<a href="Dispatcher.html#M000439">configure</a> the dispatcher based on the values in the given <tt>config</tt> (an <a href="Config.html">Arrow::Config</a> object). </p> params: ( config ) - visibility: public aref: M000441 name: handler sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 283</span>\n\ 283: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">handler</span>( <span class=\"ruby-identifier\">req</span> )\n\ 284: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">"--- Dispatching request %p ---------------"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">req</span>]\n\ 285: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Request headers are: %s"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">untable</span>(<span class=\"ruby-identifier\">req</span>.<span class=\"ruby-identifier\">headers_in</span>)]\n\ 286: \n\ 287: <span class=\"ruby-keyword kw\">if</span> (( <span class=\"ruby-identifier\">reason</span> = <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">changed_reason</span> ))\n\ 288: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">notice</span> <span class=\"ruby-node\">"** Reloading configuration: #{reason} ***"</span>\n\ 289: <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">reload</span>\n\ 290: <span class=\"ruby-ivar\">@broker</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Broker</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-ivar\">@config</span> )\n\ 291: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">configure</span>( <span class=\"ruby-ivar\">@config</span> )\n\ 292: <span class=\"ruby-keyword kw\">end</span>\n\ 293: \n\ 294: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-operator\">!</span> <span class=\"ruby-ivar\">@broker</span>\n\ 295: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span> <span class=\"ruby-value str\">"Fatal: No broker."</span>\n\ 296: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-constant\">Apache</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">SERVER_ERROR</span>\n\ 297: <span class=\"ruby-keyword kw\">end</span>\n\ 298: \n\ 299: <span class=\"ruby-identifier\">txn</span> = <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Transaction</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">req</span>, <span class=\"ruby-ivar\">@config</span>, <span class=\"ruby-ivar\">@broker</span> )\n\ 300: \n\ 301: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Delegating transaction %p"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">txn</span>]\n\ 302: <span class=\"ruby-keyword kw\">unless</span> <span class=\"ruby-identifier\">output</span> = <span class=\"ruby-ivar\">@broker</span>.<span class=\"ruby-identifier\">delegate</span>( <span class=\"ruby-identifier\">txn</span> )\n\ 303: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">"Declining transaction (Applets returned: %p)"</span> <span class=\"ruby-operator\">%</span> <span class=\"ruby-identifier\">output</span>\n\ 304: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-constant\">Apache</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">DECLINED</span>\n\ 305: <span class=\"ruby-keyword kw\">end</span>\n\ 306: \n\ 307: <span class=\"ruby-comment cmt\"># If the transaction succeeded, set up the Apache::Request object, add</span>\n\ 308: <span class=\"ruby-comment cmt\"># headers, add session state, etc. If it failed, log the failure and let</span>\n\ 309: <span class=\"ruby-comment cmt\"># the status be returned as-is.</span>\n\ 310: <span class=\"ruby-identifier\">response_body</span> = <span class=\"ruby-keyword kw\">nil</span>\n\ 311: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Transaction has status %d"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">status</span>]\n\ 312: \n\ 313: <span class=\"ruby-comment cmt\"># Render the output before anything else, as there might be</span>\n\ 314: <span class=\"ruby-comment cmt\"># session/header manipulation left to be done somewhere in the</span>\n\ 315: <span class=\"ruby-comment cmt\"># render. If the response is true, the applets have handled output</span>\n\ 316: <span class=\"ruby-comment cmt\"># themselves.</span>\n\ 317: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">output</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-identifier\">output</span> <span class=\"ruby-operator\">!=</span> <span class=\"ruby-keyword kw\">true</span>\n\ 318: <span class=\"ruby-identifier\">rendertime</span> = <span class=\"ruby-constant\">Benchmark</span>.<span class=\"ruby-identifier\">measure</span> <span class=\"ruby-keyword kw\">do</span>\n\ 319: <span class=\"ruby-identifier\">response_body</span> = <span class=\"ruby-identifier\">output</span>.<span class=\"ruby-identifier\">to_s</span>\n\ 320: <span class=\"ruby-keyword kw\">end</span>\n\ 321: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Output render time: %s"</span> <span class=\"ruby-operator\">%</span>\n\ 322: <span class=\"ruby-identifier\">rendertime</span>.<span class=\"ruby-identifier\">format</span>( <span class=\"ruby-value str\">'%8.4us usr %8.4ys sys %8.4ts wall %8.4r'</span> )\n\ 323: <span class=\"ruby-identifier\">req</span>.<span class=\"ruby-identifier\">headers_out</span>[<span class=\"ruby-value str\">'content-length'</span>] = <span class=\"ruby-identifier\">response_body</span>.<span class=\"ruby-identifier\">length</span>.<span class=\"ruby-identifier\">to_s</span> <span class=\"ruby-keyword kw\">unless</span>\n\ 324: <span class=\"ruby-identifier\">req</span>.<span class=\"ruby-identifier\">headers_out</span>[<span class=\"ruby-value str\">'content-length'</span>]\n\ 325: <span class=\"ruby-keyword kw\">end</span>\n\ 326: \n\ 327: <span class=\"ruby-comment cmt\"># If the transaction has a session, save it</span>\n\ 328: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">session</span>.<span class=\"ruby-identifier\">save</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">session?</span>\n\ 329: \n\ 330: <span class=\"ruby-comment cmt\"># Add cookies to the response headers</span>\n\ 331: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">add_cookie_headers</span>\n\ 332: \n\ 333: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"HTTP response status is: %d"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">status</span>]\n\ 334: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"Response headers were: %s"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">untable</span>(<span class=\"ruby-identifier\">req</span>.<span class=\"ruby-identifier\">headers_out</span>)]\n\ 335: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">send_http_header</span>\n\ 336: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">print</span>( <span class=\"ruby-identifier\">response_body</span> ) <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">response_body</span>\n\ 337: \n\ 338: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">info</span> <span class=\"ruby-value str\">"--- Done with request %p (%s)---------------"</span> <span class=\"ruby-operator\">%</span> \n\ 339: [ <span class=\"ruby-identifier\">req</span>, <span class=\"ruby-identifier\">req</span>.<span class=\"ruby-identifier\">status_line</span> ]\n\ 340: \n\ 341: <span class=\"ruby-identifier\">req</span>.<span class=\"ruby-identifier\">sync</span> = <span class=\"ruby-keyword kw\">true</span>\n\ 342: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">handler_status</span>\n\ 343: <span class=\"ruby-keyword kw\">rescue</span> <span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Exception</span> =<span class=\"ruby-operator\">></span> <span class=\"ruby-identifier\">err</span>\n\ 344: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">error</span> <span class=\"ruby-value str\">"Dispatcher caught an unhandled %s: %s:\\n\\t%s"</span> <span class=\"ruby-operator\">%</span>\n\ 345: [ <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">message</span>, <span class=\"ruby-identifier\">err</span>.<span class=\"ruby-identifier\">backtrace</span>.<span class=\"ruby-identifier\">join</span>(<span class=\"ruby-value str\">"\\n\\t"</span>) ]\n\ 346: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-constant\">Apache</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">SERVER_ERROR</span>\n\ 347: \n\ 348: <span class=\"ruby-keyword kw\">ensure</span>\n\ 349: <span class=\"ruby-comment cmt\"># Make sure session locks are released</span>\n\ 350: <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">session</span>.<span class=\"ruby-identifier\">finish</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">txn</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-identifier\">txn</span>.<span class=\"ruby-identifier\">session?</span>\n\ 351: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> The content <a href="Dispatcher.html#M000441">handler</a> method. Dispatches requests to registered applets based on the requests PATH_INFO. </p> params: ( req ) - visibility: public aref: M000442 name: inspect sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 355</span>\n\ 355: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">inspect</span>\n\ 356: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-value str\">"#<%s:0x%x config: %s>"</span> <span class=\"ruby-operator\">%</span> [\n\ 357: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">name</span>,\n\ 358: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">object_id</span>,\n\ 359: <span class=\"ruby-ivar\">@config</span>.<span class=\"ruby-identifier\">name</span>,\n\ 360: ]\n\ 361: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Return a human-readable representation of the receiver as a String. </p> params: () - visibility: public aref: M000443 name: untable sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/dispatcher.rb, line 364</span>\n\ 364: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">untable</span>( <span class=\"ruby-identifier\">table</span> )\n\ 365: <span class=\"ruby-identifier\">lines</span> = []\n\ 366: <span class=\"ruby-identifier\">table</span>.<span class=\"ruby-identifier\">each</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">k</span>,<span class=\"ruby-identifier\">v</span><span class=\"ruby-operator\">|</span>\n\ 367: <span class=\"ruby-identifier\">lines</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-value str\">"%s: %s"</span> <span class=\"ruby-operator\">%</span> [ <span class=\"ruby-identifier\">k</span>, <span class=\"ruby-identifier\">v</span> ]\n\ 368: <span class=\"ruby-keyword kw\">end</span>\n\ 369: \n\ 370: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">lines</span>.<span class=\"ruby-identifier\">join</span>( <span class=\"ruby-value str\">"; "</span> )\n\ 371: <span class=\"ruby-keyword kw\">end</span>" params: ( table ) category: Instance type: Public
---
--- - name: SVNRev desc: |+ SVN Revision value: "%q$Rev: 437 $" - name: SVNId desc: |+ SVN Id value: "%q$Id: dispatcher.rb 437 2008-03-28 00:49:20Z deveiant $"
Generated with the Darkfish Rdoc Generator.