ry / ebb fork watch download tarball
public
Description: web server
Homepage: http://ebb.rubyforge.org
Clone URL: git://github.com/ry/ebb.git
Search Repo:
Allow starting the Ebb server on arbitrary FD

This allows Ebb to attach to any listening file descriptor,
e.g. a Unix socket or an open socket passed down from any kind
of supervisor software
gnosek (author)
Mon Mar 24 07:34:08 -0700 2008
commit  7b306f2dc60be6209b71f31b92db5a27b62e540f
tree    6981593858367b74e6acaf967915d68accd30e41
parent  878886119da115761ac0f497122d7d207929fe8d
...
16
17
18
19
20
 
 
 
 
 
 
21
22
23
...
16
17
18
 
 
19
20
21
22
23
24
25
26
27
0
@@ -16,8 +16,12 @@ module Ebb
0
     end
0
     
0
     Client::BASE_ENV['rack.multithread'] = threaded_processing
0
-
0
- FFI::server_listen_on_port(port)
0
+
0
+ if options.has_key?(:fileno)
0
+ FFI::server_listen_on_fd(options[:fileno].to_i)
0
+ else
0
+ FFI::server_listen_on_port(port)
0
+ end
0
     @running = true
0
     trap('INT') { stop_server }
0
     
...
475
476
477
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
478
479
480
...
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
 
 
 
 
 
 
 
528
529
530
...
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
...
530
531
532
 
 
 
 
 
 
 
 
 
 
 
 
533
534
535
536
537
538
539
540
541
542
0
@@ -475,6 +475,23 @@ void ebb_server_unlisten(ebb_server *server)
0
   }
0
 }
0
 
0
+int ebb_server_listen_on_fd(ebb_server *server, const int sfd)
0
+{
0
+ set_nonblock(sfd);
0
+
0
+ server->fd = sfd;
0
+ server->port = NULL;
0
+ assert(server->open == FALSE);
0
+ server->open = TRUE;
0
+
0
+ server->request_watcher.data = server;
0
+ ev_init (&server->request_watcher, on_request);
0
+ ev_io_set (&server->request_watcher, server->fd, EV_READ | EV_ERROR);
0
+ ev_io_start (server->loop, &server->request_watcher);
0
+
0
+ return server->fd;
0
+}
0
+
0
 int ebb_server_listen_on_port(ebb_server *server, const int port)
0
 {
0
   int sfd = -1;
0
@@ -513,18 +530,13 @@ int ebb_server_listen_on_port(ebb_server *server, const int port)
0
     perror("listen()");
0
     goto error;
0
   }
0
- server->fd = sfd;
0
- server->port = malloc(sizeof(char)*8); /* for easy access to the port */
0
- sprintf(server->port, "%d", port);
0
- assert(server->open == FALSE);
0
- server->open = TRUE;
0
-
0
- server->request_watcher.data = server;
0
- ev_init (&server->request_watcher, on_request);
0
- ev_io_set (&server->request_watcher, server->fd, EV_READ | EV_ERROR);
0
- ev_io_start (server->loop, &server->request_watcher);
0
-
0
- return server->fd;
0
+
0
+ int ret = ebb_server_listen_on_fd(server, sfd);
0
+ if (ret >= 0) {
0
+ server->port = malloc(sizeof(char)*8); /* for easy access to the port */
0
+ sprintf(server->port, "%d", port);
0
+ }
0
+ return ret;
0
 error:
0
   if(sfd > 0) close(sfd);
0
   return -1;
...
81
82
83
 
84
85
86
...
96
97
98
99
100
 
...
81
82
83
84
85
86
87
...
97
98
99
 
100
101
0
@@ -81,6 +81,7 @@ void ebb_server_init( ebb_server *server
0
                     , ebb_request_cb request_cb
0
                     , void *request_cb_data
0
                     );
0
+int ebb_server_listen_on_fd(ebb_server*, const int sfd);
0
 int ebb_server_listen_on_port(ebb_server*, const int port);
0
 int ebb_server_listen_on_socket(ebb_server*, const char *socketpath);
0
 void ebb_server_unlisten(ebb_server*);
0
@@ -96,4 +97,4 @@ struct ebb_server {
0
   ebb_request_cb request_cb;
0
 };
0
 
0
-#endif
0
\ No newline at end of file
0
+#endif
...
73
74
75
 
 
 
 
 
 
 
76
77
78
...
264
265
266
 
267
268
269
...
73
74
75
76
77
78
79
80
81
82
83
84
85
...
271
272
273
274
275
276
277
0
@@ -73,6 +73,13 @@ void request_cb(ebb_client *client, void *data)
0
   attach_idle_watcher();
0
 }
0
 
0
+VALUE server_listen_on_fd(VALUE _, VALUE sfd)
0
+{
0
+ if(ebb_server_listen_on_fd(server, FIX2INT(sfd)) < 0)
0
+ rb_sys_fail("Problem listening on FD");
0
+ return Qnil;
0
+}
0
+
0
 VALUE server_listen_on_port(VALUE _, VALUE port)
0
 {
0
   if(ebb_server_listen_on_port(server, FIX2INT(port)) < 0)
0
@@ -264,6 +271,7 @@ void Init_ebb_ext()
0
   DEF_GLOBAL(http_version, "HTTP_VERSION");
0
   
0
   rb_define_singleton_method(mFFI, "server_process_connections", server_process_connections, 0);
0
+ rb_define_singleton_method(mFFI, "server_listen_on_fd", server_listen_on_fd, 1);
0
   rb_define_singleton_method(mFFI, "server_listen_on_port", server_listen_on_port, 1);
0
   rb_define_singleton_method(mFFI, "server_unlisten", server_unlisten, 0);
0
   rb_define_singleton_method(mFFI, "server_open?", server_open, 0);
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
0
@@ -0,0 +1,29 @@
0
+require File.dirname(__FILE__) + '/helper'
0
+
0
+class BasicTestFD < ServerTestFD
0
+ def test_get_bytes
0
+ [1,10,1000].each do |i|
0
+ response = get("/bytes/#{i}")
0
+ assert_equal "#{'C'*i.to_i}", response['output']
0
+ end
0
+ end
0
+
0
+ def test_get_unknown
0
+ response = get('/blah')
0
+ assert_equal "Undefined url", response['output']
0
+ end
0
+
0
+ def test_small_posts
0
+ [1,10,321,123,1000].each do |i|
0
+ response = post("/test_post_length", 'C'*i)
0
+ assert_equal 200, response['status']
0
+ end
0
+ end
0
+
0
+ def test_large_post
0
+ [50,60,100].each do |i|
0
+ response = post("/test_post_length", 'C'*1024*i)
0
+ assert_equal 200, response['status']
0
+ end
0
+ end
0
+end
...
84
85
86
 
 
 
 
 
 
 
 
 
 
 
 
 
 
...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
0
@@ -84,3 +84,17 @@ class ServerTest < Test::Unit::TestCase
0
     assert true
0
   end
0
 end
0
+
0
+class ServerTestFD < ServerTest
0
+ def setup
0
+ @tcp_server = TCPServer.new('0.0.0.0', TEST_PORT);
0
+ Thread.new { Ebb.start_server(HelperApp.new, :fileno => @tcp_server.fileno) }
0
+ sleep 0.1 until Ebb.running?
0
+ end
0
+
0
+ def teardown
0
+ super
0
+ @tcp_server = nil
0
+ end
0
+end
0
+

Comments

    No one has commented yet.