fcgi 0.9.1 → 0.9.2

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.
Files changed (7) hide show
  1. checksums.yaml +7 -0
  2. data/README.rdoc +3 -3
  3. data/VERSION +1 -1
  4. data/ext/fcgi/fcgi.c +62 -17
  5. data/fcgi.gemspec +1 -1
  6. data/lib/fcgi.rb +14 -14
  7. metadata +6 -8
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: be3a36a6ec0bff57b024aee3540e6c5dd755e314
4
+ data.tar.gz: 3a6f6137b7012ba0a429a67247c682a933167950
5
+ SHA512:
6
+ metadata.gz: a3b52ffbf272b3401bfe5f3fb0a0213d730c69eb971ec790144dff1517c157e63aa23c336e6b849749637d0d14cb9f1e69d1b465937295c54505df956866f2cc
7
+ data.tar.gz: 951c84b5af5de03c78e464f90a4974b537edc68ab020f1ec4a75e879e7413abb657c1ae6e033a74ecfdb788e5f4f2528bae6461114489bce3418fc5a60c745bd
@@ -1,6 +1,6 @@
1
1
  = fcgi - The New generation of FastCGI library for Ruby.
2
2
 
3
- Version 0.9.1
3
+ Version 0.9.2
4
4
 
5
5
  == Depends
6
6
 
@@ -12,7 +12,7 @@ Version 0.9.1
12
12
 
13
13
  == Install
14
14
 
15
- $ gem install ruby-fcgi-ng
15
+ $ gem install fcgi
16
16
 
17
17
  == Usage
18
18
  === Class Method
@@ -100,7 +100,7 @@ standard CGI library.
100
100
 
101
101
  fcgi.c 0.1 Copyright (C) 1998-1999 Network Applied Communication Laboratory, Inc.
102
102
  0.8 Copyright (C) 2002 MoonWolf <moonwolf@moonwolf.com>
103
- 0.9 Copyright (C) 2013 MoonWolf <mva@mva.name>
103
+ 0.9 Copyright (C) 2013 mva <mva@mva.name> Alpha, LLC
104
104
 
105
105
  fastcgi.rb 0.7 Copyright (C) 2001 Eli Green
106
106
  fcgi.rb 0.8 Copyright (C) 2002 MoonWolf <moonwolf@moonwolf.com>
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.1
1
+ 0.9.2
@@ -35,6 +35,11 @@ static VALUE eFCGIStreamProtocolError;
35
35
  static VALUE eFCGIStreamParamsError;
36
36
  static VALUE eFCGIStreamCallSeqError;
37
37
 
