Class: SBSM::App

Inherits:
DRbServer show all
Includes:
DRbUndumped
Defined in:
lib/sbsm/app.rb

Overview

App a base class for Webrick server

Constant Summary collapse

"cookie-persistent-sbsm-1.3.1"
OPTIONS =
[ :app, :config_file, :trans_handler, :validator, :persistence_layer, :server_uri, :session, :unknown_user ]
'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

Attributes inherited from DRbServer

#cleaner, #updater

Instance Method Summary collapse

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



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_selfObject (readonly)

Returns the value of attribute my_self.



39
40
41
# File 'lib/sbsm/app.rb', line 39

def my_self
  @my_self
end

#sbsmObject (readonly)

Returns the value of attribute sbsm.



39
40
41
# File 'lib/sbsm/app.rb', line 39

def sbsm
  @sbsm
end

#validatorObject (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.cookies[PERSISTENT_COOKIE_NAME] && request.cookies[PERSISTENT_COOKIE_NAME].length > 1
    session_id = request.cookies[PERSISTENT_COOKIE_NAME]
  else
    session_id = rand((2**(0.size * 8 -2) -1)*10240000000000).to_s(16)
  end
  file_name = File.expand_path(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.set_cookie(PERSISTENT_COOKIE_NAME, session_id)
  @proxy.cookie_input.each{|key, value| response.set_cookie(key, value) }
  SBSM.debug "finish session_id #{session_id}: header #{response.headers}"
  response.finish
end