Class: SBSM::App
- Includes:
- DRbUndumped
- Defined in:
- lib/sbsm/app.rb
Overview
App a base class for Webrick server
Constant Summary collapse
- PERSISTENT_COOKIE_NAME =
"cookie-persistent-sbsm-1.3.1"- OPTIONS =
[ :app, :config_file, :trans_handler, :validator, :persistence_layer, :server_uri, :session, :unknown_user ]
- COOKIE_ID =
'sbsm-persistent-cookie-id'
Constants inherited from DRbServer
DRbServer::CAP_MAX_THRESHOLD, DRbServer::CLEANING_INTERVAL, DRbServer::ENABLE_ADMIN, DRbServer::MAX_SESSIONS, DRbServer::RUN_CLEANER, DRbServer::SESSION, DRbServer::UNKNOWN_USER, DRbServer::VALIDATOR
Instance Attribute Summary collapse
-
#my_self ⇒ Object
readonly
Returns the value of attribute my_self.
-
#sbsm ⇒ Object
readonly
Returns the value of attribute sbsm.
-
#validator ⇒ Object
readonly
Returns the value of attribute validator.
Attributes inherited from DRbServer
Instance Method Summary collapse
-
#call(env) ⇒ Object
mimick sbsm/lib/app.rb.
-
#initialize(app:, validator:, trans_handler:, persistence_layer: nil) ⇒ App
constructor
Base class for a SBSM based WebRick HTTP server * offers a start_server() method to launch a DRB server for handling the DRB-requests * offer a call(env) method form handling the WebRick requests This is all what is needed to be compatible with WebRick.
Methods inherited from DRbServer
#[], #_admin, #async, #cap_max_sessions, #clean, #clear, #delete_session, #reset, #run_cleaner, #unknown_user
Constructor Details
#initialize(app:, validator:, trans_handler:, persistence_layer: nil) ⇒ App
Base class for a SBSM based WebRick HTTP server
-
offers a start_server() method to launch a DRB server for handling the DRB-requests
-
offer a call(env) method form handling the WebRick requests
This is all what is needed to be compatible with WebRick
arguments
-
validator- A Ruby class overriding the SBSM::Validator class -
trans_handler- A Ruby class overriding the SBSM::TransHandler class -
persistence_layer- Persistence Layer to use
Examples
Look at steinwies.ch
-
github.com/zdavatz/steinwies.ch (simple, mostly static files, one form, no persistence layer)
61 62 63 64 65 66 67 |
# File 'lib/sbsm/app.rb', line 61 def initialize(app:, validator:, trans_handler:, persistence_layer: nil) @app = app @trans_handler = trans_handler @validator = validator SBSM.info "initialize @app is now #{@app.class} validator #{validator} th #{trans_handler} " super(persistence_layer) end |
Instance Attribute Details
#my_self ⇒ Object (readonly)
Returns the value of attribute my_self.
39 40 41 |
# File 'lib/sbsm/app.rb', line 39 def my_self @my_self end |
#sbsm ⇒ Object (readonly)
Returns the value of attribute sbsm.
39 40 41 |
# File 'lib/sbsm/app.rb', line 39 def sbsm @sbsm end |
#validator ⇒ Object (readonly)
Returns the value of attribute validator.
39 40 41 |
# File 'lib/sbsm/app.rb', line 39 def validator @validator end |
Instance Method Details
#call(env) ⇒ Object
mimick sbsm/lib/app.rb
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/sbsm/app.rb', line 69 def call(env) ## mimick sbsm/lib/app.rb request = Rack::Request.new(env) response = Rack::Response.new if request.[PERSISTENT_COOKIE_NAME] && request.[PERSISTENT_COOKIE_NAME].length > 1 session_id = request.[PERSISTENT_COOKIE_NAME] else session_id = rand((2**(0.size * 8 -2) -1)*10240000000000).to_s(16) end file_name = File.(File.join('doc', request.path)) if File.file?(file_name) if /css/i.match(File.basename(file_name)) response.set_header('Content-Type', 'text/css') else response.set_header('Content-Type', 'text/plain') end response.write(File.open(file_name, File::RDONLY){|file| file.read}) return response end return [400, {}, []] if /favicon.ico/i.match(request.path) SBSM.debug "#{request.path}: cookies are #{request.cookies} for session_id #{session_id}" @drb_uri ||= @app.drb_uri args = { 'database_manager' => CGI::Session::DRbSession, 'drbsession_uri' => @drb_uri, 'session_path' => '/', PERSISTENT_COOKIE_NAME => session_id, } @cgi = CGI.initialize_without_offline_prompt('html4') @session = CGI::Session.new(@cgi, args) saved = self[session_id] @proxy = DRbObject.new(saved, server_uri) @proxy.trans_handler = @trans_handler @proxy.app = @app res = @proxy.drb_process(self, request) response.write res response.headers['Content-Type'] ||= 'text/html; charset=utf-8' response.(PERSISTENT_COOKIE_NAME, session_id) @proxy..each{|key, value| response.(key, value) } SBSM.debug "finish session_id #{session_id}: header #{response.headers}" response.finish end |