> 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