Browse Source

add suppport for file extension based mime type detection.

release0.1.5
Georg Hopp 12 years ago
parent
commit
623a062df7
  1. 13
      assets/html/foo.html
  2. 0
      assets/html/robots.txt
  3. 184
      config/mime.types
  4. 3
      include/http/worker.h
  5. 3
      src/http/Makefile.am
  6. 42
      src/http/worker.c
  7. 42
      src/http/worker/get_mime_type.c
  8. 16
      src/http/worker/process.c

13
assets/html/foo.html

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>This is just foo</title>
</head>
<body>
<h1>A BIG FAT FOO</h1>
</body>
</html>
<!-- vim: set ts=4 sw=4: -->

0
assets/html/robots.txt

184
config/mime.types

@ -0,0 +1,184 @@
evy application/envoy
fif application/fractals
spl application/futuresplash
hta application/hta
acx application/internet-property-stream
hqx application/mac-binhex40
doc application/msword
dot application/msword
* application/octet-stream
oda application/oda
axs application/olescript
pdf application/pdf
prf application/pics-rules
p10 application/pkcs10
crl application/pkix-crl
ai application/postscript
eps application/postscript
ps application/postscript
rtf application/rtf
setpay application/set-payment-initiation
setreg application/set-registration-initiation
xla application/vnd.ms-excel
xlc application/vnd.ms-excel
xlm application/vnd.ms-excel
xls application/vnd.ms-excel
xlt application/vnd.ms-excel
xlw application/vnd.ms-excel
msg application/vnd.ms-outlook
sst application/vnd.ms-pkicertstore
cat application/vnd.ms-pkiseccat
stl application/vnd.ms-pkistl
pot application/vnd.ms-powerpoint
pps application/vnd.ms-powerpoint
ppt application/vnd.ms-powerpoint
mpp application/vnd.ms-project
wcm application/vnd.ms-works
wdb application/vnd.ms-works
wks application/vnd.ms-works
wps application/vnd.ms-works
hlp application/winhlp
bcpio application/x-bcpio
cdf application/x-cdf
z application/x-compress
tgz application/x-compressed
cpio application/x-cpio
csh application/x-csh
dcr application/x-director
dir application/x-director
dxr application/x-director
dvi application/x-dvi
gtar application/x-gtar
gz application/x-gzip
hdf application/x-hdf
ins application/x-internet-signup
isp application/x-internet-signup
iii application/x-iphone
js application/x-javascript
latex application/x-latex
mdb application/x-msaccess
crd application/x-mscardfile
clp application/x-msclip
dll application/x-msdownload
m13 application/x-msmediaview
m14 application/x-msmediaview
mvb application/x-msmediaview
wmf application/x-msmetafile
mny application/x-msmoney
pub application/x-mspublisher
scd application/x-msschedule
trm application/x-msterminal
wri application/x-mswrite
nc application/x-netcdf
pma application/x-perfmon
pmc application/x-perfmon
pml application/x-perfmon
pmr application/x-perfmon
pmw application/x-perfmon
p12 application/x-pkcs12
pfx application/x-pkcs12
p7b application/x-pkcs7-certificates
spc application/x-pkcs7-certificates
p7r application/x-pkcs7-certreqresp
p7c application/x-pkcs7-mime
p7m application/x-pkcs7-mime
p7s application/x-pkcs7-signature
sh application/x-sh
shar application/x-shar
swf application/x-shockwave-flash
sit application/x-stuffit
sv4cpio application/x-sv4cpio
sv4crc application/x-sv4crc
tar application/x-tar
tcl application/x-tcl
tex application/x-tex
texi application/x-texinfo
texinfo application/x-texinfo
roff application/x-troff
t application/x-troff
tr application/x-troff
man application/x-troff-man
me application/x-troff-me
ms application/x-troff-ms
ustar application/x-ustar
src application/x-wais-source
cer application/x-x509-ca-cert
crt application/x-x509-ca-cert
der application/x-x509-ca-cert
pko application/ynd.ms-pkipko
zip application/zip
au audio/basic
snd audio/basic
mid audio/mid
rmi audio/mid
mp3 audio/mpeg
aif audio/x-aiff
aifc audio/x-aiff
aiff audio/x-aiff
m3u audio/x-mpegurl
ra audio/x-pn-realaudio
ram audio/x-pn-realaudio
wav audio/x-wav
bmp image/bmp
cod image/cis-cod
gif image/gif
ief image/ief
jpe image/jpeg
jpeg image/jpeg
jpg image/jpeg
jfif image/pipeg
svg image/svg+xml
tif image/tiff
tiff image/tiff
ras image/x-cmu-raster
cmx image/x-cmx
ico image/x-icon
pnm image/x-portable-anymap
pbm image/x-portable-bitmap
pgm image/x-portable-graymap
ppm image/x-portable-pixmap
rgb image/x-rgb
xbm image/x-xbitmap
xpm image/x-xpixmap
xwd image/x-xwindowdump
mht message/rfc822
mhtml message/rfc822
nws message/rfc822
css text/css
323 text/h323
htm text/html
html text/html
stm text/html
uls text/iuls
bas text/plain
c text/plain
h text/plain
txt text/plain
rtx text/richtext
sct text/scriptlet
tsv text/tab-separated-values
htt text/webviewhtml
htc text/x-component
etx text/x-setext
vcf text/x-vcard
mp2 video/mpeg
mpa video/mpeg
mpe video/mpeg
mpeg video/mpeg
mpg video/mpeg
mpv2 video/mpeg
mov video/quicktime
qt video/quicktime
lsf video/x-la-asf
lsx video/x-la-asf
asf video/x-ms-asf
asr video/x-ms-asf
asx video/x-ms-asf
avi video/x-msvideo
movie video/x-sgi-movie
flr x-world/x-vrml
vrml x-world/x-vrml
wrl x-world/x-vrml
wrz x-world/x-vrml
xaf x-world/x-vrml
xof x-world/x-vrml

