/** * Sends the status line and response headers to the client. */ static bool httpd_client_send_response(struct httpd_client *client) { char buffer[1024]; GError *error = NULL; GIOStatus status; gsize bytes_written; assert(client != NULL); assert(client->state == RESPONSE); if (!client->metadata_requested) { g_snprintf(buffer, sizeof(buffer), "HTTP/1.1 200 OK\r\n" "Content-Type: %s\r\n" "Connection: close\r\n" "Pragma: no-cache\r\n" "Cache-Control: no-cache, no-store\r\n" "\r\n", client->httpd->content_type); } else { gchar *metadata_header; metadata_header = icy_server_metadata_header( client->httpd->name, client->httpd->genre, client->httpd->website, client->httpd->content_type, client->metaint); g_strlcpy(buffer, metadata_header, sizeof(buffer)); g_free(metadata_header); } status = g_io_channel_write_chars(client->channel, buffer, strlen(buffer), &bytes_written, &error); switch (status) { case G_IO_STATUS_NORMAL: case G_IO_STATUS_AGAIN: return true; case G_IO_STATUS_EOF: /* client has disconnected */ httpd_client_close(client); return false; case G_IO_STATUS_ERROR: /* I/O error */ g_warning("failed to write to client: %s", error->message); g_error_free(error); httpd_client_close(client); return false; } /* unreachable */ httpd_client_close(client); return false; }
/** * Sends the status line and response headers to the client. */ static bool httpd_client_send_response(struct httpd_client *client) { char buffer[1024]; GError *error = NULL; GIOStatus status; gsize bytes_written; assert(client != NULL); assert(client->state == RESPONSE); if (client->dlna_streaming_requested) { g_snprintf(buffer, sizeof(buffer), "HTTP/1.1 206 OK\r\n" "Content-Type: %s\r\n" "Content-Length: 10000\r\n" "Content-RangeX: 0-1000000/1000000\r\n" "transferMode.dlna.org: Streaming\r\n" "Accept-Ranges: bytes\r\n" "Connection: close\r\n" "realTimeInfo.dlna.org: DLNA.ORG_TLAG=*\r\n" "contentFeatures.dlna.org: DLNA.ORG_OP=01;DLNA.ORG_CI=0\r\n" "\r\n", client->httpd->content_type); } else if (client->metadata_requested) { gchar *metadata_header; metadata_header = icy_server_metadata_header( client->httpd->name, client->httpd->genre, client->httpd->website, client->httpd->content_type, client->metaint); g_strlcpy(buffer, metadata_header, sizeof(buffer)); g_free(metadata_header); } else { /* revert to a normal HTTP request */ g_snprintf(buffer, sizeof(buffer), "HTTP/1.1 200 OK\r\n" "Content-Type: %s\r\n" "Connection: close\r\n" "Pragma: no-cache\r\n" "Cache-Control: no-cache, no-store\r\n" "\r\n", client->httpd->content_type); } status = g_io_channel_write_chars(client->channel, buffer, strlen(buffer), &bytes_written, &error); switch (status) { case G_IO_STATUS_NORMAL: case G_IO_STATUS_AGAIN: return true; case G_IO_STATUS_EOF: /* client has disconnected */ httpd_client_close(client); return false; case G_IO_STATUS_ERROR: /* I/O error */ g_warning("failed to write to client: %s", error->message); g_error_free(error); httpd_client_close(client); return false; } /* unreachable */ httpd_client_close(client); return false; }