(self, data = "")
| 74 | self.versionSent = 1 |
| 75 | |
| 76 | def sendBytes(self, data = ""): |
| 77 | self.buffer += data |
| 78 | if len(self.buffer) < throttle.SendThrottle().chunkSize and self.sendDataThreadQueue.qsize() > 1: |
| 79 | return True |
| 80 | |
| 81 | while self.buffer and state.shutdown == 0: |
| 82 | isSSL = False |
| 83 | try: |
| 84 | if ((self.services & protocol.NODE_SSL == protocol.NODE_SSL) and |
| 85 | self.connectionIsOrWasFullyEstablished and |
| 86 | protocol.haveSSL(not self.initiatedConnection)): |
| 87 | isSSL = True |
| 88 | amountSent = self.sslSock.send(self.buffer[:throttle.SendThrottle().chunkSize]) |
| 89 | else: |
| 90 | amountSent = self.sock.send(self.buffer[:throttle.SendThrottle().chunkSize]) |
| 91 | except socket.timeout: |
| 92 | continue |
| 93 | except SSLError as e: |
| 94 | if e.errno == SSL_ERROR_WANT_WRITE: |
| 95 | select.select([], [self.sslSock], [], 10) |
| 96 | logger.debug('sock.recv retriable SSL error') |
| 97 | continue |
| 98 | logger.debug('Connection error (SSL)') |
| 99 | return False |
| 100 | except socket.error as e: |
| 101 | if e.errno in (errno.EAGAIN, errno.EWOULDBLOCK) or \ |
| 102 | (sys.platform.startswith('win') and \ |
| 103 | e.errno == errno.WSAEWOULDBLOCK): |
| 104 | select.select([], [self.sslSock if isSSL else self.sock], [], 10) |
| 105 | logger.debug('sock.recv retriable error') |
| 106 | continue |
| 107 | if e.errno in (errno.EPIPE, errno.ECONNRESET, errno.EHOSTUNREACH, errno.ETIMEDOUT, errno.ECONNREFUSED): |
| 108 | logger.debug('Connection error: %s', str(e)) |
| 109 | return False |
| 110 | raise |
| 111 | throttle.SendThrottle().wait(amountSent) |
| 112 | self.lastTimeISentData = int(time.time()) |
| 113 | self.buffer = self.buffer[amountSent:] |
| 114 | return True |
| 115 | |
| 116 | def run(self): |
| 117 | logger.debug('sendDataThread starting. ID: ' + str(id(self)) + '. Number of queues in sendDataQueues: ' + str(len(state.sendDataQueues))) |
no test coverage detected