3
include/http/worker.h

@ -28,6 +28,7 @@
#include <time.h> #include <time.h>
#include "class.h" #include "class.h"
#include "hash.h"
#include "http/parser.h" #include "http/parser.h"
#include "http/writer.h" #include "http/writer.h"
#include "cbuf.h" #include "cbuf.h"
@ -48,6 +49,8 @@ CLASS(HttpWorker) {
Cbuf pbuf; Cbuf pbuf;
Cbuf wbuf; Cbuf wbuf;
Hash mime_types;
HttpParser parser; HttpParser parser;
HttpWriter writer; HttpWriter writer;
Session session; Session session;

3
src/http/Makefile.am

@ -29,7 +29,8 @@ WORKER = worker.c \
worker/process.c \ worker/process.c \
worker/answer.c \ worker/answer.c \
worker/get_asset.c \ worker/get_asset.c \
worker/add_common_header.c
worker/add_common_header.c \
worker/get_mime_type.c
HEADER = header.c \ HEADER = header.c \
header/to_string.c header/to_string.c

42
src/http/worker.c

@ -24,12 +24,15 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <search.h> #include <search.h>
#include "class.h" #include "class.h"
#include "stream.h" #include "stream.h"
#include "hash.h"
#include "http/worker.h" #include "http/worker.h"
#include "http/parser.h" #include "http/parser.h"
#include "http/writer.h" #include "http/writer.h"
@ -49,6 +52,42 @@ httpWorkerCtor(void * _this, va_list * params)
this->val = va_arg(*params, struct randval *); this->val = va_arg(*params, struct randval *);
/* read all mimetypes in a hash */
this->mime_types = new(Hash);
if (0 == access("./config/mime.types", O_RDONLY)) {
FILE * handle = fopen("./config/mime.types", "r");
if (NULL != handle) {
char buffer[512];
while (NULL != fgets(buffer, 512, handle)) {
char * tmp;
char * key = buffer;
char * value;
size_t nkey;
size_t nvalue;
buffer[511] = '\0';
tmp = memchr(key, ' ', 512);
if (NULL != tmp) {
*tmp = '\0';
}
nkey = tmp - buffer;
value = tmp + 1;
for (; *value == ' ' && value < buffer+512; value++);
nvalue = strlen(value);
hashAdd(this->mime_types,
new(HashValue, key, nkey, value, nvalue));
}
fclose(handle);
}
}
sprintf(cbuf_id, "%s_%s", "parser", id); sprintf(cbuf_id, "%s_%s", "parser", id);
this->pbuf = new(Cbuf, cbuf_id, PARSER_MAX_BUF); this->pbuf = new(Cbuf, cbuf_id, PARSER_MAX_BUF);
@ -84,6 +123,7 @@ httpWorkerDtor(void * _this)
delete(this->writer); delete(this->writer);
if (NULL != this->pbuf) { if (NULL != this->pbuf) {
delete(this->mime_types);
delete(this->pbuf); //!< cloned workers have NULL, so delete won't do anything delete(this->pbuf); //!< cloned workers have NULL, so delete won't do anything
delete(this->wbuf); //!< cloned workers have NULL, so delete won't do anything delete(this->wbuf); //!< cloned workers have NULL, so delete won't do anything
tdestroy(*(this->sroot), tDelete); tdestroy(*(this->sroot), tDelete);
@ -99,6 +139,8 @@ httpWorkerClone(void * _this, void * _base)
this->val = base->val; this->val = base->val;
this->mime_types = base->mime_types;
this->parser = new(HttpParser, base->pbuf); this->parser = new(HttpParser, base->pbuf);
this->writer = new(HttpWriter, base->wbuf); this->writer = new(HttpWriter, base->wbuf);

42
src/http/worker/get_mime_type.c

@ -0,0 +1,42 @@
/**
* \file
*
* \author Georg Hopp
*
* \copyright
* Copyright © 2012 Georg Hopp
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <sys/types.h>
#include "http/worker.h"
#include "utils/memory.h"
#include "hash.h"
char *
httpWorkerGetMimeType(
HttpWorker this,
const char * extension)
{
HashValue mime_type;
mime_type = hashGet(this->mime_types, extension, strlen(extension));
return (char *)mime_type->value;
}
// vim: set ts=4 sw=4:

16
src/http/worker/process.c

@ -47,6 +47,7 @@
HttpMessage httpWorkerGetAsset(HttpRequest, const char *, const char *, size_t); HttpMessage httpWorkerGetAsset(HttpRequest, const char *, const char *, size_t);
void httpWorkerAddCommonHeader(HttpMessage, HttpMessage); void httpWorkerAddCommonHeader(HttpMessage, HttpMessage);
char * httpWorkerGetMimeType(HttpWorker, const char * extension);
ssize_t ssize_t
@ -225,12 +226,25 @@ httpWorkerProcess(HttpWorker this, Stream st)
else { else {
char asset[2048] = "./assets/html"; char asset[2048] = "./assets/html";
char * extension = strrchr(request->path, '.');
char * mime_type = NULL;
char default_mime[] = "application/octet-stream";
if (NULL != extension) {
extension++;
mime_type = httpWorkerGetMimeType(this, extension);
}
if (NULL == mime_type) {
mime_type = default_mime;
}
strcat(asset, request->path); strcat(asset, request->path);
response = httpWorkerGetAsset( response = httpWorkerGetAsset(
request, request,
asset, asset,
CSTRA("text/html"));
mime_type,
strlen(mime_type));
} }
} }

Loading…
Cancel
Save