ruby-lsapi 1.8 → 1.9
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/lsapi/extconf.rb +3 -0
- data/ext/lsapi/lsapilib.c +83 -3
- data/ext/lsapi/lsapilib.h +12 -0
- data/ext/lsapi/lsruby.c +103 -18
- metadata +2 -2
data/ext/lsapi/extconf.rb
CHANGED
data/ext/lsapi/lsapilib.c
CHANGED
@@ -513,9 +513,9 @@ static int readReq( LSAPI_Request * pReq )
|
|
513
513
|
if ( packetLen > LSAPI_MAX_HEADER_LEN )
|
514
514
|
return -1;
|
515
515
|
|
516
|
-
if ( packetLen > pReq->m_reqBufSize )
|
516
|
+
if ( packetLen + 1024 > pReq->m_reqBufSize )
|
517
517
|
{
|
518
|
-
if ( allocateBuf( pReq, packetLen ) == -1 )
|
518
|
+
if ( allocateBuf( pReq, packetLen + 1024 ) == -1 )
|
519
519
|
return -1;
|
520
520
|
}
|
521
521
|
while( packetLen > pReq->m_bufRead )
|
@@ -717,6 +717,85 @@ char * LSAPI_GetHeader_r( LSAPI_Request * pReq, int headerIndex )
|
|
717
717
|
return pReq->m_pHttpHeader + off;
|
718
718
|
}
|
719
719
|
|
720
|
+
static int readBodyToReqBuf( LSAPI_Request * pReq )
|
721
|
+
{
|
722
|
+
int bodyLeft;
|
723
|
+
int len = pReq->m_bufRead - pReq->m_bufProcessed;
|
724
|
+
if ( len > 0 )
|
725
|
+
return len;
|
726
|
+
pReq->m_bufRead = pReq->m_bufProcessed = pReq->m_pHeader->m_pktHeader.m_packetLen.m_iLen;
|
727
|
+
|
728
|
+
bodyLeft = pReq->m_pHeader->m_reqBodyLen - pReq->m_reqBodyRead;
|
729
|
+
len = pReq->m_reqBufSize - pReq->m_bufRead;
|
730
|
+
if ( len < 0 )
|
731
|
+
return -1;
|
732
|
+
if ( len > bodyLeft )
|
733
|
+
len = bodyLeft;
|
734
|
+
|
735
|
+
len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf + pReq->m_bufRead, len );
|
736
|
+
if ( len > 0 )
|
737
|
+
pReq->m_bufRead += len;
|
738
|
+
return len;
|
739
|
+
}
|
740
|
+
|
741
|
+
|
742
|
+
int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq )
|
743
|
+
{
|
744
|
+
if ( pReq->m_bufProcessed >= pReq->m_bufRead )
|
745
|
+
{
|
746
|
+
if ( readBodyToReqBuf( pReq ) <= 0 )
|
747
|
+
return EOF;
|
748
|
+
}
|
749
|
+
++pReq->m_reqBodyRead;
|
750
|
+
return (unsigned char)*(pReq->m_pReqBuf + pReq->m_bufProcessed++);
|
751
|
+
}
|
752
|
+
|
753
|
+
|
754
|
+
|
755
|
+
int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, int bufLen, int *getLF )
|
756
|
+
{
|
757
|
+
int len;
|
758
|
+
int left;
|
759
|
+
char * pBufEnd = pBuf + bufLen - 1;
|
760
|
+
char * pBufCur = pBuf;
|
761
|
+
if (!pReq || ( !pBuf )||(bufLen < 0 )|| !getLF )
|
762
|
+
return -1;
|
763
|
+
*getLF = 0;
|
764
|
+
while( (left = pBufEnd - pBufCur ) > 0 )
|
765
|
+
{
|
766
|
+
|
767
|
+
len = pReq->m_bufRead - pReq->m_bufProcessed;
|
768
|
+
if ( len <= 0 )
|
769
|
+
{
|
770
|
+
if ( (len = readBodyToReqBuf( pReq )) <= 0 )
|
771
|
+
{
|
772
|
+
*getLF = 1;
|
773
|
+
break;
|
774
|
+
}
|
775
|
+
}
|
776
|
+
if ( len > left )
|
777
|
+
len = left;
|
778
|
+
char * pCur = pReq->m_pReqBuf + pReq->m_bufProcessed;
|
779
|
+
char * p = memchr( pCur, '\n', len );
|
780
|
+
if ( p )
|
781
|
+
len = p - pCur + 1;
|
782
|
+
memmove( pBufCur, pCur, len );
|
783
|
+
pBufCur += len;
|
784
|
+
pReq->m_bufProcessed += len;
|
785
|
+
|
786
|
+
pReq->m_reqBodyRead += len;
|
787
|
+
|
788
|
+
if ( p )
|
789
|
+
{
|
790
|
+
*getLF = 1;
|
791
|
+
break;
|
792
|
+
}
|
793
|
+
}
|
794
|
+
*pBufCur = 0;
|
795
|
+
|
796
|
+
return pBufCur - pBuf;
|
797
|
+
}
|
798
|
+
|
720
799
|
|
721
800
|
int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int bufLen )
|
722
801
|
{
|
@@ -755,7 +834,8 @@ int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int bufLen )
|
|
755
834
|
bufLen -= len;
|
756
835
|
}
|
757
836
|
else if ( len < 0 )
|
758
|
-
|
837
|
+
if ( !total)
|
838
|
+
return -1;
|
759
839
|
}
|
760
840
|
pReq->m_reqBodyRead += total;
|
761
841
|
return total;
|
data/ext/lsapi/lsapilib.h
CHANGED
@@ -151,6 +151,10 @@ char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name );
|
|
151
151
|
|
152
152
|
int LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, int len );
|
153
153
|
|
154
|
+
int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq );
|
155
|
+
|
156
|
+
int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, int bufLen, int *getLF );
|
157
|
+
|
154
158
|
|
155
159
|
int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq );
|
156
160
|
|
@@ -262,6 +266,14 @@ static inline int LSAPI_GetReqBodyRemain()
|
|
262
266
|
static inline int LSAPI_ReadReqBody( char * pBuf, int len )
|
263
267
|
{ return LSAPI_ReadReqBody_r( &g_req, pBuf, len ); }
|
264
268
|
|
269
|
+
static inline int LSAPI_ReqBodyGetChar()
|
270
|
+
{ return LSAPI_ReqBodyGetChar_r( &g_req ); }
|
271
|
+
|
272
|
+
static inline int LSAPI_ReqBodyGetLine( char * pBuf, int len, int *getLF )
|
273
|
+
{ return LSAPI_ReqBodyGetLine_r( &g_req, pBuf, len, getLF ); }
|
274
|
+
|
275
|
+
|
276
|
+
|
265
277
|
static inline int LSAPI_FinalizeRespHeaders(void)
|
266
278
|
{ return LSAPI_FinalizeRespHeaders_r( &g_req ); }
|
267
279
|
|
data/ext/lsapi/lsruby.c
CHANGED
@@ -74,16 +74,76 @@ static void lsapi_free_data( lsapi_data * data )
|
|
74
74
|
free( data );
|
75
75
|
}
|
76
76
|
|
77
|
-
static int
|
77
|
+
static int add_env_rails( const char * pKey, int keyLen, const char * pValue, int valLen,
|
78
78
|
void * arg )
|
79
79
|
{
|
80
|
+
char * p;
|
81
|
+
int len;
|
82
|
+
//Fixup some environment variables for rails
|
83
|
+
switch( *pKey )
|
84
|
+
{
|
85
|
+
case 'Q':
|
86
|
+
if ( strcmp( pKey, "QUERY_STRING" ) == 0 )
|
87
|
+
{
|
88
|
+
if ( !*pValue )
|
89
|
+
return 1;
|
90
|
+
}
|
91
|
+
break;
|
92
|
+
case 'R':
|
93
|
+
if (( *(pKey+8) == 'U' )&&( strcmp( pKey, "REQUEST_URI" ) == 0 ))
|
94
|
+
{
|
95
|
+
p = strchr( pValue, '?' );
|
96
|
+
if ( p )
|
97
|
+
{
|
98
|
+
len = valLen - ( p - pValue ) - 1;
|
99
|
+
valLen = p - pValue;
|
100
|
+
*p++ = 0;
|
101
|
+
}
|
102
|
+
else
|
103
|
+
{
|
104
|
+
p = "";
|
105
|
+
len = 0;
|
106
|
+
}
|
107
|
+
rb_hash_aset( lsapi_env,rb_tainted_str_new("QUERY_STRING", 12),
|
108
|
+
rb_tainted_str_new(p, len));
|
109
|
+
rb_hash_aset( lsapi_env,rb_tainted_str_new("PATH_INFO", 9),
|
110
|
+
rb_tainted_str_new(pValue, valLen));
|
111
|
+
}
|
112
|
+
break;
|
113
|
+
case 'S':
|
114
|
+
if ( strcmp( pKey, "SCRIPT_NAME" ) == 0 )
|
115
|
+
{
|
116
|
+
pValue = "/";
|
117
|
+
valLen = 1;
|
118
|
+
}
|
119
|
+
break;
|
120
|
+
case 'P':
|
121
|
+
if ( strcmp( pKey, "PATH_INFO" ) == 0 )
|
122
|
+
return 1;
|
123
|
+
default:
|
124
|
+
break;
|
125
|
+
}
|
126
|
+
|
80
127
|
//lsapi_ruby_setenv(pKey, pValue );
|
81
|
-
|
82
|
-
|
128
|
+
|
129
|
+
rb_hash_aset( lsapi_env,rb_tainted_str_new(pKey, keyLen),
|
130
|
+
rb_tainted_str_new(pValue, valLen));
|
83
131
|
return 1;
|
84
132
|
}
|
85
133
|
|
134
|
+
static int add_env_no_fix( const char * pKey, int keyLen, const char * pValue, int valLen,
|
135
|
+
void * arg )
|
136
|
+
{
|
137
|
+
rb_hash_aset( lsapi_env,rb_tainted_str_new(pKey, keyLen),
|
138
|
+
rb_tainted_str_new(pValue, valLen));
|
139
|
+
return 1;
|
140
|
+
}
|
86
141
|
|
142
|
+
typedef int (*fn_add_env)( const char * pKey, int keyLen, const char * pValue, int valLen,
|
143
|
+
void * arg );
|
144
|
+
|
145
|
+
fn_add_env s_fn_add_env = add_env_no_fix;
|
146
|
+
|
87
147
|
static void clear_env()
|
88
148
|
{
|
89
149
|
//rb_funcall( lsapi_env, rb_intern( "clear" ), 0 );
|
@@ -92,11 +152,10 @@ static void clear_env()
|
|
92
152
|
|
93
153
|
static void setup_cgi_env( lsapi_data * data )
|
94
154
|
{
|
95
|
-
|
96
155
|
clear_env();
|
97
156
|
|
98
|
-
LSAPI_ForeachHeader_r( data->req,
|
99
|
-
LSAPI_ForeachEnv_r( data->req,
|
157
|
+
LSAPI_ForeachHeader_r( data->req, s_fn_add_env, data );
|
158
|
+
LSAPI_ForeachEnv_r( data->req, s_fn_add_env, data );
|
100
159
|
|
101
160
|
}
|
102
161
|
|
@@ -510,11 +569,37 @@ static VALUE lsapi_flush( VALUE self )
|
|
510
569
|
|
511
570
|
static VALUE lsapi_getc( VALUE self )
|
512
571
|
{
|
513
|
-
|
572
|
+
int ch;
|
514
573
|
//lsapi_data *data;
|
515
574
|
//Data_Get_Struct(self,lsapi_data, data);
|
516
|
-
|
517
|
-
|
575
|
+
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self))
|
576
|
+
{
|
577
|
+
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
|
578
|
+
}
|
579
|
+
ch = LSAPI_ReqBodyGetChar_r( &g_req );
|
580
|
+
return INT2NUM( ch );
|
581
|
+
}
|
582
|
+
|
583
|
+
static VALUE lsapi_gets( VALUE self )
|
584
|
+
{
|
585
|
+
VALUE str;
|
586
|
+
int getLF = 0;
|
587
|
+
char buff[4096];
|
588
|
+
int len;
|
589
|
+
if (rb_safe_level() >= 4 && !OBJ_TAINTED(self))
|
590
|
+
{
|
591
|
+
rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
|
592
|
+
}
|
593
|
+
str = rb_str_buf_new( 1024 );
|
594
|
+
OBJ_TAINT(str);
|
595
|
+
while( !getLF )
|
596
|
+
{
|
597
|
+
len = LSAPI_ReqBodyGetLine_r( &g_req, buff, 4096, &getLF );
|
598
|
+
if ( len > 0 )
|
599
|
+
rb_str_buf_cat( str, buff, len );
|
600
|
+
|
601
|
+
}
|
602
|
+
return str;
|
518
603
|
}
|
519
604
|
|
520
605
|
|
@@ -614,7 +699,7 @@ void Init_lsapi()
|
|
614
699
|
if ( p )
|
615
700
|
{
|
616
701
|
s_children = atoi( p );
|
617
|
-
|
702
|
+
ruby_unsetenv( "LSAPI_CHILDREN" );
|
618
703
|
}
|
619
704
|
|
620
705
|
p = getenv( "LSAPI_MAX_REQS" );
|
@@ -623,7 +708,7 @@ void Init_lsapi()
|
|
623
708
|
n = atoi( p );
|
624
709
|
if ( n > 0 )
|
625
710
|
s_max_reqs = n;
|
626
|
-
|
711
|
+
ruby_unsetenv( "LSAPI_MAX_REQS" );
|
627
712
|
}
|
628
713
|
|
629
714
|
p = getenv( "LSAPI_MAX_IDLE" );
|
@@ -631,21 +716,23 @@ void Init_lsapi()
|
|
631
716
|
{
|
632
717
|
n = atoi( p );
|
633
718
|
s_max_idle_secs = n;
|
634
|
-
|
719
|
+
ruby_unsetenv( "LSAPI_MAX_IDLE" );
|
635
720
|
}
|
636
721
|
|
637
722
|
p = getenv( "LSAPI_PGRP_MAX_IDLE" );
|
638
723
|
if ( p )
|
639
724
|
{
|
640
725
|
s_max_grp_idle_secs = atoi( p );
|
641
|
-
|
726
|
+
ruby_unsetenv( "LSAPI_PGRP_MAX_IDLE" );
|
642
727
|
}
|
643
728
|
|
644
729
|
if ( !getenv( "LSAPI_PPID_NO_CHECK" ) )
|
645
730
|
s_ppid = getppid();
|
646
731
|
else
|
647
|
-
|
648
|
-
|
732
|
+
ruby_unsetenv( "LSAPI_PPID_NO_CHECK" );
|
733
|
+
if ( getenv( "RAILS_ROOT" )||getenv( "RAILS_ENV" ) )
|
734
|
+
s_fn_add_env = add_env_rails;
|
735
|
+
|
649
736
|
orig_stdin = rb_stdin;
|
650
737
|
orig_stdout = rb_stdout;
|
651
738
|
#if RUBY_VERSION_CODE < 180
|
@@ -657,8 +744,6 @@ void Init_lsapi()
|
|
657
744
|
//Do not need those environments after initialization
|
658
745
|
remove_env = rb_str_new( "RAILS_ROOT", 10 );
|
659
746
|
rb_funcall( env_copy, rb_intern( "delete" ), 1, remove_env );
|
660
|
-
remove_env = rb_str_new( "RAILS_ENV", 9 );
|
661
|
-
rb_funcall( env_copy, rb_intern( "delete" ), 1, remove_env );
|
662
747
|
|
663
748
|
lsapi_env = rb_hash_new();
|
664
749
|
//redefine ENV using a hash table, should be faster than char **environment
|
@@ -685,7 +770,7 @@ void Init_lsapi()
|
|
685
770
|
rb_define_method(cLSAPI, "flush", lsapi_flush, 0);
|
686
771
|
rb_define_method(cLSAPI, "getc", lsapi_getc, 0);
|
687
772
|
//rb_define_method(cLSAPI, "ungetc", lsapi_ungetc, 1);
|
688
|
-
|
773
|
+
rb_define_method(cLSAPI, "gets", lsapi_gets, 0);
|
689
774
|
rb_define_method(cLSAPI, "read", lsapi_read, -1);
|
690
775
|
rb_define_method(cLSAPI, "eof", lsapi_eof, 0);
|
691
776
|
rb_define_method(cLSAPI, "eof?", lsapi_eof, 0);
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruby-lsapi
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "1.
|
7
|
-
date: 2006-
|
6
|
+
version: "1.9"
|
7
|
+
date: 2006-09-25 00:00:00 -04:00
|
8
8
|
summary: A ruby extension for fast communication with LiteSpeed Web Server.
|
9
9
|
require_paths:
|
10
10
|
- lib
|