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; }
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; }