Optionally determine MIME types using libmagic
This commit is contained in:
parent
b77e4dcc8b
commit
9a9a49ff3a
7
Makefile
7
Makefile
|
@ -1,8 +1,11 @@
|
||||||
|
MAGIC_CFLAGS=-DHAVE_MAGIC
|
||||||
|
MAGIC_LIBS=-lmagic
|
||||||
|
|
||||||
CC=gcc
|
CC=gcc
|
||||||
#CFLAGS+=-O2 -Wall -march=native -pedantic -std=c99 -D_POSIX_C_SOURCE=20120607L -D_XOPEN_SOURCE $(LUA_CFLAGS)
|
#CFLAGS+=-O2 -Wall -march=native -pedantic -std=c99 -D_POSIX_C_SOURCE=20120607L -D_XOPEN_SOURCE $(LUA_CFLAGS)
|
||||||
#CFLAGS+=-O2 -Wall -march=native -pedantic -std=c99 -D_POSIX_C_SOURCE=20120607L
|
#CFLAGS+=-O2 -Wall -march=native -pedantic -std=c99 -D_POSIX_C_SOURCE=20120607L
|
||||||
CFLAGS+=-g -Wall -pedantic -std=c99 -D_POSIX_C_SOURCE=20120607L
|
CFLAGS+=-g -Wall -pedantic -std=c99 -D_POSIX_C_SOURCE=20120607L $(MAGIC_CFLAGS)
|
||||||
LIBS=-lmicrohttpd
|
LIBS=-lmicrohttpd $(MAGIC_LIBS)
|
||||||
|
|
||||||
TARGET=fileshare
|
TARGET=fileshare
|
||||||
SOURCE=main.c logger.c dirlisting.c util.c
|
SOURCE=main.c logger.c dirlisting.c util.c
|
||||||
|
|
37
main.c
37
main.c
|
@ -13,6 +13,10 @@
|
||||||
|
|
||||||
#include <microhttpd.h>
|
#include <microhttpd.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_MAGIC
|
||||||
|
#include <magic.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
#include "templates.h"
|
#include "templates.h"
|
||||||
#include "dirlisting.h"
|
#include "dirlisting.h"
|
||||||
|
@ -31,6 +35,10 @@ struct MHD_Response *error403Response;
|
||||||
struct MHD_Response *error404Response;
|
struct MHD_Response *error404Response;
|
||||||
struct MHD_Response *error500Response;
|
struct MHD_Response *error500Response;
|
||||||
|
|
||||||
|
#ifdef HAVE_MAGIC
|
||||||
|
magic_t magicCookie;
|
||||||
|
#endif
|
||||||
|
|
||||||
int running = 1;
|
int running = 1;
|
||||||
|
|
||||||
void request_completed(void *cls,
|
void request_completed(void *cls,
|
||||||
|
@ -101,7 +109,6 @@ static int connection_handler(void * cls,
|
||||||
return MHD_queue_response(connection, MHD_HTTP_FORBIDDEN, error403Response);
|
return MHD_queue_response(connection, MHD_HTTP_FORBIDDEN, error403Response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// check properties of the target file/dir
|
// check properties of the target file/dir
|
||||||
if(stat(connstate->localFileName, &(connstate->targetStat)) == -1) {
|
if(stat(connstate->localFileName, &(connstate->targetStat)) == -1) {
|
||||||
LOG(LVL_ERR, "Cannot stat %s: %s",
|
LOG(LVL_ERR, "Cannot stat %s: %s",
|
||||||
|
@ -128,6 +135,13 @@ static int connection_handler(void * cls,
|
||||||
connstate->targetStat.st_size,
|
connstate->targetStat.st_size,
|
||||||
fd);
|
fd);
|
||||||
|
|
||||||
|
#ifdef HAVE_MAGIC
|
||||||
|
// if libmagic is available, determine the correct MIME type for the file
|
||||||
|
const char *mimeType = magic_file(magicCookie, connstate->localFileName);
|
||||||
|
LOG(LVL_DEBUG, "MIME type for %s: %s", connstate->localFileName, mimeType);
|
||||||
|
MHD_add_response_header(response, MHD_HTTP_HEADER_CONTENT_TYPE, mimeType);
|
||||||
|
#endif
|
||||||
|
|
||||||
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
|
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
|
||||||
MHD_destroy_response(response);
|
MHD_destroy_response(response);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -209,6 +223,23 @@ int main(int argc, char ** argv) {
|
||||||
port = DEFAULT_PORT;
|
port = DEFAULT_PORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_MAGIC
|
||||||
|
// initialize libmagic
|
||||||
|
magicCookie = magic_open(MAGIC_SYMLINK | MAGIC_MIME_TYPE);
|
||||||
|
if(!magicCookie) {
|
||||||
|
LOG(LVL_ERR, "Cannot allocate magic cookie");
|
||||||
|
} else {
|
||||||
|
// load the default database
|
||||||
|
if(magic_load(magicCookie, NULL) == -1) {
|
||||||
|
LOG(LVL_ERR, "Cannot load default magic database: %s", magic_error(magicCookie));
|
||||||
|
magic_close(magicCookie);
|
||||||
|
magicCookie = 0;
|
||||||
|
} else {
|
||||||
|
LOG(LVL_INFO, "libmagic initialized successfully.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// create the static response for error pages
|
// create the static response for error pages
|
||||||
error403Response = MHD_create_response_from_data(
|
error403Response = MHD_create_response_from_data(
|
||||||
strlen(ERROR_403),
|
strlen(ERROR_403),
|
||||||
|
@ -258,6 +289,10 @@ int main(int argc, char ** argv) {
|
||||||
MHD_destroy_response(error404Response);
|
MHD_destroy_response(error404Response);
|
||||||
MHD_destroy_response(error500Response);
|
MHD_destroy_response(error500Response);
|
||||||
|
|
||||||
|
#ifdef HAVE_MAGIC
|
||||||
|
magic_close(magicCookie);
|
||||||
|
#endif
|
||||||
|
|
||||||
logger_shutdown();
|
logger_shutdown();
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue