[Pythonmac-SIG] PyObjC and Criollo HTTP server
Ronald Oussoren
ronaldoussoren at mac.com
Wed Jan 8 03:20:08 EST 2020
Please change “get_block_” to “get:block:” in the call to objc.registerMetadataForSelector.
Ronald
—
Twitter: @ronaldoussoren
Blog: https://blog.ronaldoussoren.net/
> On 8 Jan 2020, at 02:04, Rand Dvorak <randdvorak at gmail.com> wrote:
>
> Same results with this code:
>
> import objc
> CRApplication = objc.lookUpClass("CRApplication")
> objc.registerMetaDataForSelector(
> b'CRServer',
> b'get_block_',
> {
> 'arguments': {
> 2: {
> 'callable': {
> 'arguments': {
> 0:{'type': b'^v'},
> 1:{'type': b'@'},
> 2:{'type': b'@'},
> 3:{'type': b'?'}
> },
> ' retval': { 'type': b'v' }
> }
> }
> }
> }
> )
>
> global server
>
>
> def helloHandler(request, response, handler):
> response.send_("Hello World!")
> handler()
>
> if __name__ == "__main__":
> server = CRApplication.sharedApplication().delegate().server()
> server.get_block_("/", helloHandler)
> server.startListening()
>
>
>> On Jan 7, 2020, at 04:47, Ronald Oussoren <ronaldoussoren at mac.com <mailto:ronaldoussoren at mac.com>> wrote:
>>
>> And given de example on https://criollo.io: <https://criollo.io/>
>>
>> - The class name is CRServer, not CRApplication
>> - The selector is “get:block:” instead of “get_block:”, which also means the block is argument 3 instead of 2.
>>
>>>> objc.registerMetaDataForSelector(
>>>> b'CRServer',
>>>> b’get:block:',
>>>> {
>>>> 'arguments': {
>>>> 3: {
>>>> 'callable': {
>>>> 'arguments': {
>>>> 0:{'type': b'^v'},
>>>> 1:{'type': b'@'},
>>>> 2:{'type': b'@'},
>>>> 3:{'type': b'@'}
>>>> },
>>>> 'retval': { 'type': b'v' }
>>>> }
>>>> }
>>>> }
>>>> }
>>>> )
>>
>> and later:
>>
>>>> server.get_block_("/", helloHandler)
>>
>>>
>>
>>
>> —
>>
>> Twitter: @ronaldoussoren
>> Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/>
>>
>>> On 7 Jan 2020, at 10:00, Ronald Oussoren via Pythonmac-SIG <pythonmac-sig at python.org <mailto:pythonmac-sig at python.org>> wrote:
>>>
>>> Hi,
>>>
>>> You also need to remove the call to objc.selector. With correct metadata “blocks” are callables in Python code.
>>>
>>> Ronald
>>> —
>>>
>>> Twitter: @ronaldoussoren
>>> Blog: https://blog.ronaldoussoren.net/ <https://blog.ronaldoussoren.net/>
>>>
>>>> On 6 Jan 2020, at 23:59, Rand Dvorak <randdvorak at gmail.com <mailto:randdvorak at gmail.com>> wrote:
>>>>
>>>> Same result:
>>>>
>>>> Updated code:
>>>>
>>>> import objc
>>>> CRApplication = objc.lookUpClass("CRApplication")
>>>> objc.registerMetaDataForSelector(
>>>> b'CRApplication',
>>>> b'get_block_',
>>>> {
>>>> 'arguments': {
>>>> 2: {
>>>> 'callable': {
>>>> 'arguments': {
>>>> 0:{'type': b'^v'},
>>>> 1:{'type': b'@'},
>>>> 2:{'type': b'@'},
>>>> 3:{'type': b'@'}
>>>> },
>>>> ' retval': { 'type': b'v' }
>>>> }
>>>> }
>>>> }
>>>> }
>>>> )
>>>> 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@:@@@'))
>>>> server.startListening()
>>>>
>>>>
>>>> results:
>>>>
>>>> Traceback (most recent call last):
>>>> File "main.py", line 37, in <module>
>>>> server.get_block_("/", objc.selector(helloHandler, signature=b'v@:@@@'))
>>>> TypeError: Argument 3 is a block, but no signature available
>>>>
>>>>
>>>>> On Jan 6, 2020, at 09:27, Ronald Oussoren <ronaldoussoren at mac.com <mailto:ronaldoussoren at mac.com>> wrote:
>>>>>
>>>>>
>>>>>
>>>>>> On 6 Jan 2020, at 00:51, Rand Dvorak <randdvorak at gmail.com <mailto:randdvorak at gmail.com>> 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/ <https://blog.ronaldoussoren.net/>
>>>>>> _______________________________________________
>>>>>> Pythonmac-SIG maillist - Pythonmac-SIG at python.org <mailto:Pythonmac-SIG at python.org>
>>>>>> https://mail.python.org/mailman/listinfo/pythonmac-sig <https://mail.python.org/mailman/listinfo/pythonmac-sig>
>>>>>> unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG <https://mail.python.org/mailman/options/Pythonmac-SIG>
>>>>>
>>>>
>>>
>>> _______________________________________________
>>> Pythonmac-SIG maillist - Pythonmac-SIG at python.org <mailto:Pythonmac-SIG at python.org>
>>> https://mail.python.org/mailman/listinfo/pythonmac-sig <https://mail.python.org/mailman/listinfo/pythonmac-sig>
>>> unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG <https://mail.python.org/mailman/options/Pythonmac-SIG>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythonmac-sig/attachments/20200108/6c794f00/attachment-0001.html>
More information about the Pythonmac-SIG
mailing list