change mime handler, should test later

This commit is contained in:
lxsang 2016-12-17 12:28:05 +01:00
parent a49dd2c090
commit 634db855de
2 changed files with 64 additions and 103 deletions

View File

@ -22,6 +22,38 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "utils.h"
//define all basic mime here
static mime_t _mimes[] = {
{"image/bmp",(const char *[]){"bmp",NULL},1},
{"image/jpeg",(const char *[]){"jpg","jpeg",NULL},1},
{"text/css",(const char *[]){"css",NULL},0},
{"text/csv",(const char *[]){"csv",NULL},0},
{"application/pdf",(const char *[]){"pdf",NULL},1},
{"image/gif",(const char *[]){"gif",NULL},1},
{"text/html",(const char *[]){"html","htm",NULL},0},
{"application/json",(const char *[]){"json",NULL},0},
{"application/javascript",(const char *[]){"js",NULL},0},
{"image/png",(const char *[]){"png",NULL},1},
{"image/x-portable-pixmap",(const char *[]){"ppm",NULL},1},
{"application/x-rar-compressed",(const char *[]){"rar",NULL},1},
{"image/tiff",(const char *[]){"tiff",NULL},1},
{"application/x-tar",(const char *[]){"tar",NULL},1},
{"text/plain",(const char *[]){"txt",NULL},0},
{"application/x-font-ttf",(const char *[]){"ttf",NULL},1},
{"application/xhtml+xml",(const char *[]){"xhtml",NULL},0},
{"application/xml",(const char *[]){"xml",NULL},0},
{"application/zip",(const char *[]){"zip",NULL},1},
{"image/svg+xml",(const char *[]){"svg",NULL},0},
{"application/vnd.ms-fontobject",(const char *[]){"eot",NULL},1},
{"application/x-font-woff",(const char *[]){"woff","woff2",NULL},1},
{"application/x-font-otf",(const char *[]){"otf",NULL},1},
{"audio/mpeg",(const char *[]){"mp3","mpeg",NULL},1},
{NULL,NULL,0}
};
char* __s(const char* fstring,...)
{
char* data;
@ -119,6 +151,25 @@ char* ext(const char* file)
return ltoken;
}
/*get mime file info from extension*/
mime_t mime_from_ext(const char* ex)
{
for(int i = 0; _mimes[i].type != NULL; i++)
for(int j = 0; _mimes[i].ext[j] != NULL; j++)
{
if(IEQU(ex,_mimes[i].ext[j])) return _mimes[i];
}
return (mime_t){"application/octet-stream",(const char *[]){ext,NULL},1};
}
/*get mime file info from type*/
mime_t mime_from_type(const char* type)
{
for(int i = 0; _mimes[i].type != NULL; i++)
if(strstr(type, _mimes[i].type) != NULL)
return _mimes[i];
return (mime_t){NULL,NULL,0};
}
/**
* Get correct HTTP mime type of a file
* This is a minimalistic mime type list supported
@ -129,113 +180,15 @@ char* ext(const char* file)
char* mime(const char* file)
{
char * ex = ext(file);
if(IEQU(ex,"bmp"))
return "image/bmp";
else if(IEQU(ex,"jpg") || IEQU(ex,"jpeg"))
return "image/jpeg";
else if(IEQU(ex,"css"))
return "text/css";
else if(IEQU(ex,"csv"))
return "text/csv";
else if(IEQU(ex,"pdf"))
return "application/pdf";
else if(IEQU(ex,"gif"))
return "image/gif";
else if(IEQU(ex,"html")||(IEQU(ex,"htm")))
return "text/html";
else if(IEQU(ex,"json"))
return "application/json";
else if(IEQU(ex,"js"))
return "application/javascript";
else if(IEQU(ex,"png"))
return "image/png";
else if(IEQU(ex,"ppm"))
return "image/x-portable-pixmap";
else if(IEQU(ex,"rar"))
return "application/x-rar-compressed";
else if(IEQU(ex,"tiff"))
return "image/tiff";
else if(IEQU(ex,"tar"))
return "application/x-tar";
else if(IEQU(ex,"txt"))
return "text/plain";
else if(IEQU(ex,"ttf"))
return "application/x-font-ttf";
else if(IEQU(ex,"xhtml"))
return "application/xhtml+xml";
else if(IEQU(ex,"xml"))
return "application/xml";
else if(IEQU(ex,"zip"))
return "application/zip";
else if(IEQU(ex,"svg"))
return "image/svg+xml";
else if(IEQU(ex,"eot"))
return "application/vnd.ms-fontobject";
else if(IEQU(ex,"woff") || IEQU(ex,"woff2"))
return "application/x-font-woff";
else if(IEQU(ex,"otf"))
return "application/x-font-otf";
//audio
else if(IEQU(ex,"mp3"))
return "audio/mpeg";
else
// The other type will be undestant as binary
return "application/octet-stream";
mime_t m = mime_from_ext(ex);
return m.type;
}
int is_bin(const char* file)
{
char * ex = ext(file);
if(IEQU(ex,"bmp"))
return true;
else if(IEQU(ex,"jpg") || IEQU(ex,"jpeg"))
return true;
else if(IEQU(ex,"css"))
return false;
else if(IEQU(ex,"csv"))
return false;
else if(IEQU(ex,"pdf"))
return true;
else if(IEQU(ex,"gif"))
return true;
else if(IEQU(ex,"html")||(IEQU(ex,"htm")))
return false;
else if(IEQU(ex,"json"))
return false;
else if(IEQU(ex,"js"))
return false;
else if(IEQU(ex,"png"))
return true;
else if(IEQU(ex,"ppm"))
return true;
else if(IEQU(ex,"rar"))
return true;
else if(IEQU(ex,"tiff"))
return true;
else if(IEQU(ex,"tar"))
return true;
else if(IEQU(ex,"txt"))
return false;
else if(IEQU(ex,"ttf"))
return true;
else if(IEQU(ex,"xhtml"))
return false;
else if(IEQU(ex,"xml"))
return false;
else if(IEQU(ex,"zip"))
return true;
else if(IEQU(ex,"svg"))
return false;
else if(IEQU(ex,"eot"))
return true;
else if(IEQU(ex,"woff") || IEQU(ex,"woff2"))
return true;
else if(IEQU(ex,"otf"))
return true;
else
// The other type will be undestant as binary
return true;
//return "application/octet-stream";
mime_t m = mime_from_ext(ex);
return m.bin;
}
int match_int(const char* search)

View File

@ -67,7 +67,13 @@ THE SOFTWARE.
#define RPC_TYPE_I4 235//hash("i4")
#define RPC_TYPE_STRING 17//hash("string")
#define RPC_TYPE_NIL 529//hash("nil")
typedef struct{
const char* type;
const char** ext;
int bin;
} mime_t;
char* __s(const char*,...);
void trim(char*,const char);
void removeAll(const char* path,int mode);
@ -83,6 +89,8 @@ char *url_decode(const char *str);
char *url_encode(const char *str);
char from_hex(char ch);
char to_hex(char code);
mime_t mime_from_type(const char* type);
mime_t mime_from_ext(const char* ex);
unsigned hash(const char*, int);
unsigned simple_hash(const char*);
int is_file(const char* f);