|
5 | 5 | __version__ = '0.2.6'
|
6 | 6 |
|
7 | 7 | import usocket as socket
|
| 8 | +import ussl as ssl |
8 | 9 | import utime as time
|
9 | 10 | import ustruct as struct
|
10 | 11 | import uselect as select
|
@@ -125,6 +126,7 @@ def internal_msg(self, *args):
|
125 | 126 | class Connection(Protocol):
|
126 | 127 | SOCK_MAX_TIMEOUT = const(5)
|
127 | 128 | SOCK_TIMEOUT = 0.05
|
| 129 | + SOCK_SSL_TIMEOUT = const(1) |
128 | 130 | EAGAIN = const(11)
|
129 | 131 | ETIMEDOUT = const(60)
|
130 | 132 | RETRIES_TX_DELAY = const(2)
|
@@ -164,15 +166,28 @@ def send(self, data):
|
164 | 166 | try:
|
165 | 167 | retries -= 1
|
166 | 168 | self._last_send_time = ticks_ms()
|
167 |
| - return self._socket.send(data) |
| 169 | + try: |
| 170 | + bytes_written = self._socket.send(data) |
| 171 | + except AttributeError: |
| 172 | + bytes_written = self._socket.write(data) |
| 173 | + return bytes_written |
168 | 174 | except (IOError, OSError):
|
169 | 175 | sleep_ms(self.RETRIES_TX_DELAY)
|
170 | 176 |
|
171 | 177 | def receive(self, length, timeout):
|
172 | 178 | d_buff = b''
|
173 | 179 | try:
|
174 | 180 | self._set_socket_timeout(timeout)
|
175 |
| - d_buff += self._socket.recv(length) |
| 181 | + try: |
| 182 | + d_buff += self._socket.recv(length) |
| 183 | + except AttributeError: |
| 184 | + timeout = self.SOCK_SSL_TIMEOUT |
| 185 | + while not d_buff and timeout > 0: |
| 186 | + ret = self._socket.read(length) |
| 187 | + if ret: |
| 188 | + d_buff += ret |
| 189 | + timeout -= self.SOCK_TIMEOUT |
| 190 | + time.sleep(self.SOCK_TIMEOUT) |
176 | 191 | if len(d_buff) >= length:
|
177 | 192 | d_buff = d_buff[:length]
|
178 | 193 | return d_buff
|
@@ -203,6 +218,13 @@ def _get_socket(self):
|
203 | 218 | self._socket = socket.socket()
|
204 | 219 | self._socket.connect(socket.getaddrinfo(self.server, self.port)[0][-1])
|
205 | 220 | self._set_socket_timeout(self.SOCK_TIMEOUT)
|
| 221 | + if self.port == 443 or self.port == 8443: |
| 222 | + self.log('Using SSL socket...') |
| 223 | + self._socket = ssl.wrap_socket(self._socket) |
| 224 | + # Short reads are not supported in ssl mode. We work around |
| 225 | + # this by setting the socket non blocking and doing manual |
| 226 | + # polling/timeout. |
| 227 | + self._socket.setblocking(False) |
206 | 228 | self.log('Connected to server')
|
207 | 229 | except Exception as g_exc:
|
208 | 230 | raise BlynkError('Server connection failed: {}'.format(g_exc))
|
|
0 commit comments