mk_iov_add_entry(iov,
header_current_time.data,
header_current_time.len,
- mk_iov_crlf, MK_IOV_NOT_FREE_BUF);
+ mk_iov_none, MK_IOV_NOT_FREE_BUF);
/* Connection */
if (config->keep_alive == VAR_ON &&
mk_iov_none, MK_IOV_NOT_FREE_BUF);
mk_iov_add_entry(iov, sh->last_modified.data,
sh->last_modified.len,
- mk_iov_crlf, MK_IOV_NOT_FREE_BUF);
+ mk_iov_none, MK_IOV_NOT_FREE_BUF);
}
/* Content type */
mk_iov_add_entry(iov,
sh->content_type.data,
sh->content_type.len,
- mk_iov_crlf, MK_IOV_NOT_FREE_BUF);
+ mk_iov_none, MK_IOV_NOT_FREE_BUF);
}
/* Transfer Encoding */
if (sh->ranges[0] >= 0 && sh->ranges[1] == -1) {
length = (unsigned int)
(sh->content_length - sh->ranges[0]);
- m_build_buffer(&buffer, &len, "%s %i", RH_CONTENT_LENGTH, length);
+ m_build_buffer(&buffer, &len, "%s%i", RH_CONTENT_LENGTH, length);
mk_iov_add_entry(iov, buffer, len, mk_iov_crlf, MK_IOV_FREE_BUF);
m_build_buffer(&buffer,
else if (sh->content_length >= 0) {
mk_iov_add_entry(iov, mk_rh_content_length.data,
mk_rh_content_length.len,
- mk_iov_space, MK_IOV_NOT_FREE_BUF);
+ mk_iov_none, MK_IOV_NOT_FREE_BUF);
mk_iov_add_entry(iov, sh->content_length_p.data,
sh->content_length_p.len,
- mk_iov_crlf, MK_IOV_NOT_FREE_BUF);
+ mk_iov_none, MK_IOV_NOT_FREE_BUF);
}
if (sh->cgi == SH_NOCGI || sh->breakline == MK_HEADER_BREAKLINE) {
mk_pointer log_current_time;
mk_pointer header_current_time;
-#define GMT_DATEFORMAT "%a, %d %b %Y %H:%M:%S GMT"
+#define GMT_DATEFORMAT "%a, %d %b %Y %H:%M:%S GMT\r\n"
void *mk_clock_worker_init(void *args);
void mk_clock_set_time();
mk_pointer mk_header_short_ct;
/* Accept ranges */
-#define MK_HEADER_ACCEPT_RANGES "Accept-Ranges: bytes"
+#define MK_HEADER_ACCEPT_RANGES "Accept-Ranges: bytes" MK_CRLF
#define MK_HEADER_CONN_KA "Connection: Keep-Alive" MK_CRLF
#define MK_HEADER_CONN_CLOSE "Connection: Close" MK_CRLF
+#define MK_HEADER_CONTENT_LENGTH "Content-Length: "
/* Transfer Encoding */
#define MK_HEADER_TE_TYPE_CHUNKED 0
/* mk pointers with response server headers */
mk_pointer mk_header_conn_ka;
mk_pointer mk_header_conn_close;
+mk_pointer mk_header_content_length;
mk_pointer mk_header_accept_ranges;
mk_pointer mk_header_te_chunked;
mk_pointer mk_header_last_modified;
/* Server response normal headers */
mk_pointer_set(&mk_header_conn_ka, MK_HEADER_CONN_KA);
mk_pointer_set(&mk_header_conn_close, MK_HEADER_CONN_CLOSE);
+ mk_pointer_set(&mk_header_content_length, MK_HEADER_CONTENT_LENGTH);
mk_pointer_set(&mk_header_accept_ranges, MK_HEADER_ACCEPT_RANGES);
mk_pointer_set(&mk_header_te_chunked, MK_HEADER_TE_CHUNKED);
mk_pointer_set(&mk_header_last_modified, MK_HEADER_LAST_MODIFIED);
mk_http_status_list_init();
mk_iov_separators_init();
-// mk_palm_set_env();
-
/* Server */
mk_pointer_set(&mk_monkey_protocol, HTTP_PROTOCOL_11_STR);
#include "str.h"
#include "config.h"
#include "monkey.h"
+#include "request.h"
/* Carga en estructura los mimetypes */
void mk_mimetype_read_config()
{
- char buffer[255], path[MAX_PATH];
- char *name = 0, *type = 0, *last = 0;
- FILE *mime_file;
+ char path[MAX_PATH];
+ struct mk_config *c;
snprintf(path, MAX_PATH, "%s/monkey.mime", config->serverconf);
- if ((mime_file = fopen(path, "r")) == NULL) {
- puts("Error: I can't open monkey.mime file");
- exit(1);
- }
-
- /* Rutina que carga en memoria los mime types */
- while (fgets(buffer, 255, mime_file)) {
- int len;
- len = strlen(buffer);
- if (buffer[len - 1] == '\n') {
- buffer[--len] = 0;
- if (len && buffer[len - 1] == '\r')
- buffer[--len] = 0;
- }
-
- name = strtok_r(buffer, "\"\t ", &last);
- type = strtok_r(NULL, "\"\t ", &last);
-
- if (!name || !type)
- continue;
- if (buffer[0] == '#')
- continue;
+ /* Read configuration file */
+ c = mk_config_create(path);
- if (mk_mimetype_add(name, type, NULL) != 0)
+ while (c) {
+ if (mk_mimetype_add(c->key, c->val, NULL) != 0) {
puts("Error loading Mime Types");
+ }
+ c = c->next;
}
- fclose(mime_file);
+
+ /* Free configuration */
+ mk_config_free(c);
/* Set default mime type */
mimetype_default = mk_mem_malloc_z(sizeof(struct mimetype));
int mk_mimetype_add(char *name, char *type, char *bin_path)
{
-
+ int len;
struct mimetype *new_mime, *aux_mime;
new_mime = mk_mem_malloc_z(sizeof(struct mimetype));
- new_mime->name = mk_string_dup(name);
- mk_pointer_set(&new_mime->type, mk_string_dup(type));
+ new_mime->name = name;
+
+ len = strlen(name) + 2;
+ new_mime->type.data = mk_mem_malloc(len);
+ strcat(new_mime->type.data, MK_CRLF);
+ new_mime->type.len = len;
+
new_mime->script_bin_path = mk_string_dup(bin_path);
new_mime->next = NULL;
int size = 32;
buf = mk_mem_malloc(size);
- len = snprintf(buf, 32, "%i", n);
+ len = snprintf(buf, 32, "%i\r\n", n);
p.data = buf;
p.len = len;