@@ -55,7 +55,6 @@ const int HTTPS_SERVER_PORT = 443;
55
55
const int RECV_BUFFER_SIZE = 600 ;
56
56
57
57
const char HTTPS_PATH[] = " /media/uploads/mbed_official/hello.txt" ;
58
- const size_t HTTPS_PATH_LEN = sizeof (HTTPS_PATH) - 1 ;
59
58
60
59
/* Test related data */
61
60
const char *HTTPS_OK_STR = " 200 OK" ;
@@ -110,12 +109,13 @@ class HelloHTTPS {
110
109
_domain (domain), _port(port)
111
110
{
112
111
113
- _error = false ;
114
112
_gothello = false ;
115
113
_got200 = false ;
116
114
_bpos = 0 ;
117
115
_request_sent = 0 ;
118
116
_tcpsocket = new TCPSocket (net_iface);
117
+ _tcpsocket->set_blocking (false );
118
+ _buffer[RECV_BUFFER_SIZE - 1 ] = 0 ;
119
119
120
120
mbedtls_entropy_init (&_entropy);
121
121
mbedtls_ctr_drbg_init (&_ctr_drbg);
@@ -132,6 +132,8 @@ class HelloHTTPS {
132
132
mbedtls_x509_crt_free (&_cacert);
133
133
mbedtls_ssl_free (&_ssl);
134
134
mbedtls_ssl_config_free (&_ssl_conf);
135
+ _tcpsocket->close ();
136
+ delete _tcpsocket;
135
137
}
136
138
/* *
137
139
* Start the test.
@@ -145,11 +147,8 @@ class HelloHTTPS {
145
147
/* Initialize the flags */
146
148
_got200 = false ;
147
149
_gothello = false ;
148
- _error = false ;
149
150
_disconnected = false ;
150
151
_request_sent = false ;
151
- /* Fill the request buffer */
152
- _bpos = snprintf (_buffer, sizeof (_buffer) - 1 , " GET %s HTTP/1.1\n Host: %s\n\n " , path, HTTPS_SERVER_NAME);
153
152
154
153
/*
155
154
* Initialize TLS-related stuf.
@@ -159,14 +158,12 @@ class HelloHTTPS {
159
158
(const unsigned char *) DRBG_PERS,
160
159
sizeof (DRBG_PERS))) != 0 ) {
161
160
print_mbedtls_error (" mbedtls_crt_drbg_init" , ret);
162
- _error = true ;
163
161
return ;
164
162
}
165
163
166
164
if ((ret = mbedtls_x509_crt_parse (&_cacert, (const unsigned char *) SSL_CA_PEM,
167
165
sizeof (SSL_CA_PEM))) != 0 ) {
168
166
print_mbedtls_error (" mbedtls_x509_crt_parse" , ret);
169
- _error = true ;
170
167
return ;
171
168
}
172
169
@@ -175,7 +172,6 @@ class HelloHTTPS {
175
172
MBEDTLS_SSL_TRANSPORT_STREAM,
176
173
MBEDTLS_SSL_PRESET_DEFAULT)) != 0 ) {
177
174
print_mbedtls_error (" mbedtls_ssl_config_defaults" , ret);
178
- _error = true ;
179
175
return ;
180
176
}
181
177
@@ -195,7 +191,6 @@ class HelloHTTPS {
195
191
196
192
if ((ret = mbedtls_ssl_setup (&_ssl, &_ssl_conf)) != 0 ) {
197
193
print_mbedtls_error (" mbedtls_ssl_setup" , ret);
198
- _error = true ;
199
194
return ;
200
195
}
201
196
@@ -210,29 +205,39 @@ class HelloHTTPS {
210
205
ret = _tcpsocket->connect (_domain, _port);
211
206
if (ret != NSAPI_ERROR_OK) {
212
207
mbedtls_printf (" Failed to connect\r\n " );
213
- onError (_tcpsocket, -1 );
208
+ printf (" MBED: Socket Error: %d\r\n " , ret);
209
+ _tcpsocket->close ();
214
210
return ;
215
211
}
216
212
217
213
/* Start the handshake, the rest will be done in onReceive() */
218
214
mbedtls_printf (" Starting the TLS handshake...\r\n " );
219
- ret = mbedtls_ssl_handshake (&_ssl);
215
+ do {
216
+ ret = mbedtls_ssl_handshake (&_ssl);
217
+ } while (ret != 0 && (ret == MBEDTLS_ERR_SSL_WANT_READ ||
218
+ ret == MBEDTLS_ERR_SSL_WANT_WRITE));
220
219
if (ret < 0 ) {
221
- if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
222
- ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
223
- print_mbedtls_error (" mbedtls_ssl_handshake" , ret);
224
- onError (_tcpsocket, -1 );
225
- }
220
+ print_mbedtls_error (" mbedtls_ssl_handshake" , ret);
221
+ _tcpsocket->close ();
226
222
return ;
227
223
}
228
224
229
- ret = mbedtls_ssl_write (&_ssl, (const unsigned char *) _buffer, _bpos);
225
+ /* Fill the request buffer */
226
+ _bpos = snprintf (_buffer, sizeof (_buffer) - 1 ,
227
+ " GET %s HTTP/1.1\n Host: %s\n\n " , path, HTTPS_SERVER_NAME);
228
+
229
+ int offset = 0 ;
230
+ do {
231
+ ret = mbedtls_ssl_write (&_ssl,
232
+ (const unsigned char *) _buffer + offset,
233
+ _bpos - offset);
234
+ if (ret > 0 )
235
+ offset += ret;
236
+ } while (offset < _bpos && (ret > 0 || ret == MBEDTLS_ERR_SSL_WANT_READ ||
237
+ ret == MBEDTLS_ERR_SSL_WANT_WRITE));
230
238
if (ret < 0 ) {
231
- if (ret != MBEDTLS_ERR_SSL_WANT_READ &&
232
- ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
233
- print_mbedtls_error (" mbedtls_ssl_write" , ret);
234
- onError (_tcpsocket, -1 );
235
- }
239
+ print_mbedtls_error (" mbedtls_ssl_write" , ret);
240
+ _tcpsocket->close ();
236
241
return ;
237
242
}
238
243
@@ -256,56 +261,43 @@ class HelloHTTPS {
256
261
257
262
258
263
/* Read data out of the socket */
259
- ret = mbedtls_ssl_read (&_ssl, (unsigned char *) _buffer, sizeof (_buffer));
264
+ offset = 0 ;
265
+ do {
266
+ ret = mbedtls_ssl_read (&_ssl, (unsigned char *) _buffer + offset,
267
+ sizeof (_buffer) - offset - 1 );
268
+ if (ret > 0 )
269
+ offset += ret;
270
+
271
+ /* Check each of the flags */
272
+ _buffer[offset] = 0 ;
273
+ _got200 = _got200 || strstr (_buffer, HTTPS_OK_STR) != NULL ;
274
+ _gothello = _gothello || strstr (_buffer, HTTPS_HELLO_STR) != NULL ;
275
+ } while ( (!_got200 || !_gothello) &&
276
+ (ret > 0 || ret == MBEDTLS_ERR_SSL_WANT_READ ||
277
+ ret == MBEDTLS_ERR_SSL_WANT_WRITE));
260
278
if (ret < 0 ) {
261
- if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) {
262
- print_mbedtls_error (" mbedtls_ssl_read" , ret);
263
- onError (_tcpsocket, -1 );
264
- }
279
+ print_mbedtls_error (" mbedtls_ssl_read" , ret);
265
280
delete[] buf;
281
+ _tcpsocket->close ();
266
282
return ;
267
283
}
268
- _bpos = static_cast <size_t >(ret );
284
+ _bpos = static_cast <size_t >(offset );
269
285
270
286
_buffer[_bpos] = 0 ;
271
287
272
- /* Check each of the flags */
273
- _got200 = _got200 || strstr (_buffer, HTTPS_OK_STR) != NULL ;
274
- _gothello = _gothello || strstr (_buffer, HTTPS_HELLO_STR) != NULL ;
288
+ /* Close socket before status */
289
+ _tcpsocket->close ();
275
290
276
291
/* Print status messages */
277
292
mbedtls_printf (" HTTPS: Received %d chars from server\r\n " , _bpos);
278
293
mbedtls_printf (" HTTPS: Received 200 OK status ... %s\r\n " , _got200 ? " [OK]" : " [FAIL]" );
279
294
mbedtls_printf (" HTTPS: Received '%s' status ... %s\r\n " , HTTPS_HELLO_STR, _gothello ? " [OK]" : " [FAIL]" );
280
295
mbedtls_printf (" HTTPS: Received message:\r\n\r\n " );
281
296
mbedtls_printf (" %s" , _buffer);
282
- _error = !(_got200 && _gothello);
283
297
284
- _tcpsocket->close ();
285
298
delete[] buf;
286
299
}
287
- /* *
288
- * Check if the test has completed.
289
- * @return Returns true if done, false otherwise.
290
- */
291
- bool done () {
292
- return _error || (_got200 && _gothello);
293
- }
294
- /* *
295
- * Check if there was an error
296
- * @return Returns true if there was an error, false otherwise.
297
- */
298
- bool error () {
299
- return _error;
300
- }
301
- /* *
302
- * Closes the TCP socket
303
- */
304
- void close () {
305
- _tcpsocket->close ();
306
- while (!_disconnected)
307
- __WFI ();
308
- }
300
+
309
301
protected:
310
302
/* *
311
303
* Helper for pretty-printing mbed TLS error codes
@@ -375,6 +367,7 @@ class HelloHTTPS {
375
367
if (NSAPI_ERROR_WOULD_BLOCK == recv){
376
368
return MBEDTLS_ERR_SSL_WANT_READ;
377
369
}else if (recv < 0 ){
370
+ mbedtls_printf (" Socket recv error %d\r\n " , recv);
378
371
return -1 ;
379
372
}else {
380
373
return recv;
@@ -390,20 +383,15 @@ class HelloHTTPS {
390
383
size = socket->send (buf, len);
391
384
392
385
if (NSAPI_ERROR_WOULD_BLOCK == size){
393
- return len ;
386
+ return MBEDTLS_ERR_SSL_WANT_WRITE ;
394
387
}else if (size < 0 ){
388
+ mbedtls_printf (" Socket send error %d\r\n " , size);
395
389
return -1 ;
396
390
}else {
397
391
return size;
398
392
}
399
393
}
400
394
401
- void onError (TCPSocket *s, int error) {
402
- printf (" MBED: Socket Error: %d\r\n " , error);
403
- s->close ();
404
- _error = true ;
405
- }
406
-
407
395
protected:
408
396
TCPSocket* _tcpsocket;
409
397
@@ -413,7 +401,6 @@ class HelloHTTPS {
413
401
size_t _bpos; /* *< The current offset in the response buffer */
414
402
volatile bool _got200; /* *< Status flag for HTTPS 200 */
415
403
volatile bool _gothello; /* *< Status flag for finding the test string */
416
- volatile bool _error; /* *< Status flag for an error */
417
404
volatile bool _disconnected;
418
405
volatile bool _request_sent;
419
406
0 commit comments