@@ -374,6 +374,47 @@ ssize_t hr_ssl_read(struct corerouter_peer *main_peer) {
374374 return -1 ;
375375}
376376
377+ ssize_t hr_ssl_shutdown (struct corerouter_peer * peer ) {
378+ // ensure no hooks are set
379+ if (uwsgi_cr_set_hooks (peer , NULL , NULL )) return -1 ;
380+
381+ struct corerouter_session * cs = peer -> session ;
382+ struct http_session * hr = (struct http_session * ) cs ;
383+
384+ int ret = SSL_shutdown (hr -> ssl );
385+ if (ret < 0 ) return -1 ;
386+ if (ret == 1 ) return 0 ;
387+
388+ int err = 0 ;
389+
390+ if (ERR_peek_error ()) {
391+ err = SSL_get_error (hr -> ssl , ret );
392+ }
393+
394+ // no error, close the connection
395+ if (err == 0 || err == SSL_ERROR_ZERO_RETURN ) return -1 ;
396+
397+ if (err == SSL_ERROR_WANT_READ ) {
398+ if (uwsgi_cr_set_hooks (peer , hr_ssl_shutdown , NULL )) return -1 ;
399+ return 1 ;
400+ }
401+
402+ else if (err == SSL_ERROR_WANT_WRITE ) {
403+ if (uwsgi_cr_set_hooks (peer , NULL , hr_ssl_shutdown )) return -1 ;
404+ return 1 ;
405+ }
406+
407+ else if (err == SSL_ERROR_SYSCALL ) {
408+ uwsgi_cr_error (peer , "hr_ssl_shutdown()" );
409+ }
410+
411+ else if (err == SSL_ERROR_SSL && uwsgi .ssl_verbose ) {
412+ ERR_print_errors_fp (stderr );
413+ }
414+
415+ return -1 ;
416+ }
417+
377418void hr_setup_ssl (struct http_session * hr , struct uwsgi_gateway_socket * ugs ) {
378419 hr -> ssl = SSL_new (ugs -> ctx );
379420 SSL_set_fd (hr -> ssl , hr -> session .main_peer -> fd );
@@ -382,6 +423,7 @@ void hr_setup_ssl(struct http_session *hr, struct uwsgi_gateway_socket *ugs) {
382423 SSL_set_ex_data (hr -> ssl , uhttp .spdy_index , hr );
383424#endif
384425 uwsgi_cr_set_hooks (hr -> session .main_peer , hr_ssl_read , NULL );
426+ hr -> session .main_peer -> flush = hr_ssl_shutdown ;
385427 hr -> session .close = hr_session_ssl_close ;
386428 hr -> func_write = hr_ssl_write ;
387429}
0 commit comments