2 * Copyright (c) 2007 Ry Dahl <ry.d4hl@gmail.com>
15 #include "mongrel/parser.h"
19 ebb_server
* ebb_server_new()
21 ebb_server
*server
= g_new0(ebb_server
, 1);
22 server
->socket
= tcp_server_new();
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
);
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;
69 g_string_append_len(client
->buffer
, buffer
, length
);
71 http_parser_execute( client
->parser
74 , client
->parser
->nread
77 if(http_parser_is_finished(client
->parser
)) {
79 int rc
= pthread_create(&thread
, NULL
, ebb_handle_request
, client
);
81 ebb_error("Could not create thread: %s", strerror(errno
));
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
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
;
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
;
131 client
->buffer
= g_string_new("");
134 client
->env
= g_queue_new();
139 void ebb_client_free(ebb_client
*client
)
142 http_parser_finish(client
->parser
);
143 free(client
->parser
);
146 char *ptr
= client
->buffer
->str
;
147 g_string_free(client
->buffer
, FALSE
);
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
);
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);