예제 #1
0
char *mime_extension( char *filename ) {
	char *key = filename;
	char *dot = filename;
	int i = 0;

	/* Search file ending */
	while( (dot = strchr( key, '.')) != NULL ) {
		key = dot+1;
		i++;
	}
	
	/* No '.' found */
	if( i == 0 ) {
		return NULL;
	}

	/* bla.7z.001, bla.7z.002 */
	if( str_isNumber( key ) ) {
		/* Cut number */
		key--;
		*key = '\0';

		return mime_extension( filename );
	}

	/* Panic mode */
	if( strlen( key) > 5 ) {
		return NULL;
	}

	return key;
}
예제 #2
0
int http_range_simple(TCP_NODE * n, RESPONSE * r,
		      char *filename, size_t filesize,
		      char *p_range, size_t * content_length)
{
	char *p_start = NULL;
	char *p_stop = NULL;
	size_t range_start = 0;
	size_t range_stop = 0;
	char range[BUF_SIZE];

	if (filesize == 0) {
		return FALSE;
	}

	memset(range, '\0', BUF_SIZE);
	strncpy(range, p_range, BUF_OFF1);

	strncpy(r->data.file.filename, filename, BUF_OFF1);

	p_start = range;

	if ((p_stop = strchr(p_start, '-')) == NULL) {
		return FALSE;
	}
	*p_stop = '\0';
	p_stop++;

	if (*p_start == '\0') {
		range_start = 0;
	} else if (str_isNumber(p_start)) {
		range_start = atol(p_start);
	} else {
		return FALSE;
	}

	if (*p_stop == '\0') {
		range_stop = filesize - 1;
	} else if (str_isNumber(p_stop)) {
		range_stop = atol(p_stop);
	} else {
		return FALSE;
	}

	if (range_start < 0 || range_start >= filesize) {
		return FALSE;
	}

	if (range_stop < range_start) {
		return FALSE;
	}

	/* Be liberal: Patch the range stop if the end is beyond the end of
	 * the file. Other webservers also behave like this. zsync uses a stop
	 * marker, that is beyond the file limits for example... */
	if (range_stop >= filesize) {
		range_stop = filesize - 1;
	}

	r->data.file.f_offset = range_start;
	r->data.file.f_stop = range_stop;
	*content_length += r->data.file.f_stop + 1 - r->data.file.f_offset;

	/* Success */
	return TRUE;
}