bossan 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|