- list_for_each_entry_safe(hc, tmp, &clients, node) {
- if (hc->status != HTTP_STREAMING &&
- hc->status != HTTP_READY_TO_STREAM)
- continue;
- if (hc->status == HTTP_READY_TO_STREAM) {
- unsigned hlen;
- char *hbuf = vss_get_header(&hlen);
- if (hbuf && hlen > 0 && current_chunk) {
- /* need to send header */
- PARA_INFO_LOG("queueing header: %d\n", hlen);
- if (queue_chunk_or_shutdown(hc, -1U, 0) < 0)
- continue;
- } else
- PARA_INFO_LOG("no need to queue header\n");
- hc->status = HTTP_STREAMING;
- }
- ret = send_queued_chunks(hc);
- if (ret < 0) {
- http_shutdown_client(hc, "queue send error");
- continue;
- }
- if (!len)
- continue;
- if (!ret || write_ok(hc->fd) <= 0) {
- PARA_INFO_LOG("fd %d not ready (%lu bytes queued),"
- " trying to queue chunk\n", hc->fd,
- hc->cq_bytes);
- queue_chunk_or_shutdown(hc, current_chunk, 0);
- continue;
- }
-// PARA_DEBUG_LOG("sending %d -> %s\n", len, CLIENT_ADDR(hc));
- ret = write(hc->fd, buf, len);
-// PARA_DEBUG_LOG("ret: %d\n", ret);
- if (ret < 0) {
- http_shutdown_client(hc, "send error");
- continue;
+ if (!sc->header_sent && current_chunk) {
+ if (header_buf && header_len > 0) {
+ ret = queue_chunk_or_shutdown(sc, ss, header_buf, header_len);
+ if (ret < 0)
+ goto out;