40ants / weblocks-websocket

Websocket support for Common Lisp framework weblocks.
2 stars 3 forks source link

Websocket make-server causes ETYPECASE fall through error in weblocks/server:make-response-for-clack #2

Closed hdasch closed 5 years ago

hdasch commented 5 years ago

It looks to me like commit bc9c5b in weblocks/reblocs changed request processing, breaking websocket initialization. weblocks/server handle-http-request passes the result of (weblocks/routes:serve route env) through make-response-for-clack, which expects a weblocks/response:response object. But websocket-driver.server returns a closure.

Or, something I have done is broken. My test app, based on weblocks-websocket README, is at https://github.com/hdasch/websock-demo. The traceback I see in slime looks like

Callback Error: the message-complete callback failed
  #<CLOSURE (LAMBDA (WEBLOCKS.WEBSOCKET::RESPONDER)
              :IN
              WEBLOCKS.WEBSOCKET::PROCESS-WEBSOCKET) {1006A974DB}> fell through ETYPECASE expression.
  Wanted one of (WEBLOCKS/RESPONSE:RESPONSE LIST).
   [Condition of type FAST-HTTP.ERROR:CB-MESSAGE-COMPLETE]

Restarts:
 0: [ABORT] abort thread (#<THREAD "clack-handler-woo" RUNNING {1001E3AF63}>)

Backtrace:
  0: ((FLET "H0" :IN FAST-HTTP.PARSER:PARSE-REQUEST) #<unavailable argument>)
  1: (SB-KERNEL::%SIGNAL #<SB-KERNEL:CASE-FAILURE expected-type: (OR WEBLOCKS/RESPONSE:RESPONSE LIST) datum: #<CLOSURE (LAMBDA (WEBLOCKS.WEBSOCKET::RESPONDER) :IN WEBLOCKS.WEBSOCKET::PROCESS-WEBSOCKET) {10..
  2: (ERROR SB-KERNEL:CASE-FAILURE :NAME ETYPECASE :DATUM #<CLOSURE (LAMBDA (WEBLOCKS.WEBSOCKET::RESPONDER) :IN WEBLOCKS.WEBSOCKET::PROCESS-WEBSOCKET) {1006A974DB}> :EXPECTED-TYPE (OR WEBLOCKS/RESPONSE:RES..
  3: (WEBLOCKS/SERVER::MAKE-RESPONSE-FOR-CLACK #<CLOSURE (LAMBDA (WEBLOCKS.WEBSOCKET::RESPONDER) :IN WEBLOCKS.WEBSOCKET::PROCESS-WEBSOCKET) {1006A974DB}>)
  4: (WEBLOCKS/APP::CALL-IN-WEBAPP NIL #<CLOSURE (LAMBDA NIL :IN WEBLOCKS/SERVER::HANDLE-HTTP-REQUEST) {1006A7C04B}>)
  5: ((LAMBDA (#:G22 &REST #:G23) :IN WEBLOCKS/SERVER::HANDLE-HTTP-REQUEST) NIL)
  6: ((FLET WEBLOCKS/HOOKS:CALL-NEXT-HOOK :IN WEBLOCKS/COMMANDS::RESET-COMMANDS-LIST))
  7: ((FLET WEBLOCKS/COMMANDS::RESET-COMMANDS-LIST :IN "/home/hugh/quicklisp/local-projects/weblocks/src/commands.lisp") (#<CLOSURE (LAMBDA (#:G22 &REST #:G23) :IN WEBLOCKS/SERVER::HANDLE-HTTP-REQUEST) {10..
  8: ((FLET WEBLOCKS/DEBUG::TRACK-LATEST-SESSION :IN WEBLOCKS/DEBUG:ON) (#<FUNCTION (FLET WEBLOCKS/COMMANDS::RESET-COMMANDS-LIST :IN "/home/hugh/quicklisp/local-projects/weblocks/src/commands.lisp") {53650..
  9: ((:METHOD WEBLOCKS/SERVER::HANDLE-HTTP-REQUEST (WEBLOCKS/SERVER::SERVER T)) #<unused argument> (:LACK.SESSION.OPTIONS (:ID "7e587214a92cc7a811941ff85ac3bbb0f7028813" :NEW-SESSION NIL :CHANGE-ID NIL ....
 10: ((LAMBDA (LACK.MIDDLEWARE.SESSION::ENV) :IN "/home/hugh/quicklisp/local-projects/lack/src/middleware/session.lisp") (:LACK.SESSION.OPTIONS (:ID "7e587214a92cc7a811941ff85ac3bbb0f7028813" :NEW-SESSION ..
 11: ((FLET WOO::MAIN :IN WOO::SETUP-PARSER) (:RAW-BODY #<FLEXI-STREAMS::VECTOR-INPUT-STREAM {1006A75EF3}> :REQUEST-METHOD :GET :SCRIPT-NAME "" ...))
 12: ((LAMBDA (FAST-HTTP.HTTP:HTTP) :IN FAST-HTTP:MAKE-PARSER) #<unused argument>)
 13: (FAST-HTTP.PARSER:PARSE-REQUEST #<unavailable argument> #<unavailable argument> #<unavailable argument> :START #<unavailable argument> :END #<unavailable argument>)
 14: ((LAMBDA (FAST-HTTP::DATA &KEY :START :END) :IN FAST-HTTP:MAKE-PARSER) #(71 69 84 32 47 119 ...) :START #<unavailable argument> :END #<unavailable argument>)
 15: (WOO::READ-CB #S(WOO.EV.SOCKET:SOCKET :WATCHERS #(#.(SB-SYS:INT-SAP #X7F29C40125A0) #.(SB-SYS:INT-SAP #X7F29C40125E0) #.(SB-SYS:INT-SAP #X7F29C4012620)) :LAST-ACTIVITY 1.5655680509333634d9 :FD 10 :REM..
 16: ((LAMBDA (WOO.EV.TCP::EVLOOP WOO.EV.TCP::WATCHER WOO.EV.TCP::EVENTS) :IN "/home/hugh/quicklisp/dists/ultralisp/software/fukamachi-woo-20190709034702/src/ev/tcp.lisp") #<unused argument> #.(SB-SYS:INT-..
 17: ((LAMBDA (SB-ALIEN::ARGS-POINTER SB-ALIEN::RESULT-POINTER FUNCTION) :IN "/home/hugh/quicklisp/dists/ultralisp/software/fukamachi-woo-20190709034702/src/ev/socket.lisp") #<unavailable argument> #<unava..
 18: ("foreign function: funcall_alien_callback")
 19: ("foreign function: callback_wrapper_trampoline")
 --more--

weblocks-websocket looks like exactly what I need, But I'm not familiar enough to know how to generate an appropriate response object. Are the weblocks and weblocks-websocket projects out of sync, or have I bungled the example program? Thanks, Hugh

svetlyak40wt commented 5 years ago

Yes, I didn't touch weblocks-websocket about a year and this library became broken because of changes in Weblocks.

However recently I've fixed the error, just didn't merge these changes in the reblocks branch.

Here is the pull with the fix:

https://github.com/40ants/weblocks/pull/38

hdasch commented 5 years ago

That worked nicely. Thank you.

svetlyak40wt commented 5 years ago

Great! I've merged the pull and a new Weblocks version should be available at Ultralisp.org in 5-10 minutes!