process.c
3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/**
* \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 <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <sys/time.h>
#include "class.h"
#include "auth.h"
#include "queue.h"
#include "session.h"
#include "stream.h"
#include "hash.h"
#include "http/worker.h"
#include "http/header.h"
#include "http/message.h"
#include "http/request.h"
#include "http/response.h"
#include "http/parser.h"
#include "interface/subject.h"
#include "utils/memory.h"
#include "utils/mime_type.h"
#include "commons.h"
HttpMessage httpWorkerGetAsset(HttpWorker, const char *);
void httpWorkerAddCommonHeader(HttpWorker);
ssize_t
httpWorkerProcess(HttpWorker this, Stream st)
{
ssize_t requests = httpParserParse(this->parser, st);
if (0 > requests) {
return requests;
}
if (0 < requests) {
while (! queueEmpty(this->parser->queue)) {
this->current_request = queueGet(this->parser->queue);
this->current_response = NULL;
/*
* let our observers...application (or better their
* http adapter) try to create an answer.
*/
subjectNotify(this);
if (0 == strcmp("POST", this->current_request->method)) {
/*
* we can't do post requests on our own...
*/
this->current_response = (HttpMessage)httpResponse500();
}
if (0 == strcmp("GET", this->current_request->method)) {
char html_asset[2048] = "./assets/html";
char base_asset[2048] = "./assets";
char main_asset[] = "/main.html";
char * asset_path = base_asset;
char * asset;
char * mime_type;
if (0 == strcmp("/", this->current_request->path)) {
asset = main_asset;
} else {
asset = this->current_request->path;
}
mime_type = strrchr(asset, '.');
if (NULL != mime_type) {
mime_type++;
mime_type = getMimeType(mime_type, strlen(mime_type));
}
if (NULL != mime_type &&
0 == memcmp(mime_type, CSTRA("text/html"))) {
asset_path = html_asset;
}
strcat(asset_path, asset);
this->current_response =
httpWorkerGetAsset(this, asset_path);
}
if (NULL == this->current_response) {
this->current_response = (HttpMessage)httpResponse404();
}
httpWorkerAddCommonHeader(this);
delete(this->current_request);
queuePut(this->writer->queue, this->current_response);
this->current_response = NULL;
}
}
return this->writer->queue->nmsg;
}
// vim: set ts=4 sw=4: