Cleaned up writing. Began work on Ebb::Input.
[ebb.git] / ebb.h
blob59e745c240163ca356cdc03d5a9e4eca1765b190
1 /* Ebb Web Server
2 * Copyright (c) 2007 Ry Dahl <ry.d4hl@gmail.com>
3 * This software is released under the "MIT License". See README file for details.
4 */
6 #include <sys/socket.h>
7 #include <netinet/in.h>
8 #include <glib.h>
9 #include <ev.h>
10 #include "mongrel/parser.h"
12 #ifndef ebb_h
13 #define ebb_h
15 typedef struct ebb_server ebb_server;
16 typedef struct ebb_client ebb_client;
18 #define EBB_LOG_DOMAIN "Ebb"
19 #define ebb_error(str, ...) \
20 g_log(EBB_LOG_DOMAIN, G_LOG_LEVEL_ERROR, str, ## __VA_ARGS__);
21 #define ebb_warning(str, ...) \
22 g_log(EBB_LOG_DOMAIN, G_LOG_LEVEL_WARNING, str, ## __VA_ARGS__);
23 #define ebb_info(str, ...) \
24 g_log(EBB_LOG_DOMAIN, G_LOG_LEVEL_INFO, str, ## __VA_ARGS__);
25 #define ebb_debug(str, ...) \
26 g_log(EBB_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, str, ## __VA_ARGS__);
28 #define EBB_CHUNKSIZE (16*1024)
29 #define EBB_MAX_CLIENTS 950
30 #define EBB_TIMEOUT 30.0
31 #define MAX_ENV 100
32 #define EBB_TCP_COMMON \
33 unsigned open : 1; \
34 int fd; \
35 struct sockaddr_in sockaddr;
37 /*** Ebb Client ***/
39 typedef void (*ebb_client_cb)(ebb_client*);
41 void ebb_client_close(ebb_client*);
42 void ebb_client_write(ebb_client*, const char *data, int length);
43 void ebb_client_start_writing( ebb_client *client
44 , ebb_client_cb after_write_cb
46 /* User must free the GString returned from ebb_client_read_input */
47 GString* ebb_client_read_input(ebb_client *client, ssize_t size);
48 #define ebb_client_add_env(client, field,flen,value,vlen) \
49 client->env_fields[client->env_size] = field; \
50 client->env_field_lengths[client->env_size] = flen; \
51 client->env_values[client->env_size] = value; \
52 client->env_value_lengths[client->env_size] = vlen; \
53 client->env_size += 1;
54 #define ebb_client_add_env_const(client,field,value,vlen) \
55 client->env_fields[client->env_size] = NULL; \
56 client->env_field_lengths[client->env_size] = field; \
57 client->env_values[client->env_size] = value; \
58 client->env_value_lengths[client->env_size] = vlen; \
59 client->env_size += 1;
61 enum { EBB_REQUEST_METHOD
62 , EBB_REQUEST_URI
63 , EBB_FRAGMENT
64 , EBB_REQUEST_PATH
65 , EBB_QUERY_STRING
66 , EBB_HTTP_VERSION
67 , EBB_REQUEST_BODY
68 , EBB_SERVER_NAME
69 , EBB_SERVER_PORT
72 struct ebb_client {
73 EBB_TCP_COMMON
75 ebb_server *server;
76 http_parser parser;
78 char read_buffer[EBB_CHUNKSIZE];
79 ssize_t read;
80 ev_io read_watcher;
82 ev_io write_watcher;
83 GString *write_buffer;
84 ssize_t written;
85 ebb_client_cb after_write_cb;
87 void *data;
89 char *input_head;
90 ssize_t input_head_len;
91 ssize_t input_read;
93 ev_timer timeout_watcher;
95 /* the ENV structure */
96 int env_size;
97 const char *env_fields[MAX_ENV];
98 int env_field_lengths[MAX_ENV];
99 const char *env_values[MAX_ENV];
100 int env_value_lengths[MAX_ENV];
103 /*** Ebb Server ***/
105 typedef void (*ebb_request_cb)(ebb_client*, void*);
107 ebb_server* ebb_server_alloc();
108 void ebb_server_init( ebb_server *server
109 , struct ev_loop *loop
110 , char *address
111 , int port
112 , ebb_request_cb request_cb
113 , void *request_cb_data
115 void ebb_server_free(ebb_server*);
116 void ebb_server_start(ebb_server*);
117 void ebb_server_stop(ebb_server*);
119 struct ebb_server {
120 EBB_TCP_COMMON
121 struct hostent *dns_info;
122 char *port;
123 char *address;
125 void *request_cb_data;
126 ebb_request_cb request_cb;
128 ev_io *request_watcher;
129 struct ev_loop *loop;
131 ebb_client clients[EBB_MAX_CLIENTS];
134 #endif ebb_h