view · edit · sidebar · attach · print · history

< Niklaus.20161101-steinwies-rack-call | Index | Niklaus.20161026-steinwies-rack-post >>

20161031-steinwies-rack-post

Summary

  • port sbsm/steinwies.ch to use the rack webserver. Fix handling POST requests
  • Keep in Mind

Commits

Index

port sbsm/steinwies.ch to use the rack webserver. Fix handling POST requests

Also the preserve the session, but cannot open the DrbConnection anymore. Why?

Looking at https://github.com/dcadenas/rubydeps to generate class diagrams to more easily compare old and new sbsm versions.

Did not find a library that produces a nice dependency, that I could minimize to exctract the important classes.

Resuming the problem, after my changes I cannot find anymore the drb. With the currently pushed branches rack of sbsm I start in two session bundle exec bin/steinwies and bundle exec rackup. Then I visit http://localhost:8004 and with the help of pry I get

 bundle exec rackup
Passing app Steinwies::App
@app is NilClass
SBSM::Session.new sbsm-persistent-cookie-id Steinwies::App
/home/niklaus/git/sbsm/lib/sbsm/session.rb 300: logout @active_state now Steinwies::HomeState
[2016-10-31 10:10:05] INFO  WEBrick 1.3.1
[2016-10-31 10:10:05] INFO  ruby 2.3.1 (2016-04-26) [x86_64-linux]
[2016-10-31 10:10:05] INFO  WEBrick::HTTPServer#start: pid=4049 port=8004
found session #<Rack::Session::Abstract::SessionHash:0x000000025ccce8> @session_handler is_? Steinwies::Session

From: /home/niklaus/git/sbsm/lib/sbsm/app.rb @ line 114 SBSM::App#call:

    109: 
    110:       session = Rack::Session::Abstract::SessionHash.find(@sbsm.request)
    111:       puts "found session #{session} @session_handler is_? #{@session_handler.class}"
    112:       @@counter += 1
    113:       require 'pry'; binding.pry if @@counter <= 3
 => 114:       response = Rack::Response.new
    115:       response = @sbsm.process(self, @session_handler, @server_uri)
    116:       response.set_cookie(COOKIE_ID, {:value => @sbsm.request.cookies[COOKIE_ID], :path => "/", :expires => Time.now+24*60*60})
    117:       response.set_cookie('@@counter', {:value => @@counter, :path => "/", :expires => Time.now+24*60*60})
    118:       response.set_cookie('saved_path', {:value => @sbsm.request.path, :path => "/", :expires => Time.now+24*60*60})
    119:       response.set_cookie('saved_session', {:value => @session_handler, :path => "/", :expires => Time.now+24*60*60})

[1] pry(#<Steinwies::AppWebrick>)> continue
@proxy is NilClass 

From: /home/niklaus/git/sbsm/lib/sbsm/request.rb @ line 213 SBSM::Request#drb_process:

    208:         if false
    209:           object = Steinwies::Session.new(SBSM::App::COOKIE_ID, app, Steinwies::Validator.new)
    210:           @proxy  = DRbObject.new(object, @request.session[:proxy].server_uri.to_s) # worked
    211:         end
    212:         binding.pry
 => 213:         @proxy  = DRbObject.new(session, server_uri)
    214:         require 'pry'; binding.pry unless @proxy.is_a?(DRb::DRbObject)
    215:         res1 = @proxy.drb_process(self)
    216:         res = @proxy.drb_process(self)
    217:       end
    218:       html = @response.write(res)

[1] pry(#<SBSM::Request>)> continue
DRb::DRbServerNotFound: DRb::DRbServerNotFound
        /usr/local/lib/ruby/2.3.0/drb/drb.rb:1718:in `current_server'
        /usr/local/lib/ruby/2.3.0/drb/drb.rb:1787:in `to_id'
        /usr/local/lib/ruby/2.3.0/drb/drb.rb:1103:in `initialize'
        /home/niklaus/git/sbsm/lib/sbsm/request.rb:213:in `new'
        /home/niklaus/git/sbsm/lib/sbsm/request.rb:213:in `drb_process'
        /home/niklaus/git/sbsm/lib/sbsm/request.rb:100:in `process'
        /home/niklaus/git/sbsm/lib/sbsm/app.rb:115:in `call'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:49:in `_call'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:37:in `call'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/show_exceptions.rb:23:in `call'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/session/abstract/id.rb:222:in `context'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/session/abstract/id.rb:216:in `call'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/handler/webrick.rb:86:in `service'
        /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
        /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
        /usr/local/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'
::1 - - [31/Oct/2016:10:10:26 CET] "GET / HTTP/1.1" 500 55417
- -> /

The local variable server_uri is correct #<URI::Generic druby://localhost:10001>.

Zeno pointed me to https://gist.github.com/kuboon/724834954d3345798054, which seems to have solved a very similar problem. Must analys what the Rack::RewindableInput is and how the CGIHandler in the above example works.

I think it might be a good idea to test steinwies/sbsm by creating a test, where we increment the counter in the remote DRbServer. This might be also part of the missing test-app for completing the SBSM unit tests.

Reading http://www.anchor.com.au/hosting/dedicated/Running-Rails-2.3-Using-CGI-with-Rack which gives some explanation of the differences between CGI (as done via mod_ruby) and the Rack/Webrick approach. But shouldn't we get rid of the CGI completely? But how?

I think I can safely remove the file lib/cgi/drb_session.rb as it not used anywhere.

Started working on steinwies.ch/bin/simple, which should be a very simply example. It will increment a counter and display the requested path (may be later on also the cookie).

Created simple_config.ru, bin/simple and src/util/simple_app.rb. Now bin/simple and rackup simple_config.ru, but I do not see yet a call into the Drb-Process launched by bin/simple. This was expected. Pushed commit Added simple-app to test for DRb. Cookies/DRb not recognized

Now first adding preserving of session, then connecting to the DrbProcess. Done with commit Simple example with a working DRb and session.

Now the whole class structure is quite different. The DRbServer only works because it is no longer derived from the simple delegator. Is this a disadvantage? Or was it derived to avoid memory leaks present in Ruby and its classes around 2005 when the gem was developed?

When looking at the output bin/simple I can easily trace the two sesssion (one from chromium, the other one with firefox), where I visited a few place:

bundle exec bin/simple 
Starting druby://localhost:18999
simple_app.rb:50 DRbServer.new
simple_app.rb:55 process #<Rack::Request:0x00000002a37d50> path: /test6799 id: 0.9403210530719527
simple_app.rb:55 process #<Rack::Request:0x000000029e5f00> path: /new38 id: 
simple_app.rb:55 process #<Rack::Request:0x0000000278d708> path: /new399 id: 0.117203343869001
simple_app.rb:55 process #<Rack::Request:0x000000026ca848> path: /new400 id: 0.117203343869001
simple_app.rb:55 process #<Rack::Request:0x0000000262b5b8> path: /test6 id: 0.9403210530719527

The output of rackup simple_config.ru show the few parts I passed through my code

 bundle exec rackup simple_config.ru 
simple_app.rb:50 DRbServer.new
simple_app.rb:50 DRbServer.new
simple_app.rb:194 initialize @app is now #<Simple:0x00000002b05548 @sessions={}, @system=nil>
[2016-10-31 15:21:28] INFO  WEBrick 1.3.1
[2016-10-31 15:21:28] INFO  ruby 2.3.1 (2016-04-26) [x86_64-linux]
[2016-10-31 15:21:28] INFO  WEBrick::HTTPServer#start: pid=30019 port=8888
simple_app.rb:199 cookies are {"sbsm-persistent-cookie"=>"", "sbsm-persistent-cookie-id"=>"0.9403210530719527", "@@counter"=>"4", "old_path"=>"/test6799", "_session_id"=>""}
simple_app.rb:202 _session_id is 0.9403210530719527 or nil
simple_app.rb:208 found session #<Rack::Session::Abstract::SessionHash:0x00000002a4c750> @session_handler is_? NilClass
result is "simple_app.rb:55 process #<Rack::Request:0x00000002a37d50> path: /test6799 id: 0.9403210530719527" session_id 0.9403210530719527
::1 - - [31/Oct/2016:15:21:32 CET] "GET /test6799 HTTP/1.1" 200 0
- -> /test6799

Remove the Rack::Session::Pool, which I think we do not need at the moment with commit Got rid of Rack::Session::Pool

Made the display nicer and verifying that we really use DRb to access a different linux process. Now the output of http://localhost:8888/test810 looks like this

simple_app.rb:55 DRbPid 19306
request: #<Rack::Request:0x000000021b7c20> path: /test810 id: 0.9403210530719527
Passthrough (WebRick PID) is 20135
@@counter is 4
session_id is 0.9403210530719527

Now removing the simple implementations for SBSM in simple_app.rb and replacing it with (possibly modified) classes from SBSM. Now I am beginning to understand. I must find the used session via a call to @app[session_id] and calling process for the returned session. Now my simple_app complains, because no validator is given.

Adaptation continued. Now I am asking myself about how the DRbObjects are handled in the procedure call(env)

      puts "result is #{result.inspect} session_id #{session_id}"
      puts DRbObject.new_with_uri(SERVER_URI).to_s
      puts session.to_s
      # @proxy = DRbObject.new_with_uri(SERVER_URI)
      @proxy =  DRbObject.new(session, SERVER_URI)
      puts @proxy.to_s
      session.drb_process self # das läuft
      res = @proxy.drb_process(self) # das nicht
results in the following output
result is "" session_id 0.831724324438134 WebRick has pid 4602
simple_app.rb:83 Im the Steinwies DrbServer from the pid 4519
simple_app.rb:83 Im the Steinwies DrbServer from the pid 4602
simple_app.rb:83 Im the Steinwies DrbServer from the pid 4602
RangeError: 0x00000001521038 is not id value
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:373:in `_id2ref'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:373:in `to_obj'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1483:in `to_obj'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1779:in `to_obj'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:622:in `recv_request'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:931:in `recv_request'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1599:in `init_with_client'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1611:in `setup_message'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1563:in `perform'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1657:in `block (2 levels) in main_loop'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1653:in `loop'
        (druby://localhost:18999) /usr/local/lib/ruby/2.3.0/drb/drb.rb:1653:in `block in main_loop'
        /home/niklaus/git/steinwies.ch/src/util/simple_app.rb:121:in `call'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:49:in `_call'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/lint.rb:37:in `call'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/show_exceptions.rb:23:in `call'
        /home/niklaus/git/steinwies.ch/vendor/ruby/2.3.0/gems/rack-2.0.1/lib/rack/handler/webrick.rb:86:in `service'
        /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:140:in `service'
        /usr/local/lib/ruby/2.3.0/webrick/httpserver.rb:96:in `run'
        /usr/local/lib/ruby/2.3.0/webrick/server.rb:296:in `block in start_thread'

In my previous stub implementation of SBSM::DrbServer I had removed the inheritance from SimpleDelegator and my code worked. Now I readded it again and I am still getting the same error. Pushing my changes for steinwies and sbsm.

Pushed the following commits:

view · edit · sidebar · attach · print · history
Page last modified on October 31, 2016, at 06:26 PM