/**
* \file
*
* \author Georg Hopp
*
* \copyright
* Copyright © 2014 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 .
*/
#include
#include
#include
#include
#include
#include
#include "trbase.h"
#include "trdata.h"
#include "http/worker.h"
#include "http/header.h"
#include "http/message.h"
#include "http/response.h"
#include "http/parser.h"
#include "config/config.h"
#include "config/value.h"
#include "utils/mime_type.h"
HttpMessage httpWorkerGetAsset(HttpWorker, const char *);
void httpWorkerAddCommonHeader(HttpWorker);
void httpWorkerAddComputedHeader(HttpWorker);
extern Config config;
ssize_t
httpWorkerProcess(HttpWorker this, TR_Stream st)
{
ssize_t requests = httpParserParse(this->parser, st);
if (0 > requests) {
return requests;
}
if (0 < requests) {
while (! TR_queueEmpty(this->parser->queue)) {
this->current_request = TR_queueGet(this->parser->queue);
this->current_response = NULL;
/*
* let our observers...application (or better their
* http adapter) try to create an answer.
*/
TR_subjectNotify(this);
if (NULL == this->current_response) {
if (0 == strcmp("POST", this->current_request->method) ||
0 == strcmp("PUT", 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)) {
ConfigValue assets_dir =
configGet(config, CSTRA("assets_dir"));
char asset_path[2048];
char html_asset[] = "/assets/html";
char base_asset[] = "/assets";
char main_asset[] = "/main.html";
char * asset;
char * mime_type;
strcpy(asset_path, (assets_dir->value).string);
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"))) {
strcat(asset_path, html_asset);
} else {
strcat(asset_path, base_asset);
}
strcat(asset_path, asset);
this->current_response =
httpWorkerGetAsset(this, asset_path);
}
}
if (NULL == this->current_response) {
this->current_response = (HttpMessage)httpResponse404();
}
httpWorkerAddCommonHeader(this);
httpWorkerAddComputedHeader(this);
TR_delete(this->current_request);
TR_queuePut(this->writer->queue, this->current_response);
this->current_response = NULL;
}
}
return this->writer->queue->nmsg;
}
// vim: set ts=4 sw=4: