artanis
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: http-request in a controller- is it possible?


From: Jaft
Subject: Re: http-request in a controller- is it possible?
Date: Sat, 5 Dec 2020 07:10:56 +0000 (UTC)

Ah, cool. Easy enough. It it possible to use it where the endpoint calls another endpoint in the controller? It worked like a charm for (sleep 20) but the call to the other endpoint, while not being called (and, thus, hanging), never leaves the scheduler and, in turn, the original endpoint never finishes loading/processing.

Jonathan

On Friday, December 4, 2020, 10:44:27 PM CST, Nala Ginrut <mulei@gnu.org> wrote:



Hi Jaft!
Ragnarok is non-blocking co-routine based server-core, so you can never
put `sleep' or any longtime blocking operation into it. If you want to
schedule the current task out, till it's ready again, you should insert
(break-task).


Best regards.


Jaft writes:

>  I'm not sure if this is related (so I may be entirely incorrect here) but I tried, while running with Ragnarok, adding (sleep 20) to one of the endpoints in a controller and tried loading the endpoint.
> Throughout the duration of that 20 seconds, trying to load any other endpoint for the Artanis instance hung until the sleep function finished (and, I assume, the rest of the Guile code for the endpoint finished before running the other endpoints).
> I know Ragnarok is supposed to be non-blocking so should this be the case? Or, heh, is this expected behavior and I'm just misunderstanding how things work?
> Jonathan
>    On Thursday, December 3, 2020, 11:48:36 AM CST, Nala Ginrut <mulei@gnu.org> wrote:
>
>
> BTW, if you really want to call http-get at present, you may need to set the
> port to non-blocking manually:
> ---------------------cut-------------------
> (import (web client))
>
> (test-define
> "/"
> (lambda (rc)
> (define port (open-socket-for-uri "http://localhost:3000/123"))
> (fcntl port F_SETFL (logior O_NONBLOCK (fcntl port F_GETFL 0)))
> (call-with-values
> (lambda () (http-get "http://localhost:3000/123" #:port port))
> (lambda (res body) body))))
> ---------------------end--------------------
>
> This works for me.
>
> Best regards.
>
>
>
> Nala Ginrut writes:
>
>> I've tested it, guile internal server-core doesn't work too.
>> So I believe Artanis has to implement its own client API to make it
>> work.
>> The client API is necessary, since people may need to make OAUTH.
>>
>> I'll add it to TODO.
>>
>> Best regards.
>>
>>
>> Nala Ginrut writes:
>>
>>> Hi Morimer!
>>> In theory, the API of (web client) like http-get should work in Ragnarok.
>>> Because Ragnaork based on suspendable-ports for co-routine, and when
>>> suspendable-ports is enabled, all the I/O ports defined in Guile should
>>> be affected to be non-blocking.
>>>
>>> I'm not sure about http-request function, where did you find it?
>>>
>>> Anyway, if you don't insist on non-blocking, you can use guile
>>> server-core to avoid non-blocking issue:
>>> ------------------------cut-----------------------
>>> art work -s guile
>>> ------------------------end-----------------------
>>>
>>>
>>>
>>> Best regards.
>>>
>>>
>>> Mortimer Cladwell writes:
>>>
>>>> Hi,
>>>> Given the controller:
>>>>
>>>> (register-define add
>>>>  (lambda (rc)
>>>>  (let* (
>>>>          ;;(btc-usd 18000)
>>>>            (btc-usd (string->number(receive (response-status response-body)
>>>>                                    (http-request "
>>>> https://blockchain.info/q/24hrprice") response-body)))
>>>>          (btc-req (/ 5000 btc-usd))
>>>>                (currency-content (string-append " <option
>>>> value=\"btc\">Bitcoin " (number->string btc-req) " BTC</option>)))
>>>>  (view-render "add" (the-environment)))
>>>>  ))
>>>>
>>>> If I navigate to http://127.0.0.1:3000/register/add the browser hangs and
>>>> eventually times out.
>>>>
>>>> At the console:
>>>> Ragnarok: continue request
>>>> Error: (wrong-type-arg #f Wrong type (expecting ~A): ~S (resumable
>>>> continuation #<vm-continuation 7f768042f930>) (#<vm-continuation
>>>> 7f768042f930>))
>>>> Ingore it to avoid Ragnarok crash.
>>>> main-loop again
>>>>
>>>> If at the REPL I evaluate (string->number (receive (response-status
>>>> response-body)
>>>>      (http-request "https://blockchain.info/q/24hrprice") response-body))
>>>> I get a number e.g 18,123.45
>>>>
>>>> If I comment out (btc-usd (string->number(receive.... ) and uncomment
>>>> (btc-usd 18000), the expected page is rendered properly.
>>>>
>>>> Is it possible to use (http-request... ) in a controller?
>>>> If not is there a workaround?
>>>> Thanks
>>>> Mortimer


--
GNU Powered it
GPL Protected it
GOD Blessed it
HFG - NalaGinrut
Fingerprint F53B 4C56 95B5 E4D5 6093 4324 8469 6772 846A 0058

reply via email to

[Prev in Thread] Current Thread [Next in Thread]