8 changed files with 222 additions and 0 deletions
-
23include/http/request.h
-
32include/http/request_parser.h
-
17include/http/request_queue.h
-
38src/http/request.c
-
51src/http/request_parser.c
-
11src/logger/add.c
-
30src/logger/log.c
-
20src/logger/syslog.c
@ -0,0 +1,23 @@ |
|||
#ifndef __HTTP_REQUEST_H__ |
|||
#define __HTTP_REQUEST_H__ |
|||
|
|||
#include "cclass.h" |
|||
|
|||
CLASS(HTTP_REQUEST) { |
|||
char * http_version; |
|||
char * uri; |
|||
char * method; |
|||
|
|||
struct { |
|||
char * name; |
|||
char * value; |
|||
} header[128]; |
|||
|
|||
char * body; |
|||
|
|||
unsigned char done; |
|||
}; |
|||
|
|||
#endif /* __HTTP_REQUEST_H__ */ |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,32 @@ |
|||
#ifndef __HTTP_REQUEST_PARSER_H__ |
|||
#define __HTTP_REQUEST_PARSER_H__ |
|||
|
|||
#include "cclass.h" |
|||
#include "server.h" |
|||
#include "http/request.h" |
|||
#include "http/request_queue.h" |
|||
|
|||
#define HTTP_REQUEST_PARSER_READ_CHUNK 1024 |
|||
|
|||
#define HTTP_REQUEST_PARSER_START 0 |
|||
#define HTTP_REQUEST_PARSER_REQUEST_LINE_DONE 1 |
|||
#define HTTP_REQUEST_PARSER_HEADERS_DONE 2 |
|||
#define HTTP_REQUEST_PARSER_DONE 3 |
|||
|
|||
|
|||
CLASS(HTTP_REQUEST_PARSER) { |
|||
server_read_hook get_data; |
|||
|
|||
char * buffer; |
|||
size_t buffer_used; |
|||
|
|||
HTTP_REQUEST_QUEUE request_queue; |
|||
|
|||
unsigned char state; |
|||
}; |
|||
|
|||
void http_request_parser_parse(const char * buffer, size_t size); |
|||
|
|||
#endif /* __HTTP_REQUEST_PARSER_H__ */ |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,17 @@ |
|||
#ifndef __HTTP_REQUEST_QUEUE_H__ |
|||
#define __HTTP_REQUEST_QUEUE_H__ |
|||
|
|||
#include "cclass.h" |
|||
#include "http/request.h" |
|||
|
|||
#define HTTP_REQUEST_QUEUE_MAX 1024 |
|||
|
|||
|
|||
CLASS(HTTP_REQUEST_QUEUE) { |
|||
REQUEST requests[HTTP_REQUEST_QUEUE_MAX]; |
|||
size_t nrequests; |
|||
} |
|||
|
|||
#endif /* __HTTP_REQUEST_QUEUE_H__ */ |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,38 @@ |
|||
#include <stdlib.h> |
|||
|
|||
#include "cclass.h" |
|||
#include "http/request.h" |
|||
|
|||
INIT_CLASS(HTTP_REQUEST); |
|||
|
|||
static void |
|||
_free(void ** data) |
|||
{ |
|||
if (NULL != *data) { |
|||
free(*data); |
|||
} |
|||
} |
|||
|
|||
__construct(LOGGER) {} |
|||
|
|||
__destruct(LOGGER) |
|||
{ |
|||
int i; |
|||
|
|||
_free(&(this->http_version)); |
|||
_free(&(this->uri)); |
|||
_free(&(this->method)); |
|||
|
|||
for (i=0; i<128; i++) { |
|||
_free(&((this->header)[i].name)); |
|||
_free(&((this->header)[i].value)); |
|||
} |
|||
|
|||
_free(&(this->body)); |
|||
} |
|||
|
|||
__jsonConst(LOGGER) {} |
|||
__toJson(LOGGER) {} |
|||
__clear(LOGGER) {} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,51 @@ |
|||
#include <stdlib.h> |
|||
|
|||
#include "cclass.h" |
|||
#include "http/request.h" |
|||
#include "http/request_parser.h" |
|||
|
|||
|
|||
INIT_CLASS(HTTP_REQUEST_PARSER); |
|||
|
|||
|
|||
__construct(LOGGER) |
|||
{ |
|||
this->request_queue = va_arg(*params, HTTP_REQUEST_QUEUE); |
|||
|
|||
this->buffer = malloc(HTTP_REQUEST_PARSER_READ_CHUNK); |
|||
} |
|||
|
|||
__destruct(LOGGER) |
|||
{ |
|||
free(this->buffer); |
|||
} |
|||
|
|||
__jsonConst(LOGGER) {} |
|||
__toJson(LOGGER) {} |
|||
__clear(LOGGER) {} |
|||
|
|||
|
|||
static void |
|||
get_data(HTTP_REQUEST_PARSER this, const char * data, size_t size) |
|||
{ |
|||
size_t remaining, chunks; |
|||
|
|||
remaining = this->buffer_used % HTTP_REQUEST_PARSER_READ_CHUNK; |
|||
chunks = this->buffer_used / HTTP_REQUEST_PARSER_READ_CHUNK; |
|||
|
|||
chunks = (0 == remaining) ? chunks++ : chunks; |
|||
|
|||
if (size > remaining) { |
|||
this->buffer = |
|||
realloc(this->buffer, chunks * HTTP_REQUEST_PARSER_READ_CHUNK); |
|||
} |
|||
|
|||
memcpy(this->buffer + this->buffer_used, data, size); |
|||
this->buffer_used += size; |
|||
} |
|||
|
|||
void http_request_parser_parse(const char * data, size_t size) |
|||
{ |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,11 @@ |
|||
#include "logger.h" |
|||
|
|||
void |
|||
logger_add(LOGGER this, logger_logfnct logfunc) { |
|||
if (this->logfncts_count < MAX_LOG_FNCTS) { |
|||
this->logfncts[this->logfncts_count] = logfunc; |
|||
this->logfncts_count++; |
|||
} |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,30 @@ |
|||
#define _ISOC99_SOURCE |
|||
|
|||
#include <stdio.h> |
|||
#include <string.h> |
|||
|
|||
#include "logger.h" |
|||
|
|||
void |
|||
logger_log(LOGGER this, int level, const char * message, ...) { |
|||
va_list args; |
|||
char buffer[1025]; |
|||
logger_logfnct * logfnct; |
|||
|
|||
int maxBuf = sizeof(buffer)/sizeof(buffer[0]); |
|||
|
|||
memset(buffer, 0, maxBuf); |
|||
|
|||
va_start(args, message); |
|||
vsnprintf(buffer, 1024, message, args); |
|||
va_end(args); |
|||
|
|||
logfnct = this->logfncts; |
|||
|
|||
while (NULL != *logfnct) { |
|||
(*logfnct)(level, buffer); |
|||
logfnct++; |
|||
} |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,20 @@ |
|||
#include <syslog.h> |
|||
|
|||
const int priority[] = { |
|||
LOG_USER | LOG_EMERG, |
|||
LOG_USER | LOG_ALERT, |
|||
LOG_USER | LOG_CRIT, |
|||
LOG_USER | LOG_ERR, |
|||
LOG_USER | LOG_WARNING, |
|||
LOG_USER | LOG_NOTICE, |
|||
LOG_USER | LOG_INFO, |
|||
LOG_USER | LOG_DEBUG |
|||
}; |
|||
|
|||
void |
|||
logger_syslog(int level, const char * msg) |
|||
{ |
|||
syslog(priority[level], "%s", msg); |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue