Re: PyObjC and Criollo HTTP server

Ronald Oussoren via Pythonmac-SIG <[email protected]> Mon, 6 Jan 2020 15:27:19 +0100
Newsgroups gmane.comp.python.apple
Message-ID <[email protected]>

> On 6 Jan 2020, at 00:51, Rand Dvorak <[email protected]> wrote:
> 
> 
> I am trying to implement a simple server in PyObjC for the Criollo HTTP server.  The server has a method to set route handlers by passing a block to setup the route and then when it receives and HTTP request for the route it calls the block.  The block has the signature:
> 
> typedef void(^CRRouteBlock)(CRRequest* _Nonnull request, CRResponse* _Nonnull response, CRRouteCompletionBlock _Nonnull completionHandler);
> 
> 
> So, here is my simple proof of concept:
> 
> import objc 
> CRApplication = objc.lookUpClass("CRApplication")
> global server
> 
> def helloHandler(self, request, response, handler):
> 	response.send_("Hello World!")
> 	handler()
> 	
> if __name__ == "__main__":
> 	server = CRApplication.sharedApplication().delegate().server()
> 	server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@@‘))  *** error occurs here
> 	server.startListening()
> 
> 
> But, when I try to setup the route I get the following error:
> 
> Traceback (most recent call last):
>  File "main.py", line 21, in <module>
>    server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@'))
> TypeError: Argument 3 is a block, but no signature available
> 
> 
> Any ideas how to workaround this issue and implement the route handlers in PyObjC?

The code below should do the trick, but eas typed directly into this mail and might therefore contain syntax errors.

import objc
objc.registerMetaDataForSelector(
    b”CRApplication”,  # name of the class implementing “get_block:”, or “NSObject”
    b”get_block:”,
   {
     “arguments”: {
       2: {
         “callable”: {
          “arguments”: {
           0: { “type”: b”^v” },
           1: { “type”: b”@” },
           2: { “type”: b”@” },
           3: { “type”: b”@” }
          },
          “retail”: { “type”: b”v” }
        } 
      }
   }
)

This tells the bridge the signature for the block argument of the “get_block:” selector, which is information that cannot be retrieved from the Objective-C runtime.  Argument 2 is the first real argument of ObjC selectors, after the implicit arguments “self” and “_imp” (which is not available in python code).

Ronald
—

Twitter: @ronaldoussoren
Blog: https://blog.ronaldoussoren.net/
> _______________________________________________
> Pythonmac-SIG maillist  -  [email protected]
> https://mail.python.org/mailman/listinfo/pythonmac-sig
> unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG

_______________________________________________
Pythonmac-SIG maillist  -  [email protected]
https://mail.python.org/mailman/listinfo/pythonmac-sig
unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG