some clean ups and debug messages
[ebb.git] / ebb.c
blobce3a8aad3e68af5c7117323c7f877ed6f470f72a
1 /* Ebb Web Server
2 * Copyright (c) 2007 Ry Dahl <ry.d4hl@gmail.com>
3 * All rights reserved.
4 */
6 #include <glib.h>
7 #include <pthread.h>
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include <assert.h>
13 #include <errno.h>
15 #include "mongrel/parser.h"
16 #include "tcp.h"
17 #include "ebb.h"
19 ebb_server* ebb_server_new()
21 ebb_server *server = g_new0(ebb_server, 1);
22 server->socket = tcp_server_new();
23 return server;
26 void ebb_server_free(ebb_server *server)
28 tcp_server_free(server->socket);
31 void ebb_server_stop(ebb_server *server)
33 tcp_server_close(server->socket);
36 const char *ebb_input = "ebb.input";
37 const char *server_name = "SERVER_NAME";
38 const char *server_port = "SERVER_PORT";
39 void* ebb_handle_request(void *_client)
41 ebb_client *client = (ebb_client*)(_client);
43 g_queue_push_head(client->env,
44 ebb_env_pair_new(ebb_input, strlen(ebb_input), client->buffer->str, client->buffer->len));
46 g_queue_push_head(client->env, ebb_env_pair_new2(server_name,
47 tcp_server_address(client->server->socket)));
49 g_queue_push_head(client->env, ebb_env_pair_new2(server_port,
50 client->server->socket->port_s));
52 client->server->request_cb(client, client->server->request_cb_data);
54 ebb_client_free(client);
56 pthread_exit(NULL);
57 return NULL;
60 void ebb_on_read(char *buffer, int length, void *_client)
62 ebb_client *client = (ebb_client*)(_client);
64 // remove the read callback? so this isn't called again?
65 if(http_parser_is_finished(client->parser)) return;
67 assert(client);
69 g_string_append_len(client->buffer, buffer, length);
71 http_parser_execute( client->parser
72 , client->buffer->str
73 , client->buffer->len
74 , client->parser->nread
77 if(http_parser_is_finished(client->parser)) {
78 pthread_t thread;
79 int rc = pthread_create(&thread, NULL, ebb_handle_request, client);
80 if(rc < 0) {
81 ebb_error("Could not create thread: %s", strerror(errno));
82 return;
87 void ebb_on_request(tcp_client *socket, void *data)
89 ebb_server *server = (ebb_server*)(data);
90 ebb_client *client = ebb_client_new(server, socket);
92 socket->read_cb = ebb_on_read;
93 socket->read_cb_data = client;
96 void ebb_server_start(ebb_server *server
97 , char *host
98 , int port
99 , ebb_request_cb_t request_cb
100 , void *request_cb_data
103 server->request_cb = request_cb;
104 server->request_cb_data = request_cb_data;
105 tcp_server_listen(server->socket, host, port, 950, ebb_on_request, server);
108 #include "parser_callbacks.h"
110 ebb_client* ebb_client_new(ebb_server *server, tcp_client *socket)
112 ebb_client *client = g_new0(ebb_client, 1);
114 client->server = server;
115 client->socket = socket;
117 /* http_parser */
118 client->parser = g_new0(http_parser, 1);
119 http_parser_init(client->parser);
120 client->parser->data = client;
121 client->parser->http_field = ebb_http_field_cb;
122 client->parser->request_method = ebb_request_method_cb;
123 client->parser->request_uri = ebb_request_uri_cb;
124 client->parser->fragment = ebb_fragment_cb;
125 client->parser->request_path = ebb_request_path_cb;
126 client->parser->query_string = ebb_query_string_cb;
127 client->parser->http_version = ebb_http_version_cb;
128 client->parser->header_done = ebb_header_done_cb;
130 /* buffer */
131 client->buffer = g_string_new("");
133 /* env */
134 client->env = g_queue_new();
136 return client;
139 void ebb_client_free(ebb_client *client)
141 /* http_parser */
142 http_parser_finish(client->parser);
143 free(client->parser);
145 /* buffer */
146 char *ptr = client->buffer->str;
147 g_string_free(client->buffer, FALSE);
148 free(ptr);
150 /* env */
151 ebb_env_pair *pair;
152 while((pair = g_queue_pop_head(client->env)))
153 ebb_env_pair_free(pair);
154 g_queue_free(client->env);
156 tcp_client_free(client->socket);
158 free(client);
160 g_debug("ebb client freed");
163 ebb_env_pair* ebb_env_pair_new(const char *field, size_t flen, const char *value, size_t vlen)
165 ebb_env_pair *pair = g_new(ebb_env_pair, 1);
166 pair->field = field;
167 pair->flen = flen;
168 pair->value = value;
169 pair->vlen = vlen;
170 return pair;