comparison src/event/ngx_event_openssl.c @ 5020:587dbe2edc5f

SSL: preservation of flush flag for buffered data. Previously, if SSL buffer was not sent we lost information that the data must be flushed.
author Valentin Bartenev <vbart@nginx.com>
date Mon, 28 Jan 2013 15:37:11 +0000
parents 69693a098655
children 674f8739e443
comparison
equal deleted inserted replaced
5019:69693a098655 5020:587dbe2edc5f
1167 buf->last = buf->start; 1167 buf->last = buf->start;
1168 buf->end = buf->start + NGX_SSL_BUFSIZE; 1168 buf->end = buf->start + NGX_SSL_BUFSIZE;
1169 } 1169 }
1170 1170
1171 send = 0; 1171 send = 0;
1172 flush = (in == NULL) ? 1 : 0; 1172 flush = (in == NULL) ? 1 : buf->flush;
1173 1173
1174 for ( ;; ) { 1174 for ( ;; ) {
1175 1175
1176 while (in && buf->last < buf->end && send < limit) { 1176 while (in && buf->last < buf->end && send < limit) {
1177 if (in->buf->last_buf || in->buf->flush) { 1177 if (in->buf->last_buf || in->buf->flush) {
1189 size = buf->end - buf->last; 1189 size = buf->end - buf->last;
1190 } 1190 }
1191 1191
1192 if (send + size > limit) { 1192 if (send + size > limit) {
1193 size = (ssize_t) (limit - send); 1193 size = (ssize_t) (limit - send);
1194 flush = 1;
1195 } 1194 }
1196 1195
1197 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, 1196 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
1198 "SSL buf copy: %d", size); 1197 "SSL buf copy: %d", size);
1199 1198
1208 } 1207 }
1209 } 1208 }
1210 1209
1211 size = buf->last - buf->pos; 1210 size = buf->last - buf->pos;
1212 1211
1213 if (!flush && buf->last < buf->end) { 1212 if (!flush && send < limit && buf->last < buf->end) {
1214 break; 1213 break;
1215 } 1214 }
1216 1215
1217 n = ngx_ssl_write(c, buf->pos, size); 1216 n = ngx_ssl_write(c, buf->pos, size);
1218 1217
1219 if (n == NGX_ERROR) { 1218 if (n == NGX_ERROR) {
1220 return NGX_CHAIN_ERROR; 1219 return NGX_CHAIN_ERROR;
1221 } 1220 }
1222 1221
1223 if (n == NGX_AGAIN) { 1222 if (n == NGX_AGAIN) {
1224 c->buffered |= NGX_SSL_BUFFERED; 1223 break;
1225 return in;
1226 } 1224 }
1227 1225
1228 buf->pos += n; 1226 buf->pos += n;
1229 c->sent += n; 1227 c->sent += n;
1230 1228
1239 1237
1240 if (in == NULL || send == limit) { 1238 if (in == NULL || send == limit) {
1241 break; 1239 break;
1242 } 1240 }
1243 } 1241 }
1242
1243 buf->flush = flush;
1244 1244
1245 if (buf->pos < buf->last) { 1245 if (buf->pos < buf->last) {
1246 c->buffered |= NGX_SSL_BUFFERED; 1246 c->buffered |= NGX_SSL_BUFFERED;
1247 1247
1248 } else { 1248 } else {