comparison src/event/ngx_event_openssl.c @ 7986:f1fcb0fe6975

SSL: SSL_sendfile(SF_NODISKIO) support.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 27 Dec 2021 19:48:42 +0300
parents 3443c02ca1d1
children b002ad258f1d
comparison
equal deleted inserted replaced
7985:ec2e6893caaa 7986:f1fcb0fe6975
2940 static ssize_t 2940 static ssize_t
2941 ngx_ssl_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size) 2941 ngx_ssl_sendfile(ngx_connection_t *c, ngx_buf_t *file, size_t size)
2942 { 2942 {
2943 #ifdef BIO_get_ktls_send 2943 #ifdef BIO_get_ktls_send
2944 2944
2945 int sslerr; 2945 int sslerr, flags;
2946 ssize_t n; 2946 ssize_t n;
2947 ngx_err_t err; 2947 ngx_err_t err;
2948 2948
2949 ngx_ssl_clear_error(c->log); 2949 ngx_ssl_clear_error(c->log);
2950 2950
2952 "SSL to sendfile: @%O %uz", 2952 "SSL to sendfile: @%O %uz",
2953 file->file_pos, size); 2953 file->file_pos, size);
2954 2954
2955 ngx_set_errno(0); 2955 ngx_set_errno(0);
2956 2956
2957 #if (NGX_HAVE_SENDFILE_NODISKIO)
2958 flags = (c->busy_count <= 2) ? SF_NODISKIO : 0;
2959 #else
2960 flags = 0;
2961 #endif
2962
2957 n = SSL_sendfile(c->ssl->connection, file->file->fd, file->file_pos, 2963 n = SSL_sendfile(c->ssl->connection, file->file->fd, file->file_pos,
2958 size, 0); 2964 size, flags);
2959 2965
2960 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_sendfile: %d", n); 2966 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL_sendfile: %d", n);
2961 2967
2962 if (n > 0) { 2968 if (n > 0) {
2963 2969
2971 return NGX_ERROR; 2977 return NGX_ERROR;
2972 } 2978 }
2973 2979
2974 ngx_post_event(c->read, &ngx_posted_events); 2980 ngx_post_event(c->read, &ngx_posted_events);
2975 } 2981 }
2982
2983 #if (NGX_HAVE_SENDFILE_NODISKIO)
2984 c->busy_count = 0;
2985 #endif
2976 2986
2977 c->sent += n; 2987 c->sent += n;
2978 2988
2979 return n; 2989 return n;
2980 } 2990 }
3035 return NGX_ERROR; 3045 return NGX_ERROR;
3036 } 3046 }
3037 3047
3038 ngx_post_event(c->read, &ngx_posted_events); 3048 ngx_post_event(c->read, &ngx_posted_events);
3039 } 3049 }
3050
3051 #if (NGX_HAVE_SENDFILE_NODISKIO)
3052
3053 if (ngx_errno == EBUSY) {
3054 c->busy_count++;
3055
3056 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
3057 "SSL_sendfile() busy, count:%d", c->busy_count);
3058
3059 if (c->write->posted) {
3060 ngx_delete_posted_event(c->write);
3061 }
3062
3063 ngx_post_event(c->write, &ngx_posted_next_events);
3064 }
3065
3066 #endif
3040 3067
3041 c->write->ready = 0; 3068 c->write->ready = 0;
3042 return NGX_AGAIN; 3069 return NGX_AGAIN;
3043 } 3070 }
3044 3071