38
+ typedef struct fcgi_stream_data {
39
+ VALUE req;
40
+ FCGX_Stream *stream;
41
+ } fcgi_stream_data;
42
+
38
43
  typedef struct fcgi_data {
39
44
  FCGX_Request *req;
40
45
  VALUE in;
@@ -43,9 +48,18 @@ typedef struct fcgi_data {
43
48
  VALUE env;
44
49
  } fcgi_data;
45
50
 
51
+ static void fcgi_stream_mark(fcgi_stream_data *stream_data)
52
+ {
53
+ rb_gc_mark(stream_data->req);
54
+ }
55
+
56
+ static void fcgi_stream_free(fcgi_stream_data *stream_data)
57
+ {
58
+ free(stream_data);
59
+ }
60
+
46
61
  static void fcgi_mark(fcgi_data *data)
47
62
  {
48
- /* rb_gc_mark(data->req); */
49
63
  rb_gc_mark(data->in);
50
64
  rb_gc_mark(data->out);
51
65
  rb_gc_mark(data->err);
@@ -54,6 +68,7 @@ static void fcgi_mark(fcgi_data *data)
54
68
 
55
69
  static void fcgi_free_req(fcgi_data *data)
56
70
  {
71
+ FCGX_Free(data->req, 1);
57
72
  free(data->req);
58
73
  free(data);
59
74
  }
@@ -74,13 +89,14 @@ static VALUE fcgi_s_accept(VALUE self)
74
89
 
75
90
  FD_ZERO(&readfds);
76
91
  FD_SET(req->listen_sock, &readfds);
77
- if (rb_thread_select(req->listen_sock+1, &readfds, NULL, NULL, NULL) < 1) {
92
+ if (select(req->listen_sock+1, &readfds, NULL, NULL, NULL) < 1) {
78
93
  return Qnil;
79
94
  }
80
95
 
81
96
  status = FCGX_Accept_r(req);
82
97
  if (status >= 0) {
83
98
  fcgi_data *data;
99
+ fcgi_stream_data *stream_data;
84
100
  char **env;
85
101
  VALUE obj,key, value;
86
102
  char *pkey,*pvalue;
@@ -96,9 +112,15 @@ static VALUE fcgi_s_accept(VALUE self)
96
112
 
97
113
  obj = Data_Make_Struct(self, fcgi_data, fcgi_mark, fcgi_free_req, data);
98
114
  data->req = req;
99
- data->in = Data_Wrap_Struct(cFCGIStream, 0, 0, req->in);
100
- data->out = Data_Wrap_Struct(cFCGIStream, 0, 0, req->out);
101
- data->err = Data_Wrap_Struct(cFCGIStream, 0, 0, req->err);
115
+ data->in = Data_Make_Struct(cFCGIStream, fcgi_stream_data, fcgi_stream_mark, fcgi_stream_free, stream_data);
116
+ stream_data->stream = req->in;
117
+ stream_data->req = obj;
118
+ data->out = Data_Make_Struct(cFCGIStream, fcgi_stream_data, fcgi_stream_mark, fcgi_stream_free, stream_data);
119
+ stream_data->stream = req->out;
120
+ stream_data->req = obj;
121
+ data->err = Data_Make_Struct(cFCGIStream, fcgi_stream_data, fcgi_stream_mark, fcgi_stream_free, stream_data);
122
+ stream_data->stream = req->err;
123
+ stream_data->req = obj;
102
124
  data->env = rb_hash_new();
103
125
  env = req->envp;
104
126
  for (; *env; env++) {
@@ -115,6 +137,8 @@ static VALUE fcgi_s_accept(VALUE self)
115
137
 
116
138
  return obj;
117
139
  } else {
140
+ FCGX_Free(req, 1);
141
+ free(req);
118
142
  return Qnil;
119
143
  }
120
144
  }
@@ -173,9 +197,24 @@ static VALUE fcgi_env(VALUE self)
173
197
  static VALUE fcgi_finish(VALUE self)
174
198
  {
175
199
  fcgi_data *data;
200
+ fcgi_stream_data *stream_data;
176
201
 
177
202
  Data_Get_Struct(self, fcgi_data, data);
178
203
 
204
+ if (Qnil != data->in) {
205
+ Data_Get_Struct(data->in, fcgi_stream_data, stream_data);
206
+ stream_data->req = Qnil; stream_data->stream = NULL;
207
+ }
208
+ if (Qnil != data->out) {
209
+ Data_Get_Struct(data->out, fcgi_stream_data, stream_data);
210
+ stream_data->req = Qnil; stream_data->stream = NULL;
211
+ }
212
+ if (Qnil != data->err) {
213
+ Data_Get_Struct(data->err, fcgi_stream_data, stream_data);
214
+ stream_data->req = Qnil; stream_data->stream = NULL;
215
+ }
216
+
217
+ data->in = data->out = data->err = Qnil;
179
218
  FCGX_Finish_r(data->req);
180
219
 
181
220
  return Qtrue;
@@ -186,8 +225,7 @@ static VALUE fcgi_finish(VALUE self)
186
225
  extern int errno; \
187
226
  if (err) {\
188
227
  if (err > 0) {\
189
- errno = err;\
190
- rb_sys_fail(NULL);\
228
+ rb_raise(eFCGIStreamError, "unknown error (syscall error)");\
191
229
  }\
192
230
  else {\
193
231
  switch (err) {\
@@ -211,13 +249,20 @@ static VALUE fcgi_finish(VALUE self)
211
249
  }\
212
250
  }
213
251
 
252
+ #define Data_Get_Stream(value, stream) do {\
253
+ fcgi_stream_data* _fsd;\
254
+ Data_Get_Struct(value, fcgi_stream_data, _fsd);\
255
+ if (NULL == (stream = _fsd->stream))\
256
+ rb_raise(eFCGIStreamError, "stream invalid as fastcgi request is already finished");\
257
+ } while (0)
258
+
214
259
  static VALUE fcgi_stream_putc(VALUE self, VALUE ch)
215
260
  {
216
261
  FCGX_Stream *stream;
217
262
  int c;
218
263
 
219
264
  rb_secure(4);
220
- Data_Get_Struct(self, FCGX_Stream, stream);
265
+ Data_Get_Stream(self, stream);
221
266
  if ((c = FCGX_PutChar(NUM2INT(ch), stream)) == EOF)
222
267
  CHECK_STREAM_ERROR(stream);
223
268
  return INT2NUM(c);
@@ -229,7 +274,7 @@ static VALUE fcgi_stream_write(VALUE self, VALUE str)
229
274
  int len;
230
275
 
231
276
  rb_secure(4);
232
- Data_Get_Struct(self, FCGX_Stream, stream);
277
+ Data_Get_Stream(self, stream);
233
278
  str = rb_obj_as_string(str);
234
279
  len = FCGX_PutStr(RSTRING_PTR(str), RSTRING_LEN(str), stream);
235
280
  if (len == EOF) CHECK_STREAM_ERROR(stream);
@@ -335,7 +380,7 @@ static VALUE fcgi_stream_flush(VALUE self)
335
380
  {
336
381
  FCGX_Stream *stream;
337
382
 
338
- Data_Get_Struct(self, FCGX_Stream, stream);
383
+ Data_Get_Stream(self, stream);
339
384
  if (FCGX_FFlush(stream) == EOF)
340
385
  CHECK_STREAM_ERROR(stream);
341
386
  return Qnil;
@@ -346,7 +391,7 @@ static VALUE fcgi_stream_getc(VALUE self)
346
391
  FCGX_Stream *stream;
347
392
  int c;
348
393
 
349
- Data_Get_Struct(self, FCGX_Stream, stream);
394
+ Data_Get_Stream(self, stream);
350
395
  if ((c = FCGX_GetChar(stream)) == EOF) {
351
396
  CHECK_STREAM_ERROR(stream);
352
397
  return Qnil;
@@ -364,7 +409,7 @@ static VALUE fcgi_stream_ungetc(VALUE self, VALUE ch)
364
409
  if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
365
410
  rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
366
411
  }
367
- Data_Get_Struct(self, FCGX_Stream, stream);
412
+ Data_Get_Stream(self, stream);
368
413
  c = FCGX_UnGetChar(NUM2INT(ch), stream);
369
414
  CHECK_STREAM_ERROR(stream);
370
415
  return INT2NUM(c);
@@ -380,7 +425,7 @@ static VALUE fcgi_stream_gets(VALUE self) {
380
425
  rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
381
426
  }
382
427
 
383
- Data_Get_Struct(self, FCGX_Stream, stream);
428
+ Data_Get_Stream(self, stream);
384
429
 
385
430
  for (;;) {
386
431
  if (FCGX_GetLine(buff, BUFSIZ, stream) == NULL) {
@@ -407,7 +452,7 @@ static VALUE fcgi_stream_read(int argc, VALUE *argv, VALUE self)
407
452
  rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
408
453
  }
409
454
 
410
- Data_Get_Struct(self, FCGX_Stream, stream);
455
+ Data_Get_Stream(self, stream);
411
456
 
412
457
  if (argc==0) {
413
458
  buff = ALLOC_N(char, 16384);
@@ -459,7 +504,7 @@ static VALUE fcgi_stream_eof(VALUE self)
459
504
  if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
460
505
  rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
461
506
  }
462
- Data_Get_Struct(self, FCGX_Stream, stream);
507
+ Data_Get_Stream(self, stream);
463
508
  return FCGX_HasSeenEOF(stream) ? Qtrue : Qfalse;
464
509
  }
465
510
 
@@ -470,7 +515,7 @@ static VALUE fcgi_stream_close(VALUE self)
470
515
  if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) {
471
516
  rb_raise(rb_eSecurityError, "Insecure: can't close");
472
517
  }
473
- Data_Get_Struct(self, FCGX_Stream, stream);
518
+ Data_Get_Stream(self, stream);
474
519
  if (FCGX_FClose(stream) == EOF)
475
520
  CHECK_STREAM_ERROR(stream);
476
521
  return Qnil;
@@ -480,7 +525,7 @@ static VALUE fcgi_stream_closed(VALUE self)
480
525
  {
481
526
  FCGX_Stream *stream;
482
527
 
483
- Data_Get_Struct(self, FCGX_Stream, stream);
528
+ Data_Get_Stream(self, stream);
484
529
  return stream->isClosed ? Qtrue : Qfalse;
485
530
  }
486
531
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{fcgi}
3
- s.version = "0.9.1"
3
+ s.version = "0.9.2"
4
4
 
5
5
  s.authors = [%q{mva}]
6
6
  s.date = %q{2013-02-20}
@@ -1,6 +1,6 @@
1
1
  =begin
2
2
 
3
- fcgi.rb 0.9.0 - fcgi.so compatible pure-ruby FastCGI library
3
+ fcgi.rb 0.9.2 - fcgi.so compatible pure-ruby FastCGI library
4
4
 
5
5
  fastcgi.rb Copyright (C) 2001 Eli Green
6
6
  fcgi.rb Copyright (C) 2002-2003 MoonWolf <moonwolf@moonwolf.com>
@@ -18,12 +18,12 @@ begin
18
18
  rescue LoadError # Load the pure ruby version instead
19
19
  # At this point we do have STDERR so put it to some good use
20
20
  $stderr.puts "Your FCGI gem does not contain the FCGI shared library, running pure ruby instead"
21
-
21
+
22
22
  require 'socket'
23
23
  require 'stringio'
24
-
24
+
25
25
  class FCGI
26
-
26
+
27
27
  def self.is_cgi?
28
28
  begin
29
29
  s = Socket.for_fd($stdin.fileno)
@@ -113,7 +113,7 @@ rescue LoadError # Load the pure ruby version instead
113
113
  exit 0 if graceful
114
114
  end
115
115
  end
116
-
116
+
117
117
  def session
118
118
  sock, addr = *@server.accept
119
119
  return unless sock
@@ -368,7 +368,7 @@ rescue LoadError # Load the pure ruby version instead
368
368
 
369
369
  attr_reader :role
370
370
  attr_reader :flags
371
-
371
+
372
372
  def make_body
373
373
  [@role, @flags, 0, 0, 0, 0, 0].pack(BODY_FORMAT)
374
374
  end
@@ -448,14 +448,14 @@ rescue LoadError # Load the pure ruby version instead
448
448
  end
449
449
  result
450
450
  end
451
-
451
+
452
452
  def self.read_pair(buf)
453
453
  nlen = read_length(buf)
454
454
  vlen = read_length(buf)
455
455
  [buf.slice!(0, nlen), buf.slice!(0, vlen)]
456
456
  end
457
-
458
-
457
+
458
+
459
459
  if "".respond_to?(:bytes) # Ruby 1.9 string semantics
460
460
  def self.read_length(buf)
461
461
  if buf[0].bytes.first >> 7 == 0
@@ -587,7 +587,7 @@ end # begin
587
587
  class FCGI
588
588
  def self.each_cgi(*args)
589
589
  require 'cgi'
590
-
590
+
591
591
  eval(<<-EOS,TOPLEVEL_BINDING)
592
592
  class CGI
593
593
  public :env_table
@@ -622,17 +622,17 @@ class FCGI
622
622
  end # FCGI::CGI class
623
623
  end # FCGI class
624
624
  EOS
625
-
625
+
626
626
  if FCGI::is_cgi?
627
627
  yield ::CGI.new(*args)
628
628
  else
629
629
  exit_requested = false
630
630
  FCGI::each do |request|
631
-
631
+
632
632
  $stdout, $stderr = request.out, request.err
633
-
633
+
634
634
  yield CGI.new(request, *args)
635
-
635
+
636
636
  request.finish
637
637
  end
638
638
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fcgi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
5
- prerelease:
4
+ version: 0.9.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - mva
@@ -38,28 +37,27 @@ files:
38
37
  - test/test_fcgi.rb
39
38
  homepage: http://github.com/alphallc/ruby-fcgi-ng
40
39
  licenses: []
40
+ metadata: {}
41
41
  post_install_message:
42
42
  rdoc_options:
43
43
  - --charset=UTF-8
44
44
  require_paths:
45
45
  - lib
46
46
  required_ruby_version: !ruby/object:Gem::Requirement
47
- none: false
48
47
  requirements:
49
- - - ! '>='
48
+ - - '>='
50
49
  - !ruby/object:Gem::Version
51
50
  version: '0'
52
51
  required_rubygems_version: !ruby/object:Gem::Requirement
53
- none: false
54
52
  requirements:
55
- - - ! '>='
53
+ - - '>='
56
54
  - !ruby/object:Gem::Version
57
55
  version: '0'
58
56
  requirements: []
59
57
  rubyforge_project:
60
- rubygems_version: 1.8.24
58
+ rubygems_version: 2.0.3
61
59
  signing_key:
62
- specification_version: 3
60
+ specification_version: 4
63
61
  summary: FastCGI library for Ruby.
64
62
  test_files:
65
63
  - test/helper.rb