1 /* A ruby binding to the 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.
13 /* Variables with an underscore are C-level variables */
15 VALUE
client_new(ebb_client
*);
17 VALUE
server_alloc(VALUE self
)
19 ebb_server
*_server
= ebb_server_new();
21 server
= Data_Wrap_Struct(cServer
, 0, ebb_server_free
, _server
);
25 void request_cb(ebb_client
*_client
, void *data
)
27 VALUE server
= (VALUE
)data
;
28 VALUE client
= client_new(_client
);
29 rb_funcall(server
, rb_intern("process"), 1, client
);
32 VALUE
server_start(VALUE server
)
37 Data_Get_Struct(server
, ebb_server
, _server
);
39 host
= rb_iv_get(server
, "@host");
40 Check_Type(host
, T_STRING
);
41 port
= rb_iv_get(server
, "@port");
42 Check_Type(port
, T_FIXNUM
);
44 ebb_server_start(_server
, StringValuePtr(host
), FIX2INT(port
), request_cb
, (void*)server
);
49 VALUE
server_stop(VALUE server
) {
51 Data_Get_Struct(server
, ebb_server
, _server
);
52 ebb_server_stop(_server
);
56 VALUE
client_new(ebb_client
*_client
)
58 return Data_Wrap_Struct(cClient
, 0, ebb_client_free
, _client
);
61 VALUE
client_write(VALUE client
, VALUE string
)
66 Data_Get_Struct(client
, ebb_client
, _client
);
67 written
= tcp_client_write(_client
->socket
, RSTRING_PTR(string
), RSTRING_LEN(string
));
68 return INT2FIX(written
);
71 VALUE
client_env(VALUE client
)
74 VALUE hash
= rb_hash_new();
77 Data_Get_Struct(client
, ebb_client
, _client
);
78 while((pair
= g_queue_pop_head(_client
->env
))) {
80 , rb_str_new(pair
->field
, pair
->flen
) // use symbol?
81 , rb_str_new(pair
->value
, pair
->vlen
)
87 VALUE
client_close(VALUE client
)
91 Data_Get_Struct(client
, ebb_client
, _client
);
92 ebb_client_close(_client
);
98 VALUE mEbb
= rb_define_module("Ebb");
99 cServer
= rb_define_class_under(mEbb
, "Server", rb_cObject
);
100 cClient
= rb_define_class_under(mEbb
, "Client", rb_cObject
);
102 rb_define_alloc_func(cServer
, server_alloc
);
103 rb_define_method(cServer
, "_start", server_start
, 0);
104 rb_define_method(cServer
, "stop", server_stop
, 0);
106 rb_define_method(cClient
, "write", client_write
, 1);
107 rb_define_method(cClient
, "env", client_env
, 0);
108 rb_define_method(cClient
, "close", client_close
, 0);