|
|
|
@ -58,6 +58,35 @@ int network_write_chunkqueue_openssl(server *srv, connection *con, SSL *ssl, chu
|
|
|
|
|
SSL_set_shutdown(ssl, SSL_RECEIVED_SHUTDOWN); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* evil hack for opera 9.01 and 8.54 and earlier
|
|
|
|
|
* |
|
|
|
|
* opera hangs if the trainling 0\r\n\r\n is in a seperate SSL-packet |
|
|
|
|
* |
|
|
|
|
* we try to move the packet into the previous mem-chunk if possible |
|
|
|
|
*/ |
|
|
|
|
if ((cq == con->write_queue) && |
|
|
|
|
(con->response.transfer_encoding & HTTP_TRANSFER_ENCODING_CHUNKED) && |
|
|
|
|
(con->file_finished)) { |
|
|
|
|
/* merge the last chunk into the previous chunk */ |
|
|
|
|
|
|
|
|
|
fprintf(stderr, "%s.%d: trying to merge final chunk\r\n", __FILE__, __LINE__); |
|
|
|
|
|
|
|
|
|
for(c = cq->first; c && c->next && c->next->next; c = c->next); |
|
|
|
|
|
|
|
|
|
if (c && |
|
|
|
|
c->type == MEM_CHUNK && |
|
|
|
|
c->next && |
|
|
|
|
c->next->type == MEM_CHUNK && |
|
|
|
|
c->next->mem->used == sizeof("0\r\n\r\n") && |
|
|
|
|
0 == strcmp(c->next->mem->ptr, "0\r\n\r\n")) { |
|
|
|
|
fprintf(stderr, "%s.%d: trying to merge final chunk, merged\r\n", __FILE__, __LINE__); |
|
|
|
|
|
|
|
|
|
buffer_append_string_buffer(c->mem, c->next->mem); |
|
|
|
|
|
|
|
|
|
c->next->mem->used = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for(c = cq->first; c; c = c->next) { |
|
|
|
|
int chunk_finished = 0; |
|
|
|
|
|
|
|
|
|