summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliris <liris.pp@gmail.com>2018-08-14 15:00:20 +0900
committerGitHub <noreply@github.com>2018-08-14 15:00:20 +0900
commit4894f14f1e91d01cda5f91e278ee6cc3824a232a (patch)
tree309a6f6a47a726870fd373de969502d4e77caeb6
parent038e002ff90205755d5eb35cd9036bd39b0eec62 (diff)
parent43f2823db39f78939307e31c9dfaff878c635efb (diff)
downloadwebsocket-client-4894f14f1e91d01cda5f91e278ee6cc3824a232a.tar.gz
Merge pull request #446 from nneonneo/master
Fix #414: proper handling of close method.
-rw-r--r--websocket/_core.py22
1 files changed, 14 insertions, 8 deletions
diff --git a/websocket/_core.py b/websocket/_core.py
index 04d909d..aea16e6 100644
--- a/websocket/_core.py
+++ b/websocket/_core.py
@@ -24,6 +24,7 @@ from __future__ import print_function
import socket
import struct
import threading
+import time
import six
@@ -398,14 +399,19 @@ class WebSocket(object):
reason, ABNF.OPCODE_CLOSE)
sock_timeout = self.sock.gettimeout()
self.sock.settimeout(timeout)
- try:
- frame = self.recv_frame()
- if isEnabledForError():
- recv_status = struct.unpack("!H", frame.data[0:2])[0]
- if recv_status != STATUS_NORMAL:
- error("close status: " + repr(recv_status))
- except:
- pass
+ start_time = time.time()
+ while timeout is None or time.time() - start_time < timeout:
+ try:
+ frame = self.recv_frame()
+ if frame.opcode != ABNF.OPCODE_CLOSE:
+ continue
+ if isEnabledForError():
+ recv_status = struct.unpack("!H", frame.data[0:2])[0]
+ if recv_status != STATUS_NORMAL:
+ error("close status: " + repr(recv_status))
+ break
+ except:
+ break
self.sock.settimeout(sock_timeout)
self.sock.shutdown(socket.SHUT_RDWR)
except: