diff options
Diffstat (limited to 'plugins/HTTPServer/src/MimeHandling.cpp')
-rw-r--r-- | plugins/HTTPServer/src/MimeHandling.cpp | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/plugins/HTTPServer/src/MimeHandling.cpp b/plugins/HTTPServer/src/MimeHandling.cpp new file mode 100644 index 0000000000..42964bfeb3 --- /dev/null +++ b/plugins/HTTPServer/src/MimeHandling.cpp @@ -0,0 +1,147 @@ +#include "Glob.h"
+
+/* MIME type/ext map */
+ContentTypeDB MIME = NULL;
+/* Default Mime type when recognition fails */
+char DefaultMime[] = "application/octet-stream";
+
+int bInitMimeHandling() {
+ FILE *mimeDB;
+ char line[LINE_MAX_SIZE];
+ char *tok = NULL;
+ int lenght;
+ ContentType *pDBCell = NULL;
+ ContentTypeDB pDB = NULL;
+ ExtensionList extListCur = NULL;
+ ExtensionListCell *pExtCell = NULL;
+ char szBuf[10000];
+
+ strcpy(szBuf, szPluginPath);
+ strcat(szBuf, szMimeTypeConfigFile);
+ mimeDB = fopen(szBuf, "r");
+
+ if (mimeDB != NULL) {
+ while (fgets(line, LINE_MAX_SIZE, mimeDB)) {
+ /*filter junk lines assuming Mime type start with letter
+ (convention ?) */
+ if ((line[0] <= 'z' && line[0] >= 'a')
+ || (line[0] <= 'Z' && line[0] >= 'A')) {
+ /*remove comments trailing comments*/
+ tok = strrchr(line, '#');
+ if (tok != NULL) {
+ *tok = '\0';
+ }
+ /* remove trailing \n */
+ lenght = strlen(line);
+ if (lenght > 0 && line[lenght - 1] == '\n') {
+ line[lenght - 1] = '\0';
+ }
+ /* first token = mime type */
+ tok = (char*)strtok(line, " \t");
+ /*create and fill a cell*/
+ pDBCell = (ContentType*)malloc(sizeof(ContentType));
+ pDBCell->mimeType = (char*)malloc(strlen(tok) + 1);
+ strcpy(pDBCell->mimeType, tok);
+ pDBCell->extList = NULL;
+ pDBCell->next = NULL;
+ /* looking for extensions */
+ tok = (char*)strtok(NULL, " \t");
+ while (tok != NULL) {
+ /*create and fill a cell*/
+ pExtCell = (ExtensionListCell*)malloc(sizeof(ExtensionListCell));
+ pExtCell->ext = (char*)malloc(strlen(tok) + 1);
+ strcpy(pExtCell->ext, tok);
+ pExtCell->next = NULL;
+ /*link*/
+ if (pDBCell->extList == NULL) {
+ pDBCell->extList = pExtCell;
+ } else {
+ extListCur->next = pExtCell;
+ }
+ extListCur = pExtCell;
+ tok = (char*)strtok(NULL, " \t");
+ }
+ /* link */
+ if (pDBCell->extList != NULL) { /*extension(s) found*/
+ if (MIME == NULL) {
+ MIME = pDBCell;
+ } else {
+ pDB->next = pDBCell;
+ }
+ pDB = pDBCell;
+ } else { /*no extension found, freeing memory*/
+ free(pDBCell->mimeType);
+ free(pDBCell);
+ }
+ }
+ }
+
+ fclose(mimeDB);
+ }
+ if (MIME == NULL) {
+ return 0;
+ }
+ return 1;
+}
+
+const char * pszGetMimeType(const char * pszFileName) {
+ ContentTypeDB courMIME;
+ ExtensionList courEXT;
+ const char* ext;
+
+ ext = strrchr(pszFileName, '.');
+
+ if (ext != NULL) {
+ if (ext[1] == '\0') {
+ /*empty extension */
+ return DefaultMime;
+ } else {
+ /*remove the "."*/
+ ext = ext + 1;
+ }
+
+ courMIME = MIME;
+ while (courMIME != NULL) {
+ courEXT = courMIME->extList;
+ while (courEXT != NULL) {
+ if (!_stricmp(courEXT->ext, ext)) {
+ return courMIME->mimeType;
+ }
+ courEXT = courEXT->next;
+ }
+ courMIME = courMIME->next;
+ }
+ /*extension unknown*/
+ return DefaultMime;
+ } else {
+ /*no extension*/
+ return DefaultMime;
+ }
+}
+
+
+#ifdef TEST
+void printDB() {
+ ContentTypeDB courMIME;
+ ExtensionList courEXT;
+
+ courMIME = MIME;
+ while (courMIME != NULL) {
+ printf("%s", courMIME->mimeType);
+ courEXT = courMIME->extList;
+ while (courEXT != NULL) {
+ printf(" %s", courEXT->ext);
+ courEXT = courEXT->next;
+ }
+ courMIME = courMIME->next;
+ printf("\n");
+ }
+}
+
+int main(int argc, char* argv[]) {
+ bInitMimeHandling();
+ printDB();
+ printf("%s\n", pszGetMimeType(argv[1]));
+ return 0;
+}
+#endif
|