1
0
forked from aniani/vim

patch 7.4.1299

Problem:    When the server sends a message with ID zero the channel handler
            is not invoked. (Christian J.  Robinson)
Solution:   Recognize zero value for the request ID.  Add a test for invoking
            the channel handler.
This commit is contained in:
Bram Moolenaar
2016-02-10 21:07:14 +01:00
parent d6a8d48587
commit f6157284de
4 changed files with 48 additions and 3 deletions

View File

@@ -786,6 +786,7 @@ channel_get_json(int ch_idx, int id, typval_T **rettv)
if ((id > 0 && tv->v_type == VAR_NUMBER && tv->vval.v_number == id) if ((id > 0 && tv->v_type == VAR_NUMBER && tv->vval.v_number == id)
|| (id <= 0 && (tv->v_type != VAR_NUMBER || (id <= 0 && (tv->v_type != VAR_NUMBER
|| tv->vval.v_number == 0
|| tv->vval.v_number != channel->ch_block_id))) || tv->vval.v_number != channel->ch_block_id)))
{ {
*rettv = item->value; *rettv = item->value;

View File

@@ -130,6 +130,16 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
elif decoded[1] == 'eval-result': elif decoded[1] == 'eval-result':
# Send back the last received eval result. # Send back the last received eval result.
response = last_eval response = last_eval
elif decoded[1] == 'call me':
cmd = '[0,"we called you"]'
print("sending: {}".format(cmd))
self.request.sendall(cmd.encode('utf-8'))
response = "ok"
elif decoded[1] == 'call me again':
cmd = '[0,"we did call you"]'
print("sending: {}".format(cmd))
self.request.sendall(cmd.encode('utf-8'))
response = ""
elif decoded[1] == '!quit!': elif decoded[1] == '!quit!':
# we're done # we're done
self.server.shutdown() self.server.shutdown()
@@ -140,9 +150,12 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
else: else:
response = "what?" response = "what?"
encoded = json.dumps([decoded[0], response]) if response == "":
print("sending: {}".format(encoded)) print("no response")
self.request.sendall(encoded.encode('utf-8')) else:
encoded = json.dumps([decoded[0], response])
print("sending: {}".format(encoded))
self.request.sendall(encoded.encode('utf-8'))
# Negative numbers are used for "eval" responses. # Negative numbers are used for "eval" responses.
elif decoded[0] < 0: elif decoded[0] < 0:

View File

@@ -204,6 +204,35 @@ func Test_server_crash()
call s:run_server('s:server_crash') call s:run_server('s:server_crash')
endfunc endfunc
let s:reply = ""
func s:Handler(chan, msg)
let s:reply = a:msg
endfunc
func s:channel_handler(port)
let chopt = copy(s:chopt)
let chopt['callback'] = 's:Handler'
let handle = ch_open('localhost:' . a:port, chopt)
if handle < 0
call assert_false(1, "Can't open channel")
return
endif
" Test that it works while waiting on a numbered message.
call assert_equal('ok', ch_sendexpr(handle, 'call me'))
sleep 10m
call assert_equal('we called you', s:reply)
" Test that it works while not waiting on a numbered message.
call ch_sendexpr(handle, 'call me again', 0)
sleep 10m
call assert_equal('we did call you', s:reply)
endfunc
func Test_channel_handler()
call s:run_server('s:channel_handler')
endfunc
" Test that trying to connect to a non-existing port fails quickly. " Test that trying to connect to a non-existing port fails quickly.
func Test_connect_waittime() func Test_connect_waittime()
let start = reltime() let start = reltime()

View File

@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1299,
/**/ /**/
1298, 1298,
/**/ /**/