ruby-lsapi 2.8 → 2.9
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/lsapi/lsapidef.h +18 -16
- data/ext/lsapi/lsapilib.c +52 -55
- data/ext/lsapi/lsapilib.h +1 -1
- data/ext/lsapi/lsruby.c +59 -116
- metadata +2 -2
data/ext/lsapi/lsapidef.h
CHANGED
@@ -31,7 +31,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
31
|
*/
|
32
32
|
|
33
33
|
/***************************************************************************
|
34
|
-
$Id: lsapidef.h,v 1.
|
34
|
+
$Id: lsapidef.h,v 1.15 2008/01/03 18:31:50 gwang Exp $
|
35
35
|
-------------------
|
36
36
|
begin : Thu Feb 10 2005
|
37
37
|
author : George Wang
|
@@ -79,9 +79,9 @@ enum
|
|
79
79
|
#define LSAPI_SOCK_FILENO 0
|
80
80
|
|
81
81
|
#define LSAPI_VERSION_B0 'L'
|
82
|
-
#define LSAPI_VERSION_B1 'S'
|
82
|
+
#define LSAPI_VERSION_B1 'S'
|
83
83
|
|
84
|
-
|
84
|
+
/* Values for m_flag in lsapi_packet_header */
|
85
85
|
#define LSAPI_ENDIAN_LITTLE 0
|
86
86
|
#define LSAPI_ENDIAN_BIG 1
|
87
87
|
#define LSAPI_ENDIAN_BIT 1
|
@@ -92,7 +92,7 @@ enum
|
|
92
92
|
#define LSAPI_ENDIAN LSAPI_ENDIAN_BIG
|
93
93
|
#endif
|
94
94
|
|
95
|
-
|
95
|
+
/* Values for m_type in lsapi_packet_header */
|
96
96
|
#define LSAPI_BEGIN_REQUEST 1
|
97
97
|
#define LSAPI_ABORT_REQUEST 2
|
98
98
|
#define LSAPI_RESP_HEADER 3
|
@@ -111,24 +111,26 @@ enum
|
|
111
111
|
|
112
112
|
struct lsapi_packet_header
|
113
113
|
{
|
114
|
-
char m_versionB0;
|
114
|
+
char m_versionB0; /* LSAPI protocol version */
|
115
115
|
char m_versionB1;
|
116
116
|
char m_type;
|
117
117
|
char m_flag;
|
118
118
|
union
|
119
119
|
{
|
120
|
-
int32_t m_iLen;
|
120
|
+
int32_t m_iLen; /* include this header */
|
121
121
|
char m_bytes[4];
|
122
122
|
}m_packetLen;
|
123
123
|
};
|
124
124
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
125
|
+
/*
|
126
|
+
LSAPI request header packet
|
127
|
+
|
128
|
+
1. struct lsapi_req_header
|
129
|
+
2. struct lsapi_http_header_index
|
130
|
+
3. lsapi_header_offset * unknownHeaders
|
131
|
+
4. org http request header
|
132
|
+
5. request body if available
|
133
|
+
*/
|
132
134
|
|
133
135
|
struct lsapi_req_header
|
134
136
|
{
|
@@ -136,9 +138,9 @@ struct lsapi_req_header
|
|
136
138
|
|
137
139
|
int32_t m_httpHeaderLen;
|
138
140
|
int32_t m_reqBodyLen;
|
139
|
-
int32_t m_scriptFileOff;
|
140
|
-
int32_t m_scriptNameOff;
|
141
|
-
int32_t m_queryStringOff;
|
141
|
+
int32_t m_scriptFileOff; /* path to the script file. */
|
142
|
+
int32_t m_scriptNameOff; /* decrypted URI, without pathinfo, */
|
143
|
+
int32_t m_queryStringOff; /* Query string inside env */
|
142
144
|
int32_t m_requestMethodOff;
|
143
145
|
int32_t m_cntUnknownHeaders;
|
144
146
|
int32_t m_cntEnv;
|
data/ext/lsapi/lsapilib.c
CHANGED
@@ -73,7 +73,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
73
73
|
static int g_inited = 0;
|
74
74
|
static int g_running = 1;
|
75
75
|
static int s_ppid;
|
76
|
-
LSAPI_Request g_req;
|
76
|
+
LSAPI_Request g_req = { -1, -1 };
|
77
77
|
|
78
78
|
void Flush_RespBuf_r( LSAPI_Request * pReq );
|
79
79
|
|
@@ -155,7 +155,7 @@ static void lsapi_signal(int signo, sighandler_t handler)
|
|
155
155
|
static inline void lsapi_buildPacketHeader( struct lsapi_packet_header * pHeader,
|
156
156
|
char type, int len )
|
157
157
|
{
|
158
|
-
pHeader->m_versionB0 = LSAPI_VERSION_B0;
|
158
|
+
pHeader->m_versionB0 = LSAPI_VERSION_B0; /* LSAPI protocol version */
|
159
159
|
pHeader->m_versionB1 = LSAPI_VERSION_B1;
|
160
160
|
pHeader->m_type = type;
|
161
161
|
pHeader->m_flag = LSAPI_ENDIAN;
|
@@ -186,25 +186,27 @@ static inline int lsapi_read( int fd, void * pBuf, int len )
|
|
186
186
|
}
|
187
187
|
}
|
188
188
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
189
|
+
/*
|
190
|
+
static int lsapi_write( int fd, const void * pBuf, int len )
|
191
|
+
{
|
192
|
+
int ret;
|
193
|
+
const char * pCur;
|
194
|
+
const char * pEnd;
|
195
|
+
if ( len == 0 )
|
196
|
+
return 0;
|
197
|
+
pCur = (const char *)pBuf;
|
198
|
+
pEnd = pCur + len;
|
199
|
+
while( g_running && (pCur < pEnd) )
|
200
|
+
{
|
201
|
+
ret = write( fd, pCur, pEnd - pCur );
|
202
|
+
if ( ret >= 0)
|
203
|
+
pCur += ret;
|
204
|
+
else if (( ret == -1 )&&( errno != EINTR ))
|
205
|
+
return ret;
|
206
|
+
}
|
207
|
+
return pCur - (const char *)pBuf;
|
208
|
+
}
|
209
|
+
*/
|
208
210
|
|
209
211
|
static int lsapi_writev( int fd, struct iovec ** pVec, int count, int totalLen )
|
210
212
|
{
|
@@ -250,18 +252,19 @@ static int lsapi_writev( int fd, struct iovec ** pVec, int count, int totalLen )
|
|
250
252
|
return totalLen - left;
|
251
253
|
}
|
252
254
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
255
|
+
/*
|
256
|
+
static int getTotalLen( struct iovec * pVec, int count )
|
257
|
+
{
|
258
|
+
struct iovec * pEnd = pVec + count;
|
259
|
+
int total = 0;
|
260
|
+
while( pVec < pEnd )
|
261
|
+
{
|
262
|
+
total += pVec->iov_len;
|
263
|
+
++pVec;
|
264
|
+
}
|
265
|
+
return total;
|
266
|
+
}
|
267
|
+
*/
|
265
268
|
|
266
269
|
static inline int allocateBuf( LSAPI_Request * pReq, int size )
|
267
270
|
{
|
@@ -677,7 +680,7 @@ static struct lsapi_packet_header finish = {'L', 'S',
|
|
677
680
|
|
678
681
|
int LSAPI_Finish_r( LSAPI_Request * pReq )
|
679
682
|
{
|
680
|
-
|
683
|
+
/* finish req body */
|
681
684
|
if ( !pReq )
|
682
685
|
return -1;
|
683
686
|
if (pReq->m_reqState)
|
@@ -769,6 +772,8 @@ static int readBodyToReqBuf( LSAPI_Request * pReq )
|
|
769
772
|
|
770
773
|
int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq )
|
771
774
|
{
|
775
|
+
if (!pReq || (pReq->m_fd ==-1) )
|
776
|
+
return EOF;
|
772
777
|
if ( pReq->m_bufProcessed >= pReq->m_bufRead )
|
773
778
|
{
|
774
779
|
if ( readBodyToReqBuf( pReq ) <= 0 )
|
@@ -788,7 +793,7 @@ int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, int bufLen, int *
|
|
788
793
|
char * pBufCur = pBuf;
|
789
794
|
char * pCur;
|
790
795
|
char * p;
|
791
|
-
if (!pReq || ( !pBuf )||(bufLen < 0 )|| !getLF )
|
796
|
+
if (!pReq || (pReq->m_fd ==-1) ||( !pBuf )||(bufLen < 0 )|| !getLF )
|
792
797
|
return -1;
|
793
798
|
*getLF = 0;
|
794
799
|
while( (left = pBufEnd - pBufCur ) > 0 )
|
@@ -831,8 +836,8 @@ int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int bufLen )
|
|
831
836
|
{
|
832
837
|
int len;
|
833
838
|
int total;
|
834
|
-
|
835
|
-
if (!pReq || ( !pBuf )||(bufLen < 0 ))
|
839
|
+
/* char *pOldBuf = pBuf; */
|
840
|
+
if (!pReq || (pReq->m_fd ==-1) || ( !pBuf )||(bufLen < 0 ))
|
836
841
|
return -1;
|
837
842
|
|
838
843
|
total = pReq->m_pHeader->m_reqBodyLen - pReq->m_reqBodyRead;
|
@@ -876,11 +881,6 @@ int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int bufLen )
|
|
876
881
|
}
|
877
882
|
|
878
883
|
|
879
|
-
//int LSAPI_Write( const char * pBuf, int len )
|
880
|
-
//{
|
881
|
-
// return LSAPI_Write_r( &g_req, pBuf, len );
|
882
|
-
//}
|
883
|
-
|
884
884
|
int LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, int len )
|
885
885
|
{
|
886
886
|
struct lsapi_packet_header * pHeader;
|
@@ -1035,8 +1035,10 @@ int LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, int len )
|
|
1035
1035
|
struct iovec iov[2];
|
1036
1036
|
struct iovec *pIov;
|
1037
1037
|
|
1038
|
-
if (
|
1038
|
+
if ( !pReq )
|
1039
1039
|
return -1;
|
1040
|
+
if (( pReq->m_fd == -1 )||(pReq->m_fd == pReq->m_fdListen ))
|
1041
|
+
return write( 2, pBuf, len );
|
1040
1042
|
if ( pReq->m_pRespBufPos != pReq->m_pRespBuf )
|
1041
1043
|
{
|
1042
1044
|
LSAPI_Flush_r( pReq );
|
@@ -1305,7 +1307,7 @@ int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, char * pBuf, int len )
|
|
1305
1307
|
memmove( pReq->m_pRespHeaderBufPos, pBuf, len );
|
1306
1308
|
pReq->m_pRespHeaderBufPos += len;
|
1307
1309
|
*pReq->m_pRespHeaderBufPos++ = 0;
|
1308
|
-
++len;
|
1310
|
+
++len; /* add one byte padding for \0 */
|
1309
1311
|
pReq->m_respHeaderLen[pReq->m_respHeader.m_respInfo.m_cntHeaders] = len;
|
1310
1312
|
++pReq->m_respHeader.m_respInfo.m_cntHeaders;
|
1311
1313
|
return 0;
|
@@ -1526,8 +1528,8 @@ int LSAPI_Init_Prefork_Server( int max_children, fn_select_t fp, int avoidFork )
|
|
1526
1528
|
g_prefork_server->m_iAvoidFork = avoidFork;
|
1527
1529
|
g_prefork_server->m_iMaxChildren = max_children;
|
1528
1530
|
|
1529
|
-
g_prefork_server->m_iExtraChildren = ( avoidFork ) ? 0 : max_children / 3 ;
|
1530
|
-
g_prefork_server->m_iMaxIdleChildren = ( avoidFork ) ? (max_children + 1) : max_children / 3;
|
1531
|
+
g_prefork_server->m_iExtraChildren = ( avoidFork ) ? 0 : (max_children / 3) ;
|
1532
|
+
g_prefork_server->m_iMaxIdleChildren = ( avoidFork ) ? (max_children + 1) : (max_children / 3);
|
1531
1533
|
g_prefork_server->m_iChildrenMaxIdleTime = 300;
|
1532
1534
|
g_prefork_server->m_iMaxReqProcessTime = 300;
|
1533
1535
|
return 0;
|
@@ -1715,7 +1717,8 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
|
|
1715
1717
|
int wait_secs = 0;
|
1716
1718
|
int ret = 0;
|
1717
1719
|
int pid;
|
1718
|
-
time_t lastTime = 0
|
1720
|
+
time_t lastTime = 0;
|
1721
|
+
time_t curTime = 0;
|
1719
1722
|
fd_set readfds;
|
1720
1723
|
struct timeval timeout;
|
1721
1724
|
|
@@ -1794,7 +1797,7 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
|
|
1794
1797
|
{
|
1795
1798
|
if ( errno == EINTR )
|
1796
1799
|
continue;
|
1797
|
-
|
1800
|
+
/* perror( "select()" ); */
|
1798
1801
|
break;
|
1799
1802
|
}
|
1800
1803
|
else
|
@@ -1850,7 +1853,7 @@ static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Re
|
|
1850
1853
|
}
|
1851
1854
|
sigaction( SIGUSR1, &old_usr1, 0 );
|
1852
1855
|
kill( -getpgrp(), SIGUSR1 );
|
1853
|
-
lsapi_all_children_must_die();
|
1856
|
+
lsapi_all_children_must_die(); /* Sorry, children ;-) */
|
1854
1857
|
return -1;
|
1855
1858
|
|
1856
1859
|
}
|
@@ -1997,13 +2000,7 @@ void LSAPI_No_Check_ppid()
|
|
1997
2000
|
s_ppid = 0;
|
1998
2001
|
}
|
1999
2002
|
|
2000
|
-
#if defined(__APPLE__)
|
2001
|
-
#include <crt_externs.h>
|
2002
|
-
#define environ (*_NSGetEnviron())
|
2003
|
-
#else
|
2004
2003
|
extern char ** environ;
|
2005
|
-
#endif
|
2006
|
-
|
2007
2004
|
static void unset_lsapi_envs()
|
2008
2005
|
{
|
2009
2006
|
char **env = environ;
|
data/ext/lsapi/lsapilib.h
CHANGED
@@ -120,7 +120,7 @@ typedef struct lsapi_request
|
|
120
120
|
extern LSAPI_Request g_req;
|
121
121
|
|
122
122
|
|
123
|
-
|
123
|
+
/* return: >0 continue, ==0 stop, -1 failed */
|
124
124
|
typedef int (*LSAPI_CB_EnvHandler )( const char * pKey, int keyLen,
|
125
125
|
const char * pValue, int valLen, void * arg );
|
126
126
|
|
data/ext/lsapi/lsruby.c
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
|
2
2
|
#include "ruby.h"
|
3
|
+
#include "util.h"
|
3
4
|
|
4
5
|
#include "lsapilib.h"
|
5
6
|
#include <errno.h>
|
@@ -8,8 +9,9 @@
|
|
8
9
|
#include <signal.h>
|
9
10
|
#include <sys/socket.h>
|
10
11
|
#include <sys/wait.h>
|
12
|
+
#include <unistd.h>
|
11
13
|
|
12
|
-
|
14
|
+
/* RUBY_EXTERN VALUE ruby_errinfo; */
|
13
15
|
RUBY_EXTERN VALUE rb_stdin;
|
14
16
|
RUBY_EXTERN VALUE rb_stdout;
|
15
17
|
#if RUBY_VERSION_CODE < 180
|
@@ -30,7 +32,7 @@ static VALUE env_copy;
|
|
30
32
|
static VALUE lsapi_env;
|
31
33
|
|
32
34
|
|
33
|
-
static VALUE lsapi_objrefs;
|
35
|
+
/* static VALUE lsapi_objrefs; */
|
34
36
|
|
35
37
|
typedef struct lsapi_data
|
36
38
|
{
|
@@ -49,15 +51,7 @@ static lsapi_data * s_req_data;
|
|
49
51
|
static VALUE s_req_stderr = Qnil;
|
50
52
|
static lsapi_data * s_stderr_data;
|
51
53
|
|
52
|
-
|
53
|
-
//static int s_cur_children = 0;
|
54
|
-
//static int s_req_processed = 0;
|
55
|
-
//static int s_max_reqs = 1000000;
|
56
|
-
//static int s_max_idle_secs = 60;
|
57
|
-
//static int s_listenFd = -1;
|
58
|
-
//static int s_ppid = 0;
|
59
|
-
//static int s_max_grp_idle_secs = 0;
|
60
|
-
|
54
|
+
/*
|
61
55
|
static void lsapi_ruby_setenv(const char *name, const char *value)
|
62
56
|
{
|
63
57
|
if (!name) return;
|
@@ -67,25 +61,25 @@ static void lsapi_ruby_setenv(const char *name, const char *value)
|
|
67
61
|
else
|
68
62
|
ruby_unsetenv(name);
|
69
63
|
}
|
70
|
-
|
64
|
+
*/
|
71
65
|
|
72
66
|
|
73
67
|
static void lsapi_mark( lsapi_data * data )
|
74
68
|
{
|
75
69
|
rb_gc_mark( data->env );
|
76
70
|
}
|
77
|
-
|
71
|
+
/*
|
78
72
|
static void lsapi_free_data( lsapi_data * data )
|
79
73
|
{
|
80
|
-
|
74
|
+
free( data );
|
81
75
|
}
|
82
|
-
|
76
|
+
*/
|
83
77
|
static int add_env_rails( const char * pKey, int keyLen, const char * pValue, int valLen,
|
84
78
|
void * arg )
|
85
79
|
{
|
86
80
|
char * p;
|
87
81
|
int len;
|
88
|
-
|
82
|
+
/* Fixup some environment variables for rails */
|
89
83
|
switch( *pKey )
|
90
84
|
{
|
91
85
|
case 'Q':
|
@@ -102,8 +96,10 @@ static int add_env_rails( const char * pKey, int keyLen, const char * pValue, in
|
|
102
96
|
if ( p )
|
103
97
|
{
|
104
98
|
len = valLen - ( p - pValue ) - 1;
|
105
|
-
|
106
|
-
|
99
|
+
/*
|
100
|
+
valLen = p - pValue;
|
101
|
+
*p++ = 0;
|
102
|
+
*/
|
107
103
|
}
|
108
104
|
else
|
109
105
|
{
|
@@ -134,7 +130,7 @@ static int add_env_rails( const char * pKey, int keyLen, const char * pValue, in
|
|
134
130
|
break;
|
135
131
|
}
|
136
132
|
|
137
|
-
|
133
|
+
/* lsapi_ruby_setenv(pKey, pValue ); */
|
138
134
|
|
139
135
|
rb_hash_aset( lsapi_env,rb_tainted_str_new(pKey, keyLen),
|
140
136
|
rb_tainted_str_new(pValue, valLen));
|
@@ -156,7 +152,7 @@ fn_add_env s_fn_add_env = add_env_no_fix;
|
|
156
152
|
|
157
153
|
static void clear_env()
|
158
154
|
{
|
159
|
-
|
155
|
+
/* rb_funcall( lsapi_env, rb_intern( "clear" ), 0 ); */
|
160
156
|
rb_funcall( lsapi_env, rb_intern( "replace" ), 1, env_copy );
|
161
157
|
}
|
162
158
|
|
@@ -174,11 +170,6 @@ static void setup_cgi_env( lsapi_data * data )
|
|
174
170
|
|
175
171
|
static VALUE lsapi_s_accept( VALUE self )
|
176
172
|
{
|
177
|
-
int fd;
|
178
|
-
int ret;
|
179
|
-
int wait_secs;
|
180
|
-
fd_set readfds;
|
181
|
-
struct timeval timeout;
|
182
173
|
|
183
174
|
if ( LSAPI_Prefork_Accept_r( &g_req ) == -1 )
|
184
175
|
return Qnil;
|
@@ -190,7 +181,7 @@ static VALUE lsapi_s_accept( VALUE self )
|
|
190
181
|
|
191
182
|
}
|
192
183
|
|
193
|
-
|
184
|
+
/*
|
194
185
|
static int chdir_file( const char * pFile )
|
195
186
|
{
|
196
187
|
char * p = strrchr( pFile, '/' );
|
@@ -202,6 +193,7 @@ static int chdir_file( const char * pFile )
|
|
202
193
|
*p = '/';
|
203
194
|
return ret;
|
204
195
|
}
|
196
|
+
*/
|
205
197
|
|
206
198
|
static VALUE lsapi_eval_string_wrap(VALUE self, VALUE str)
|
207
199
|
{
|
@@ -222,12 +214,14 @@ static VALUE lsapi_process( VALUE self )
|
|
222
214
|
const char * pScriptPath;
|
223
215
|
Data_Get_Struct(self,lsapi_data, data);
|
224
216
|
pScriptPath = LSAPI_GetScriptFileName_r( data->req );
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
217
|
+
/*
|
218
|
+
if ( chdir_file( pScriptPath ) == -1 )
|
219
|
+
{
|
220
|
+
lsapi_send_error( 404 );
|
221
|
+
}
|
222
|
+
rb_load_file( pScriptPath );
|
223
|
+
*/
|
224
|
+
return Qnil;
|
231
225
|
}
|
232
226
|
|
233
227
|
|
@@ -248,7 +242,7 @@ static VALUE lsapi_write( VALUE self, VALUE str )
|
|
248
242
|
lsapi_data *data;
|
249
243
|
int len;
|
250
244
|
Data_Get_Struct(self,lsapi_data, data);
|
251
|
-
|
245
|
+
/* len = LSAPI_Write_r( data->req, RSTRING(str)->ptr, RSTRING(str)->len ); */
|
252
246
|
if (TYPE(str) != T_STRING)
|
253
247
|
str = rb_obj_as_string(str);
|
254
248
|
len = (*data->fn_write)( data->req, RSTRING(str)->ptr, RSTRING(str)->len );
|
@@ -361,8 +355,10 @@ static VALUE lsapi_addstr(VALUE out, VALUE str)
|
|
361
355
|
|
362
356
|
static VALUE lsapi_flush( VALUE self )
|
363
357
|
{
|
364
|
-
|
365
|
-
|
358
|
+
/*
|
359
|
+
lsapi_data *data;
|
360
|
+
Data_Get_Struct(self,lsapi_data, data);
|
361
|
+
*/
|
366
362
|
LSAPI_Flush_r( &g_req );
|
367
363
|
return Qnil;
|
368
364
|
}
|
@@ -370,8 +366,10 @@ static VALUE lsapi_flush( VALUE self )
|
|
370
366
|
static VALUE lsapi_getc( VALUE self )
|
371
367
|
{
|
372
368
|
int ch;
|
373
|
-
|
374
|
-
|
369
|
+
/*
|
370
|
+
lsapi_data *data;
|
371
|
+
Data_Get_Struct(self,lsapi_data, data);
|
372
|
+
*/
|
375
373
|
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self))
|
376
374
|
{
|
377
375
|
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
|
@@ -412,7 +410,6 @@ static VALUE lsapi_gets( VALUE self )
|
|
412
410
|
static VALUE lsapi_read(int argc, VALUE *argv, VALUE self)
|
413
411
|
{
|
414
412
|
VALUE str;
|
415
|
-
//lsapi_data *data;
|
416
413
|
int n;
|
417
414
|
int remain;
|
418
415
|
char buff[8192];
|
@@ -422,7 +419,6 @@ static VALUE lsapi_read(int argc, VALUE *argv, VALUE self)
|
|
422
419
|
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
|
423
420
|
}
|
424
421
|
|
425
|
-
//Data_Get_Struct(self, lsapi_data, data);
|
426
422
|
|
427
423
|
remain = LSAPI_GetReqBodyRemain_r( &g_req );
|
428
424
|
if ( remain <= 0 )
|
@@ -446,7 +442,7 @@ static VALUE lsapi_read(int argc, VALUE *argv, VALUE self)
|
|
446
442
|
}
|
447
443
|
else if ( n <= 0 )
|
448
444
|
{
|
449
|
-
|
445
|
+
/* FIXME: broken connection */
|
450
446
|
break;
|
451
447
|
}
|
452
448
|
}
|
@@ -457,45 +453,35 @@ static VALUE lsapi_read(int argc, VALUE *argv, VALUE self)
|
|
457
453
|
|
458
454
|
static VALUE lsapi_eof(VALUE self)
|
459
455
|
{
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
456
|
+
/*
|
457
|
+
lsapi_data *data;
|
458
|
+
|
459
|
+
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self))
|
460
|
+
{
|
461
|
+
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
|
462
|
+
}
|
463
|
+
Data_Get_Struct(self, lsapi_data, data);
|
464
|
+
*/
|
467
465
|
return (LSAPI_GetReqBodyRemain( &g_req ) <= 0) ? Qtrue : Qfalse;
|
468
466
|
}
|
469
467
|
|
470
468
|
static VALUE lsapi_binmode(VALUE self)
|
471
469
|
{
|
472
|
-
// if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
|
473
|
-
// rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
|
474
|
-
// }
|
475
470
|
return self;
|
476
471
|
}
|
477
472
|
|
478
473
|
static VALUE lsapi_isatty(VALUE self)
|
479
474
|
{
|
480
|
-
// if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
|
481
|
-
// rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
|
482
|
-
// }
|
483
475
|
return Qfalse;
|
484
476
|
}
|
485
477
|
|
486
478
|
static VALUE lsapi_sync(VALUE self)
|
487
479
|
{
|
488
|
-
// if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
|
489
|
-
// rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
|
490
|
-
// }
|
491
480
|
return Qfalse;
|
492
481
|
}
|
493
482
|
|
494
483
|
static VALUE lsapi_setsync(VALUE self,VALUE sync)
|
495
484
|
{
|
496
|
-
// if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
|
497
|
-
// rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
|
498
|
-
// }
|
499
485
|
return Qfalse;
|
500
486
|
}
|
501
487
|
|
@@ -508,10 +494,10 @@ static VALUE lsapi_close(VALUE self)
|
|
508
494
|
|
509
495
|
static VALUE lsapi_reopen( int argc, VALUE *argv, VALUE self)
|
510
496
|
{
|
511
|
-
VALUE orig_verbose;
|
497
|
+
VALUE orig_verbose;
|
512
498
|
if ( self == s_req_stderr )
|
513
499
|
{
|
514
|
-
|
500
|
+
/* constant silence hack */
|
515
501
|
orig_verbose = (VALUE)ruby_verbose;
|
516
502
|
ruby_verbose = Qnil;
|
517
503
|
|
@@ -530,61 +516,18 @@ static VALUE lsapi_reopen( int argc, VALUE *argv, VALUE self)
|
|
530
516
|
void Init_lsapi()
|
531
517
|
{
|
532
518
|
VALUE remove_env;
|
533
|
-
|
534
|
-
VALUE orig_verbose; // constant silence hack
|
519
|
+
VALUE orig_verbose;
|
535
520
|
char * p;
|
536
521
|
|
537
522
|
LSAPI_Init();
|
538
523
|
|
539
524
|
LSAPI_Init_Env_Parameters( rb_thread_select );
|
540
|
-
/*
|
541
|
-
p = getenv( "LSAPI_CHILDREN" );
|
542
|
-
if ( p )
|
543
|
-
{
|
544
|
-
n = atoi( p );
|
545
|
-
ruby_unsetenv( "LSAPI_CHILDREN" );
|
546
|
-
}
|
547
|
-
if ( n > 1 )
|
548
|
-
{
|
549
|
-
LSAPI_Init_Prefork_Server( n, rb_thread_select );
|
550
|
-
LSAPI_Set_Server_fd( g_req.m_fdListen );
|
551
|
-
}
|
552
|
-
|
553
|
-
p = getenv( "LSAPI_MAX_REQS" );
|
554
|
-
if ( p )
|
555
|
-
{
|
556
|
-
n = atoi( p );
|
557
|
-
if ( n > 0 )
|
558
|
-
LSAPI_Set_Max_Req( n );
|
559
|
-
ruby_unsetenv( "LSAPI_MAX_REQS" );
|
560
|
-
}
|
561
|
-
|
562
|
-
p = getenv( "LSAPI_MAX_IDLE" );
|
563
|
-
if ( p )
|
564
|
-
{
|
565
|
-
n = atoi( p );
|
566
|
-
LSAPI_Set_Max_Idle( n );
|
567
|
-
ruby_unsetenv( "LSAPI_MAX_IDLE" );
|
568
|
-
}
|
569
|
-
|
570
|
-
p = getenv( "LSAPI_PGRP_MAX_IDLE" );
|
571
|
-
if ( p )
|
572
|
-
{
|
573
|
-
LSAPI_Set_Server_Max_Idle_Secs( atoi( p ) );
|
574
|
-
ruby_unsetenv( "LSAPI_PGRP_MAX_IDLE" );
|
575
|
-
}
|
576
|
-
|
577
|
-
if ( getenv( "LSAPI_PPID_NO_CHECK" ) )
|
578
|
-
{
|
579
|
-
LSAPI_No_Check_ppid();
|
580
|
-
ruby_unsetenv( "LSAPI_PPID_NO_CHECK" );
|
581
|
-
}
|
582
|
-
*/
|
583
525
|
|
584
526
|
p = getenv( "RAILS_ROOT" );
|
585
527
|
if ( p )
|
586
528
|
{
|
587
|
-
chdir( p )
|
529
|
+
if ( chdir( p ) == -1 )
|
530
|
+
perror( "chdir()" );
|
588
531
|
}
|
589
532
|
if ( p || getenv( "RAILS_ENV" ) )
|
590
533
|
s_fn_add_env = add_env_rails;
|
@@ -599,13 +542,13 @@ void Init_lsapi()
|
|
599
542
|
orig_env = rb_const_get( rb_cObject, rb_intern("ENV") );
|
600
543
|
env_copy = rb_funcall( orig_env, rb_intern( "to_hash" ), 0 );
|
601
544
|
|
602
|
-
|
545
|
+
/* tell the garbage collector it is a global variable, do not recycle it. */
|
603
546
|
rb_global_variable(&env_copy);
|
604
547
|
|
605
548
|
rb_hash_aset( env_copy,rb_tainted_str_new("GATEWAY_INTERFACE", 17),
|
606
549
|
rb_tainted_str_new("CGI/1.2", 7));
|
607
550
|
|
608
|
-
|
551
|
+
/* Do not need those environments after initialization */
|
609
552
|
remove_env = rb_str_new( "RAILS_ROOT", 10 );
|
610
553
|
rb_funcall( env_copy, rb_intern( "delete" ), 1, remove_env );
|
611
554
|
|
@@ -616,7 +559,7 @@ void Init_lsapi()
|
|
616
559
|
rb_define_singleton_method(cLSAPI, "accept", lsapi_s_accept, 0);
|
617
560
|
|
618
561
|
rb_define_method(cLSAPI, "process", lsapi_process, 0 );
|
619
|
-
|
562
|
+
/* rb_define_method(cLSAPI, "initialize", lsapi_initialize, 0); */
|
620
563
|
rb_define_method(cLSAPI, "putc", lsapi_putc, 1);
|
621
564
|
rb_define_method(cLSAPI, "write", lsapi_write, 1);
|
622
565
|
rb_define_method(cLSAPI, "print", lsapi_print, -1);
|
@@ -625,16 +568,16 @@ void Init_lsapi()
|
|
625
568
|
rb_define_method(cLSAPI, "<<", lsapi_addstr, 1);
|
626
569
|
rb_define_method(cLSAPI, "flush", lsapi_flush, 0);
|
627
570
|
rb_define_method(cLSAPI, "getc", lsapi_getc, 0);
|
628
|
-
|
571
|
+
/* rb_define_method(cLSAPI, "ungetc", lsapi_ungetc, 1); */
|
629
572
|
rb_define_method(cLSAPI, "gets", lsapi_gets, 0);
|
630
573
|
rb_define_method(cLSAPI, "read", lsapi_read, -1);
|
631
574
|
rb_define_method(cLSAPI, "eof", lsapi_eof, 0);
|
632
575
|
rb_define_method(cLSAPI, "eof?", lsapi_eof, 0);
|
633
576
|
rb_define_method(cLSAPI, "close", lsapi_close, 0);
|
634
|
-
|
577
|
+
/* rb_define_method(cLSAPI, "closed?", lsapi_closed, 0); */
|
635
578
|
rb_define_method(cLSAPI, "binmode", lsapi_binmode, 0);
|
636
|
-
|
637
|
-
|
579
|
+
rb_define_method(cLSAPI, "isatty", lsapi_isatty, 0);
|
580
|
+
rb_define_method(cLSAPI, "tty?", lsapi_isatty, 0);
|
638
581
|
rb_define_method(cLSAPI, "sync", lsapi_sync, 0);
|
639
582
|
rb_define_method(cLSAPI, "sync=", lsapi_setsync, 1);
|
640
583
|
rb_define_method(cLSAPI, "reopen", lsapi_reopen, -1 );
|
@@ -656,12 +599,12 @@ void Init_lsapi()
|
|
656
599
|
rb_stderr = s_req_stderr;
|
657
600
|
rb_global_variable(&s_req_stderr );
|
658
601
|
|
659
|
-
|
602
|
+
/* constant silence hack */
|
660
603
|
orig_verbose = (VALUE)ruby_verbose;
|
661
604
|
ruby_verbose = Qnil;
|
662
605
|
|
663
606
|
lsapi_env = rb_hash_new();
|
664
|
-
|
607
|
+
/* redefine ENV using a hash table, should be faster than char **environment */
|
665
608
|
rb_define_global_const("ENV", lsapi_env);
|
666
609
|
|
667
610
|
rb_define_global_const("STDERR", rb_stderr);
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-lsapi
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "2.
|
7
|
-
date:
|
6
|
+
version: "2.9"
|
7
|
+
date: 2008-01-03 00:00:00 -05:00
|
8
8
|
summary: A ruby extension for fast communication with LiteSpeed Web Server.
|
9
9
|
require_paths:
|
10
10
|
- lib
|