[xiph-commits] r9440 - icecast/trunk/icecast/src
karl at motherfish-iii.xiph.org
karl at motherfish-iii.xiph.org
Sat Jun 11 10:21:04 PDT 2005
Author: karl
Date: 2005-06-11 10:21:00 -0700 (Sat, 11 Jun 2005)
New Revision: 9440
Modified:
icecast/trunk/icecast/src/fserve.c
icecast/trunk/icecast/src/fserve.h
Log:
update file serving setup and processing. Do http header writing in fserve
thread by using generic write routine. small leak plugged on failure case.
extend mime type handling slightly for rare case
Modified: icecast/trunk/icecast/src/fserve.c
===================================================================
--- icecast/trunk/icecast/src/fserve.c 2005-06-11 13:39:00 UTC (rev 9439)
+++ icecast/trunk/icecast/src/fserve.c 2005-06-11 17:21:00 UTC (rev 9440)
@@ -31,6 +31,7 @@
#else
#include <winsock2.h>
#include <windows.h>
+#define snprintf _snprintf
#endif
#include "thread/thread.h"
@@ -252,10 +253,13 @@
/* process this client, if it is ready */
if (fclient->ready)
{
+ client_t *client = fclient->client;
+ refbuf_t *refbuf = client->refbuf;
fclient->ready = 0;
- if(fclient->offset >= fclient->datasize) {
+ if (client->pos == refbuf->len)
+ {
/* Grab a new chunk */
- bytes = fread(fclient->buf, 1, BUFSIZE, fclient->file);
+ bytes = fread (refbuf->data, 1, BUFSIZE, fclient->file);
if (bytes == 0)
{
fserve_t *to_go = fclient;
@@ -266,21 +270,14 @@
client_tree_changed = 1;
continue;
}
- fclient->offset = 0;
- fclient->datasize = bytes;
+ refbuf->len = bytes;
+ client->pos = 0;
}
/* Now try and send current chunk. */
- sbytes = client_send_bytes (fclient->client,
- &fclient->buf[fclient->offset],
- fclient->datasize - fclient->offset);
+ sbytes = format_generic_write_to_client (client);
- /* TODO: remove clients if they take too long. */
- if(sbytes > 0) {
- fclient->offset += sbytes;
- }
-
- if (fclient->client->con->error)
+ if (client->con->error)
{
fserve_t *to_go = fclient;
fclient = fclient->next;
@@ -340,32 +337,33 @@
return "text/css";
else if(!strcmp(ext, "txt"))
return "text/plain";
+ else if(!strcmp(ext, "jpg"))
+ return "image/jpeg";
+ else if(!strcmp(ext, "png"))
+ return "image/png";
else
return "application/octet-stream";
}
}
-static void fserve_client_destroy(fserve_t *client)
+static void fserve_client_destroy(fserve_t *fclient)
{
- if(client) {
- if(client->buf)
- free(client->buf);
- if(client->file)
- fclose(client->file);
+ if (fclient)
+ {
+ if (fclient->file)
+ fclose (fclient->file);
- if(client->client)
- client_destroy(client->client);
- free(client);
+ if (fclient->client)
+ client_destroy (fclient->client);
+ free (fclient);
}
}
int fserve_client_create(client_t *httpclient, const char *path)
{
- fserve_t *client = calloc(1, sizeof(fserve_t));
+ fserve_t *client;
int bytes;
- int client_limit;
- ice_config_t *config = config_get_config();
struct stat file_buf;
char *range = NULL;
int64_t new_content_len = 0;
@@ -373,24 +371,31 @@
int rangeproblem = 0;
int ret = 0;
- client_limit = config->client_limit;
- config_release_config();
+ if (stat (path, &file_buf) != 0)
+ {
+ client_send_404 (httpclient, "The file you requested could not be found");
+ return 0;
+ }
- client->file = fopen(path, "rb");
- if(!client->file) {
- client_send_404(httpclient, "File not readable");
- return -1;
+ client = calloc (1, sizeof(fserve_t));
+ if (client == NULL)
+ {
+ client_send_404 (httpclient, "memory exhausted");
+ return 0;
}
+ client->file = fopen (path, "rb");
+ if (client->file == NULL)
+ {
+ client_send_404 (httpclient, "File not readable");
+ fserve_client_destroy (client);
+ return 0;
+ }
client->client = httpclient;
- client->offset = 0;
- client->datasize = 0;
client->ready = 0;
- client->content_length = 0;
- client->buf = malloc(BUFSIZE);
- if (stat(path, &file_buf) == 0) {
- client->content_length = (int64_t)file_buf.st_size;
- }
+ client_set_queue (httpclient, NULL);
+ httpclient->refbuf = refbuf_new (BUFSIZE);
+ client->content_length = (int64_t)file_buf.st_size;
range = httpp_getvar (client->client->parser, "range");
@@ -429,7 +434,7 @@
strflen = strftime(currenttime, 50, "%a, %d-%b-%Y %X GMT",
gmtime_r(&now, &result));
httpclient->respcode = 206;
- bytes = sock_write(httpclient->con->sock,
+ bytes = snprintf (httpclient->refbuf->data, BUFSIZE,
"HTTP/1.1 206 Partial Content\r\n"
"Date: %s\r\n"
"Content-Length: " FORMAT_INT64 "\r\n"
@@ -442,13 +447,11 @@
endpos,
client->content_length,
fserve_content_type(path));
- if(bytes > 0) httpclient->con->sent_bytes = bytes;
}
else {
httpclient->respcode = 416;
- bytes = sock_write(httpclient->con->sock,
+ bytes = snprintf (httpclient->refbuf->data, BUFSIZE,
"HTTP/1.0 416 Request Range Not Satisfiable\r\n\r\n");
- if(bytes > 0) httpclient->con->sent_bytes = bytes;
fserve_client_destroy(client);
return -1;
}
@@ -457,9 +460,8 @@
/* If we run into any issues with the ranges
we fallback to a normal/non-range request */
httpclient->respcode = 416;
- bytes = sock_write(httpclient->con->sock,
+ bytes = snprintf (httpclient->refbuf->data, BUFSIZE,
"HTTP/1.0 416 Request Range Not Satisfiable\r\n\r\n");
- if(bytes > 0) httpclient->con->sent_bytes = bytes;
fserve_client_destroy(client);
return -1;
}
@@ -467,15 +469,14 @@
else {
httpclient->respcode = 200;
- bytes = sock_write(httpclient->con->sock,
+ bytes = snprintf (httpclient->refbuf->data, BUFSIZE,
"HTTP/1.0 200 OK\r\n"
"Content-Length: " FORMAT_INT64 "\r\n"
"Content-Type: %s\r\n\r\n",
client->content_length,
fserve_content_type(path));
- if(bytes > 0) httpclient->con->sent_bytes = bytes;
}
-
+ httpclient->refbuf->len = bytes;
stats_event_inc (NULL, "file_connections");
sock_set_blocking(client->client->con->sock, SOCK_NONBLOCK);
sock_set_nodelay(client->client->con->sock);
@@ -513,8 +514,11 @@
mimetypes = avl_tree_new(_compare_mappings, NULL);
- if(!mimefile)
+ if (mimefile == NULL)
+ {
+ WARN1 ("Cannot open mime type file %s", fn);
return;
+ }
while(fgets(line, 4096, mimefile))
{
Modified: icecast/trunk/icecast/src/fserve.h
===================================================================
--- icecast/trunk/icecast/src/fserve.h 2005-06-11 13:39:00 UTC (rev 9439)
+++ icecast/trunk/icecast/src/fserve.h 2005-06-11 17:21:00 UTC (rev 9440)
@@ -21,11 +21,8 @@
client_t *client;
FILE *file;
- int offset;
int64_t content_length;
- int datasize;
int ready;
- unsigned char *buf;
struct _fserve_t *next;
} fserve_t;
More information about the commits
mailing list