bossan 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/bossan/bossan_ext.c +80 -18
- data/lib/bossan.rb +2 -2
- data/lib/bossan/version.rb +1 -1
- metadata +2 -2
data/ext/bossan/bossan_ext.c
CHANGED
@@ -59,7 +59,7 @@
|
|
59
59
|
|
60
60
|
#define MSG_413 ("HTTP/1.0 413 Request Entity Too Large\r\nContent-Type: text/html\r\nServer: " SERVER "\r\n\r\n<html><head><title>Request Entity Too Large</title></head><body><p>Request Entity Too Large.</p></body></html>")
|
61
61
|
|
62
|
-
#define SERVER "bossan/0.1"
|
62
|
+
#define SERVER "bossan/0.1.4"
|
63
63
|
|
64
64
|
VALUE server; // Bossan
|
65
65
|
|
@@ -110,6 +110,8 @@ static short server_port = 8000;
|
|
110
110
|
|
111
111
|
static int listen_sock; // listen socket
|
112
112
|
|
113
|
+
static char *unix_sock_name = NULL;
|
114
|
+
|
113
115
|
static int loop_done; // main loop flag
|
114
116
|
static picoev_loop* main_loop; //main loop
|
115
117
|
static VALUE rack_app = NULL; //rack app
|
@@ -1847,6 +1849,61 @@ inet_listen(void)
|
|
1847
1849
|
return 1;
|
1848
1850
|
}
|
1849
1851
|
|
1852
|
+
static inline int
|
1853
|
+
check_unix_sockpath(char *sock_name)
|
1854
|
+
{
|
1855
|
+
if(!access(sock_name, F_OK)){
|
1856
|
+
if(unlink(sock_name) < 0){
|
1857
|
+
rb_raise(rb_eIOError, "failed to access sock_name\n");
|
1858
|
+
}
|
1859
|
+
}
|
1860
|
+
return 1;
|
1861
|
+
}
|
1862
|
+
|
1863
|
+
static inline int
|
1864
|
+
unix_listen(char *sock_name)
|
1865
|
+
{
|
1866
|
+
int flag = 1;
|
1867
|
+
struct sockaddr_un saddr;
|
1868
|
+
mode_t old_umask;
|
1869
|
+
|
1870
|
+
#ifdef DEBUG
|
1871
|
+
printf("unix domain socket %s\n", sock_name);
|
1872
|
+
#endif
|
1873
|
+
memset(&saddr, 0, sizeof(saddr));
|
1874
|
+
check_unix_sockpath(sock_name);
|
1875
|
+
|
1876
|
+
if ((listen_sock = socket(AF_UNIX, SOCK_STREAM,0)) == -1) {
|
1877
|
+
rb_raise(rb_eIOError, "server: failed to listen sock\n");
|
1878
|
+
}
|
1879
|
+
|
1880
|
+
if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &flag,
|
1881
|
+
sizeof(int)) == -1) {
|
1882
|
+
close(listen_sock);
|
1883
|
+
rb_raise(rb_eIOError, "server: failed to set sockopt\n");
|
1884
|
+
}
|
1885
|
+
|
1886
|
+
saddr.sun_family = PF_UNIX;
|
1887
|
+
strcpy(saddr.sun_path, sock_name);
|
1888
|
+
|
1889
|
+
old_umask = umask(0);
|
1890
|
+
|
1891
|
+
if (bind(listen_sock, (struct sockaddr *)&saddr, sizeof(saddr)) == -1) {
|
1892
|
+
close(listen_sock);
|
1893
|
+
rb_raise(rb_eIOError, "server: failed to bind\n");
|
1894
|
+
}
|
1895
|
+
umask(old_umask);
|
1896
|
+
|
1897
|
+
// BACKLOG 1024
|
1898
|
+
if (listen(listen_sock, BACKLOG) == -1) {
|
1899
|
+
close(listen_sock);
|
1900
|
+
rb_raise(rb_eIOError, "server: failed to set backlog\n");
|
1901
|
+
}
|
1902
|
+
|
1903
|
+
unix_sock_name = sock_name;
|
1904
|
+
return 1;
|
1905
|
+
}
|
1906
|
+
|
1850
1907
|
static void
|
1851
1908
|
sigint_cb(int signum)
|
1852
1909
|
{
|
@@ -1882,39 +1939,44 @@ bossan_access_log(VALUE self, VALUE args)
|
|
1882
1939
|
return Qnil;
|
1883
1940
|
}
|
1884
1941
|
|
1885
|
-
// Bossan.run('127.0.0.1', 8000, proc do |env|
|
1886
|
-
// ...
|
1887
|
-
// end
|
1888
1942
|
static VALUE
|
1889
|
-
bossan_run_loop(
|
1943
|
+
bossan_run_loop(int argc, VALUE *argv, VALUE self)
|
1890
1944
|
{
|
1891
1945
|
int ret;
|
1946
|
+
VALUE args1, args2, args3;
|
1947
|
+
|
1948
|
+
rb_scan_args(argc, argv, "21", &args1, &args2, &args3);
|
1892
1949
|
|
1893
1950
|
if(listen_sock > 0){
|
1894
1951
|
rb_raise(rb_eException, "already set listen socket");
|
1895
1952
|
}
|
1896
|
-
|
1897
|
-
server_name = StringValuePtr(args1);
|
1898
|
-
server_port = NUM2INT(args2);
|
1899
1953
|
|
1900
|
-
|
1954
|
+
if (argc == 3){
|
1955
|
+
server_name = StringValuePtr(args1);
|
1956
|
+
server_port = NUM2INT(args2);
|
1901
1957
|
|
1902
|
-
|
1903
|
-
// out of range
|
1904
|
-
rb_raise(rb_eArgError, "port number outside valid range");
|
1905
|
-
}
|
1958
|
+
long _port = NUM2INT(args2);
|
1906
1959
|
|
1907
|
-
|
1960
|
+
if (_port <= 0 || _port >= 65536) {
|
1961
|
+
// out of range
|
1962
|
+
rb_raise(rb_eArgError, "port number outside valid range");
|
1963
|
+
}
|
1908
1964
|
|
1909
|
-
|
1965
|
+
server_port = (short)_port;
|
1966
|
+
|
1967
|
+
ret = inet_listen();
|
1968
|
+
rack_app = args3;
|
1969
|
+
} else {
|
1970
|
+
Check_Type(args1, T_STRING);
|
1971
|
+
ret = unix_listen(args1);
|
1972
|
+
rack_app = args2;
|
1973
|
+
}
|
1910
1974
|
|
1911
1975
|
if(ret < 0){
|
1912
1976
|
//error
|
1913
1977
|
listen_sock = -1;
|
1914
1978
|
}
|
1915
1979
|
|
1916
|
-
rack_app = args3;
|
1917
|
-
|
1918
1980
|
if(listen_sock <= 0){
|
1919
1981
|
rb_raise(rb_eTypeError, "not found listen socket");
|
1920
1982
|
}
|
@@ -2013,7 +2075,7 @@ Init_bossan_ext(void)
|
|
2013
2075
|
server = rb_define_module("Bossan");
|
2014
2076
|
rb_gc_register_address(&server);
|
2015
2077
|
|
2016
|
-
rb_define_module_function(server, "run", bossan_run_loop,
|
2078
|
+
rb_define_module_function(server, "run", bossan_run_loop, -1);
|
2017
2079
|
rb_define_module_function(server, "stop", bossan_stop, 0);
|
2018
2080
|
|
2019
2081
|
rb_define_module_function(server, "access_log", bossan_access_log, 1);
|
data/lib/bossan.rb
CHANGED
data/lib/bossan/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bossan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-18 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: high performance asynchronous rack web server
|
15
15
|
email:
|