Andrew Stewart wrote:

> I am using channels to talk to an HTTP server running on localhost:
> 
>     let channel = ch_open('localhost:1234', {'mode': 'raw'}
>     let str = '...'    " <- this is raw HTTP
>     let response = ch_evalraw(channel, str)
> 
> The HTTP response's body is a JSON string.
> 
> I find intermittently (say 50%-70% of the time) the JSON in the response is 
> truncated.  It is alway truncated in the same spot, which is after ~4300 
> bytes.
> 
> The weird thing is that when I log channel activity with `call 
> ch_logfile('channelog', 'w')` the response is never truncated.
> 
> In the channel log I can see the successful response being received in two 
> parts, with the first part corresponding to what I get "in full" when the 
> response is truncated.  Here's an excerpt:
> 
>  2.284366 on 8: Created channel
>  2.285209 on 8: Connecting to localhost port 1234
>  2.285309 on 8: Waiting for connection (waiting 1 msec)...
>  2.285449 on 8: Connection made
>  2.285731 SEND on 8: 'POST /path/to/endpoint HTTP/1.0
>  Host: localhost
>  Content-Type: application/x-www-form-urlencoded
>  Content-Length: 120
>  
>  {"some json that":"i am sending"}'
> 2.285779 on 8: Blocking RAW read, timeout: 2000 msec
> 2.285793 on 8: Waiting for up to 2000 msec
> 2.286701 RECV on 8: 'HTTP/1.0 200 OK^M
> Content-Type: application/json^M
> Date: Wed, 25 Oct 2017 11:02:55 GMT^M
> ^M
> {"first part of response":"json truncated here
> 2.286753 RECV on 8: 'and it continues on to the end}'
> 2.286775 on 8: Returning 6320 bytes
> 2.287753 on 8: channel_select_check(): Read EOF from ch_part[0], closing
> 2.291400 : looking for messages on channels
> 2.291412 on 8: Closing channel because all readable fds are closed
> 2.291420 on 8: Closing channel
> 2.291427 on 8: Closing channel
> 2.291433 on 8: Clearing channel
> 2.291441 on 8: Freeing channel
> 
> It seems that channel logging somehow forces `ch_evalraw()` to stitch 
> together all received parts into a single response.  And that without channel 
> logging, 50%-70% of the time only the part received first is returned by 
> `ch_evalraw()`.
> 
> How can I get `ch_evalraw()` to give me everything it receives without having 
> to log the channel's activity?

In this case ch_evalraw() won't work well, because Vim does not know
when a raw message is finished.  That it works with logging is probably
a matter of timing.  Thus you need to use ch_read() until you have the
complete message.  For HTTP the header should have the length of the
contents, or you can check the JSON is complete.

-- 
CONCORDE:  Quickly, sir, come this way!
LAUNCELOT: No!  It's not right for my idiom.  I must escape more  ... more ...
CONCORDE:  Dramatically, sir?
LAUNCELOT: Dramatically.
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui