Mercurial > hg > nginx
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 { |