2 * Copyright (c) 2007 Ry Dahl <ry.d4hl@gmail.com>
3 * This software is released under the "MIT License". See README file for details.
6 #include <sys/socket.h>
7 #include <netinet/in.h>
10 #include "mongrel/parser.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
32 #define EBB_TCP_COMMON \
35 struct sockaddr_in sockaddr;
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
78 char read_buffer
[EBB_CHUNKSIZE
];
83 GString
*write_buffer
;
85 ebb_client_cb after_write_cb
;
90 ssize_t input_head_len
;
93 ev_timer timeout_watcher
;
95 /* the ENV structure */
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
];
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
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
*);
121 struct hostent
*dns_info
;
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
];