Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Port fix for ; in path from Unicorn (http://git.bogomips.org/cgit/uni…

  • Loading branch information...
commit 2e9db13e414ae742593744f4b8682d5104ba9c4b 1 parent ad96bc3
@macournoyer macournoyer authored
View
11 Rakefile
@@ -15,9 +15,12 @@ Dir['tasks/**/*.rake'].each { |rake| load rake }
task :default => :spec
Rake::ExtensionTask.new('thin_parser', Thin::GemSpec) do |ext|
- ext.cross_compile = true # enable cross compilation (requires cross compile toolchain)
- ext.cross_platform = 'i386-mswin32' # forces the Windows platform instead of the default one
- # configure options only for cross compile
+ # enable cross compilation (requires cross compile toolchain)
+ ext.cross_compile = true
+
+ # forces the Windows platform instead of the default one
+ # configure options only for cross compile
+ ext.cross_platform = %w( i386-mswin32 x86-mingw32 )
end
CLEAN.include %w(**/*.{o,bundle,jar,so,obj,pdb,lib,def,exp,log} ext/*/Makefile ext/*/conftest.dSYM)
@@ -27,7 +30,7 @@ task :ragel do
Dir.chdir 'ext/thin_parser' do
target = "parser.c"
File.unlink target if File.exist? target
- sh "ragel parser.rl | rlgen-cd -G2 -o #{target}"
+ sh "ragel parser.rl -G2 -o #{target}"
raise "Failed to compile Ragel state machine" unless File.exist? target
end
end
View
2  ext/thin_parser/common.rl
@@ -31,7 +31,7 @@
query = ( uchar | reserved )* %query_string ;
param = ( pchar | "/" )* ;
params = ( param ( ";" param )* ) ;
- rel_path = ( path? %request_path (";" params)? ) ("?" %start_query query)?;
+ rel_path = ( path? (";" params)? %request_path) ("?" %start_query query)?;
absolute_path = ( "/"+ rel_path );
Request_URI = ( "*" | absolute_uri | absolute_path ) >mark %request_uri;
View
1,319 ext/thin_parser/parser.c
@@ -1,3 +1,4 @@
+
#line 1 "parser.rl"
/**
* Copyright (c) 2005 Zed A. Shaw
@@ -16,195 +17,30 @@
/** Machine **/
+
#line 81 "parser.rl"
/** Data **/
-#line 25 "parser.c"
-static const char _http_parser_actions[] = {
- 0, 1, 0, 1, 1, 1, 2, 1,
- 3, 1, 4, 1, 5, 1, 6, 1,
- 7, 1, 8, 1, 10, 1, 11, 1,
- 12, 2, 0, 7, 2, 3, 4, 2,
- 9, 6, 2, 11, 6, 3, 8, 9,
- 6
-};
-
-static const short _http_parser_key_offsets[] = {
- 0, 0, 8, 17, 27, 29, 30, 31,
- 32, 33, 34, 36, 39, 41, 44, 45,
- 61, 62, 78, 80, 81, 87, 93, 99,
- 105, 115, 121, 127, 133, 141, 147, 153,
- 160, 166, 172, 178, 184, 190, 196, 205,
- 214, 223, 232, 241, 250, 259, 268, 277,
- 286, 295, 304, 313, 322, 331, 340, 349,
- 358, 359
-};
-
-static const char _http_parser_trans_keys[] = {
- 36, 95, 45, 46, 48, 57, 65, 90,
- 32, 36, 95, 45, 46, 48, 57, 65,
- 90, 42, 43, 47, 58, 45, 57, 65,
- 90, 97, 122, 32, 35, 72, 84, 84,
- 80, 47, 48, 57, 46, 48, 57, 48,
- 57, 13, 48, 57, 10, 13, 33, 124,
- 126, 35, 39, 42, 43, 45, 46, 48,
- 57, 65, 90, 94, 122, 10, 33, 58,
- 124, 126, 35, 39, 42, 43, 45, 46,
- 48, 57, 65, 90, 94, 122, 13, 32,
- 13, 32, 35, 37, 127, 0, 31, 32,
- 35, 37, 127, 0, 31, 48, 57, 65,
- 70, 97, 102, 48, 57, 65, 70, 97,
- 102, 43, 58, 45, 46, 48, 57, 65,
- 90, 97, 122, 32, 35, 37, 127, 0,
- 31, 48, 57, 65, 70, 97, 102, 48,
- 57, 65, 70, 97, 102, 32, 35, 37,
- 59, 63, 127, 0, 31, 48, 57, 65,
- 70, 97, 102, 48, 57, 65, 70, 97,
- 102, 32, 35, 37, 63, 127, 0, 31,
- 48, 57, 65, 70, 97, 102, 48, 57,
- 65, 70, 97, 102, 32, 35, 37, 127,
- 0, 31, 32, 35, 37, 127, 0, 31,
- 48, 57, 65, 70, 97, 102, 48, 57,
- 65, 70, 97, 102, 32, 36, 95, 45,
- 46, 48, 57, 65, 90, 32, 36, 95,
- 45, 46, 48, 57, 65, 90, 32, 36,
- 95, 45, 46, 48, 57, 65, 90, 32,
- 36, 95, 45, 46, 48, 57, 65, 90,
- 32, 36, 95, 45, 46, 48, 57, 65,
- 90, 32, 36, 95, 45, 46, 48, 57,
- 65, 90, 32, 36, 95, 45, 46, 48,
- 57, 65, 90, 32, 36, 95, 45, 46,
- 48, 57, 65, 90, 32, 36, 95, 45,
- 46, 48, 57, 65, 90, 32, 36, 95,
- 45, 46, 48, 57, 65, 90, 32, 36,
- 95, 45, 46, 48, 57, 65, 90, 32,
- 36, 95, 45, 46, 48, 57, 65, 90,
- 32, 36, 95, 45, 46, 48, 57, 65,
- 90, 32, 36, 95, 45, 46, 48, 57,
- 65, 90, 32, 36, 95, 45, 46, 48,
- 57, 65, 90, 32, 36, 95, 45, 46,
- 48, 57, 65, 90, 32, 36, 95, 45,
- 46, 48, 57, 65, 90, 32, 36, 95,
- 45, 46, 48, 57, 65, 90, 32, 0
-};
-
-static const char _http_parser_single_lengths[] = {
- 0, 2, 3, 4, 2, 1, 1, 1,
- 1, 1, 0, 1, 0, 1, 1, 4,
- 1, 4, 2, 1, 4, 4, 0, 0,
- 2, 4, 0, 0, 6, 0, 0, 5,
- 0, 0, 4, 4, 0, 0, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3,
- 1, 0
-};
-
-static const char _http_parser_range_lengths[] = {
- 0, 3, 3, 3, 0, 0, 0, 0,
- 0, 0, 1, 1, 1, 1, 0, 6,
- 0, 6, 0, 0, 1, 1, 3, 3,
- 4, 1, 3, 3, 1, 3, 3, 1,
- 3, 3, 1, 1, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3,
- 0, 0
-};
-
-static const short _http_parser_index_offsets[] = {
- 0, 0, 6, 13, 21, 24, 26, 28,
- 30, 32, 34, 36, 39, 41, 44, 46,
- 57, 59, 70, 73, 75, 81, 87, 91,
- 95, 102, 108, 112, 116, 124, 128, 132,
- 139, 143, 147, 153, 159, 163, 167, 174,
- 181, 188, 195, 202, 209, 216, 223, 230,
- 237, 244, 251, 258, 265, 272, 279, 286,
- 293, 295
-};
-
-static const char _http_parser_indicies[] = {
- 0, 0, 0, 0, 0, 1, 2, 3,
- 3, 3, 3, 3, 1, 4, 5, 6,
- 7, 5, 5, 5, 1, 8, 9, 1,
- 10, 1, 11, 1, 12, 1, 13, 1,
- 14, 1, 15, 1, 16, 15, 1, 17,
- 1, 18, 17, 1, 19, 1, 20, 21,
- 21, 21, 21, 21, 21, 21, 21, 21,
- 1, 22, 1, 23, 24, 23, 23, 23,
- 23, 23, 23, 23, 23, 1, 26, 27,
- 25, 29, 28, 31, 1, 32, 1, 1,
- 30, 34, 1, 35, 1, 1, 33, 36,
- 36, 36, 1, 33, 33, 33, 1, 37,
- 38, 37, 37, 37, 37, 1, 8, 9,
- 39, 1, 1, 38, 40, 40, 40, 1,
- 38, 38, 38, 1, 42, 43, 44, 45,
- 46, 1, 1, 41, 47, 47, 47, 1,
- 41, 41, 41, 1, 8, 9, 49, 50,
- 1, 1, 48, 51, 51, 51, 1, 48,
- 48, 48, 1, 53, 54, 55, 1, 1,
- 52, 57, 58, 59, 1, 1, 56, 60,
- 60, 60, 1, 56, 56, 56, 1, 2,
- 61, 61, 61, 61, 61, 1, 2, 62,
- 62, 62, 62, 62, 1, 2, 63, 63,
- 63, 63, 63, 1, 2, 64, 64, 64,
- 64, 64, 1, 2, 65, 65, 65, 65,
- 65, 1, 2, 66, 66, 66, 66, 66,
- 1, 2, 67, 67, 67, 67, 67, 1,
- 2, 68, 68, 68, 68, 68, 1, 2,
- 69, 69, 69, 69, 69, 1, 2, 70,
- 70, 70, 70, 70, 1, 2, 71, 71,
- 71, 71, 71, 1, 2, 72, 72, 72,
- 72, 72, 1, 2, 73, 73, 73, 73,
- 73, 1, 2, 74, 74, 74, 74, 74,
- 1, 2, 75, 75, 75, 75, 75, 1,
- 2, 76, 76, 76, 76, 76, 1, 2,
- 77, 77, 77, 77, 77, 1, 2, 78,
- 78, 78, 78, 78, 1, 2, 1, 1,
- 0
-};
-
-static const char _http_parser_trans_targs[] = {
- 2, 0, 3, 38, 4, 24, 28, 25,
- 5, 20, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 17, 57, 17,
- 18, 19, 14, 18, 19, 14, 21, 5,
- 22, 21, 5, 22, 23, 24, 25, 26,
- 27, 28, 5, 20, 29, 31, 34, 30,
- 31, 32, 34, 33, 35, 5, 20, 36,
- 35, 5, 20, 36, 37, 39, 40, 41,
- 42, 43, 44, 45, 46, 47, 48, 49,
- 50, 51, 52, 53, 54, 55, 56
-};
-
-static const char _http_parser_trans_actions[] = {
- 1, 0, 11, 0, 1, 1, 1, 1,
- 13, 13, 1, 0, 0, 0, 0, 0,
- 0, 0, 19, 0, 0, 3, 23, 0,
- 5, 7, 28, 7, 0, 9, 1, 25,
- 1, 0, 15, 0, 0, 0, 0, 0,
- 0, 0, 34, 34, 0, 21, 21, 0,
- 0, 0, 0, 0, 17, 37, 37, 17,
- 0, 31, 31, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0
-};
-
+#line 27 "parser.c"
static const int http_parser_start = 1;
-static const int http_parser_first_final = 57;
+static const int http_parser_first_final = 54;
static const int http_parser_error = 0;
static const int http_parser_en_main = 1;
+
#line 85 "parser.rl"
int thin_http_parser_init(http_parser *parser) {
int cs = 0;
-#line 205 "parser.c"
+#line 40 "parser.c"
{
cs = http_parser_start;
}
+
#line 89 "parser.rl"
parser->cs = cs;
parser->body_start = 0;
@@ -233,180 +69,1077 @@ size_t thin_http_parser_execute(http_parser *parser, const char *buffer, size_t
-#line 237 "parser.c"
+#line 73 "parser.c"
{
- int _klen;
- unsigned int _trans;
- const char *_acts;
- unsigned int _nacts;
- const char *_keys;
-
if ( p == pe )
goto _test_eof;
- if ( cs == 0 )
- goto _out;
-_resume:
- _keys = _http_parser_trans_keys + _http_parser_key_offsets[cs];
- _trans = _http_parser_index_offsets[cs];
-
- _klen = _http_parser_single_lengths[cs];
- if ( _klen > 0 ) {
- const char *_lower = _keys;
- const char *_mid;
- const char *_upper = _keys + _klen - 1;
- while (1) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + ((_upper-_lower) >> 1);
- if ( (*p) < *_mid )
- _upper = _mid - 1;
- else if ( (*p) > *_mid )
- _lower = _mid + 1;
- else {
- _trans += (_mid - _keys);
- goto _match;
- }
- }
- _keys += _klen;
- _trans += _klen;
- }
-
- _klen = _http_parser_range_lengths[cs];
- if ( _klen > 0 ) {
- const char *_lower = _keys;
- const char *_mid;
- const char *_upper = _keys + (_klen<<1) - 2;
- while (1) {
- if ( _upper < _lower )
- break;
-
- _mid = _lower + (((_upper-_lower) >> 1) & ~1);
- if ( (*p) < _mid[0] )
- _upper = _mid - 2;
- else if ( (*p) > _mid[1] )
- _lower = _mid + 2;
- else {
- _trans += ((_mid - _keys)>>1);
- goto _match;
- }
- }
- _trans += _klen;
- }
-
-_match:
- _trans = _http_parser_indicies[_trans];
- cs = _http_parser_trans_targs[_trans];
-
- if ( _http_parser_trans_actions[_trans] == 0 )
- goto _again;
-
- _acts = _http_parser_actions + _http_parser_trans_actions[_trans];
- _nacts = (unsigned int) *_acts++;
- while ( _nacts-- > 0 )
+ switch ( cs )
{
- switch ( *_acts++ )
- {
- case 0:
+case 1:
+ switch( (*p) ) {
+ case 36: goto tr0;
+ case 95: goto tr0;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto tr0;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto tr0;
+ } else
+ goto tr0;
+ goto st0;
+st0:
+cs = 0;
+ goto _out;
+tr0:
#line 22 "parser.rl"
{MARK(mark, p); }
- break;
- case 1:
-#line 25 "parser.rl"
- { MARK(field_start, p); }
- break;
- case 2:
-#line 26 "parser.rl"
- {
- parser->field_len = LEN(field_start, p);
- }
- break;
- case 3:
-#line 30 "parser.rl"
- { MARK(mark, p); }
- break;
- case 4:
-#line 31 "parser.rl"
- {
- if (parser->http_field != NULL) {
- parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
- }
- }
- break;
- case 5:
+ goto st2;
+st2:
+ if ( ++p == pe )
+ goto _test_eof2;
+case 2:
+#line 104 "parser.c"
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st35;
+ case 95: goto st35;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st35;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st35;
+ } else
+ goto st35;
+ goto st0;
+tr2:
#line 36 "parser.rl"
{
if (parser->request_method != NULL) {
parser->request_method(parser->data, PTR_TO(mark), LEN(mark, p));
}
}
- break;
- case 6:
+ goto st3;
+st3:
+ if ( ++p == pe )
+ goto _test_eof3;
+case 3:
+#line 131 "parser.c"
+ switch( (*p) ) {
+ case 42: goto tr4;
+ case 43: goto tr5;
+ case 47: goto tr6;
+ case 58: goto tr7;
+ }
+ if ( (*p) < 65 ) {
+ if ( 45 <= (*p) && (*p) <= 57 )
+ goto tr5;
+ } else if ( (*p) > 90 ) {
+ if ( 97 <= (*p) && (*p) <= 122 )
+ goto tr5;
+ } else
+ goto tr5;
+ goto st0;
+tr4:
+#line 22 "parser.rl"
+ {MARK(mark, p); }
+ goto st4;
+st4:
+ if ( ++p == pe )
+ goto _test_eof4;
+case 4:
+#line 155 "parser.c"
+ switch( (*p) ) {
+ case 32: goto tr8;
+ case 35: goto tr9;
+ }
+ goto st0;
+tr8:
#line 41 "parser.rl"
{
if (parser->request_uri != NULL) {
parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
}
}
- break;
- case 7:
+ goto st5;
+tr31:
+#line 22 "parser.rl"
+ {MARK(mark, p); }
+#line 46 "parser.rl"
+ {
+ if (parser->fragment != NULL) {
+ parser->fragment(parser->data, PTR_TO(mark), LEN(mark, p));
+ }
+ }
+ goto st5;
+tr34:
#line 46 "parser.rl"
{
if (parser->fragment != NULL) {
parser->fragment(parser->data, PTR_TO(mark), LEN(mark, p));
}
}
- break;
- case 8:
+ goto st5;
+tr42:
+#line 65 "parser.rl"
+ {
+ if (parser->request_path != NULL) {
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
+ }
+ }
+#line 41 "parser.rl"
+ {
+ if (parser->request_uri != NULL) {
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
+ }
+ }
+ goto st5;
+tr48:
#line 52 "parser.rl"
{MARK(query_start, p); }
- break;
- case 9:
#line 53 "parser.rl"
{
if (parser->query_string != NULL) {
parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
}
}
- break;
- case 10:
+#line 41 "parser.rl"
+ {
+ if (parser->request_uri != NULL) {
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
+ }
+ }
+ goto st5;
+tr52:
+#line 53 "parser.rl"
+ {
+ if (parser->query_string != NULL) {
+ parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
+ }
+ }
+#line 41 "parser.rl"
+ {
+ if (parser->request_uri != NULL) {
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
+ }
+ }
+ goto st5;
+st5:
+ if ( ++p == pe )
+ goto _test_eof5;
+case 5:
+#line 235 "parser.c"
+ if ( (*p) == 72 )
+ goto tr10;
+ goto st0;
+tr10:
+#line 22 "parser.rl"
+ {MARK(mark, p); }
+ goto st6;
+st6:
+ if ( ++p == pe )
+ goto _test_eof6;
+case 6:
+#line 247 "parser.c"
+ if ( (*p) == 84 )
+ goto st7;
+ goto st0;
+st7:
+ if ( ++p == pe )
+ goto _test_eof7;
+case 7:
+ if ( (*p) == 84 )
+ goto st8;
+ goto st0;
+st8:
+ if ( ++p == pe )
+ goto _test_eof8;
+case 8:
+ if ( (*p) == 80 )
+ goto st9;
+ goto st0;
+st9:
+ if ( ++p == pe )
+ goto _test_eof9;
+case 9:
+ if ( (*p) == 47 )
+ goto st10;
+ goto st0;
+st10:
+ if ( ++p == pe )
+ goto _test_eof10;
+case 10:
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st11;
+ goto st0;
+st11:
+ if ( ++p == pe )
+ goto _test_eof11;
+case 11:
+ if ( (*p) == 46 )
+ goto st12;
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st11;
+ goto st0;
+st12:
+ if ( ++p == pe )
+ goto _test_eof12;
+case 12:
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st13;
+ goto st0;
+st13:
+ if ( ++p == pe )
+ goto _test_eof13;
+case 13:
+ if ( (*p) == 13 )
+ goto tr18;
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st13;
+ goto st0;
+tr18:
#line 59 "parser.rl"
{
if (parser->http_version != NULL) {
parser->http_version(parser->data, PTR_TO(mark), LEN(mark, p));
}
}
- break;
- case 11:
-#line 65 "parser.rl"
- {
- if (parser->request_path != NULL) {
- parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
+ goto st14;
+tr26:
+#line 30 "parser.rl"
+ { MARK(mark, p); }
+#line 31 "parser.rl"
+ {
+ if (parser->http_field != NULL) {
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
+ }
+ }
+ goto st14;
+tr29:
+#line 31 "parser.rl"
+ {
+ if (parser->http_field != NULL) {
+ parser->http_field(parser->data, PTR_TO(field_start), parser->field_len, PTR_TO(mark), LEN(mark, p));
}
}
- break;
- case 12:
+ goto st14;
+st14:
+ if ( ++p == pe )
+ goto _test_eof14;
+case 14:
+#line 334 "parser.c"
+ if ( (*p) == 10 )
+ goto st15;
+ goto st0;
+st15:
+ if ( ++p == pe )
+ goto _test_eof15;
+case 15:
+ switch( (*p) ) {
+ case 13: goto st16;
+ case 33: goto tr21;
+ case 124: goto tr21;
+ case 126: goto tr21;
+ }
+ if ( (*p) < 45 ) {
+ if ( (*p) > 39 ) {
+ if ( 42 <= (*p) && (*p) <= 43 )
+ goto tr21;
+ } else if ( (*p) >= 35 )
+ goto tr21;
+ } else if ( (*p) > 46 ) {
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto tr21;
+ } else if ( (*p) > 90 ) {
+ if ( 94 <= (*p) && (*p) <= 122 )
+ goto tr21;
+ } else
+ goto tr21;
+ } else
+ goto tr21;
+ goto st0;
+st16:
+ if ( ++p == pe )
+ goto _test_eof16;
+case 16:
+ if ( (*p) == 10 )
+ goto tr22;
+ goto st0;
+tr22:
#line 71 "parser.rl"
{
parser->body_start = p - buffer + 1;
if (parser->header_done != NULL) {
parser->header_done(parser->data, p + 1, pe - p - 1);
}
- {p++; goto _out; }
+ {p++; cs = 54; goto _out;}
}
- break;
-#line 399 "parser.c"
- }
+ goto st54;
+st54:
+ if ( ++p == pe )
+ goto _test_eof54;
+case 54:
+#line 387 "parser.c"
+ goto st0;
+tr21:
+#line 25 "parser.rl"
+ { MARK(field_start, p); }
+ goto st17;
+st17:
+ if ( ++p == pe )
+ goto _test_eof17;
+case 17:
+#line 397 "parser.c"
+ switch( (*p) ) {
+ case 33: goto st17;
+ case 58: goto tr24;
+ case 124: goto st17;
+ case 126: goto st17;
}
+ if ( (*p) < 45 ) {
+ if ( (*p) > 39 ) {
+ if ( 42 <= (*p) && (*p) <= 43 )
+ goto st17;
+ } else if ( (*p) >= 35 )
+ goto st17;
+ } else if ( (*p) > 46 ) {
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st17;
+ } else if ( (*p) > 90 ) {
+ if ( 94 <= (*p) && (*p) <= 122 )
+ goto st17;
+ } else
+ goto st17;
+ } else
+ goto st17;
+ goto st0;
+tr24:
+#line 26 "parser.rl"
+ {
+ parser->field_len = LEN(field_start, p);
+ }
+ goto st18;
+tr27:
+#line 30 "parser.rl"
+ { MARK(mark, p); }
+ goto st18;
+st18:
+ if ( ++p == pe )
+ goto _test_eof18;
+case 18:
+#line 436 "parser.c"
+ switch( (*p) ) {
+ case 13: goto tr26;
+ case 32: goto tr27;
+ }
+ goto tr25;
+tr25:
+#line 30 "parser.rl"
+ { MARK(mark, p); }
+ goto st19;
+st19:
+ if ( ++p == pe )
+ goto _test_eof19;
+case 19:
+#line 450 "parser.c"
+ if ( (*p) == 13 )
+ goto tr29;
+ goto st19;
+tr9:
+#line 41 "parser.rl"
+ {
+ if (parser->request_uri != NULL) {
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
+ }
+ }
+ goto st20;
+tr43:
+#line 65 "parser.rl"
+ {
+ if (parser->request_path != NULL) {
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
+ }
+ }
+#line 41 "parser.rl"
+ {
+ if (parser->request_uri != NULL) {
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
+ }
+ }
+ goto st20;
+tr49:
+#line 52 "parser.rl"
+ {MARK(query_start, p); }
+#line 53 "parser.rl"
+ {
+ if (parser->query_string != NULL) {
+ parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
+ }
+ }
+#line 41 "parser.rl"
+ {
+ if (parser->request_uri != NULL) {
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
+ }
+ }
+ goto st20;
+tr53:
+#line 53 "parser.rl"
+ {
+ if (parser->query_string != NULL) {
+ parser->query_string(parser->data, PTR_TO(query_start), LEN(query_start, p));
+ }
+ }
+#line 41 "parser.rl"
+ {
+ if (parser->request_uri != NULL) {
+ parser->request_uri(parser->data, PTR_TO(mark), LEN(mark, p));
+ }
+ }
+ goto st20;
+st20:
+ if ( ++p == pe )
+ goto _test_eof20;
+case 20:
+#line 510 "parser.c"
+ switch( (*p) ) {
+ case 32: goto tr31;
+ case 35: goto st0;
+ case 37: goto tr32;
+ case 127: goto st0;
+ }
+ if ( 0 <= (*p) && (*p) <= 31 )
+ goto st0;
+ goto tr30;
+tr30:
+#line 22 "parser.rl"
+ {MARK(mark, p); }
+ goto st21;
+st21:
+ if ( ++p == pe )
+ goto _test_eof21;
+case 21:
+#line 528 "parser.c"
+ switch( (*p) ) {
+ case 32: goto tr34;
+ case 35: goto st0;
+ case 37: goto st22;
+ case 127: goto st0;
+ }
+ if ( 0 <= (*p) && (*p) <= 31 )
+ goto st0;
+ goto st21;
+tr32:
+#line 22 "parser.rl"
+ {MARK(mark, p); }
+ goto st22;
+st22:
+ if ( ++p == pe )
+ goto _test_eof22;
+case 22:
+#line 546 "parser.c"
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st23;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st23;
+ } else
+ goto st23;
+ goto st0;
+st23:
+ if ( ++p == pe )
+ goto _test_eof23;
+case 23:
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st21;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st21;
+ } else
+ goto st21;
+ goto st0;
+tr5:
+#line 22 "parser.rl"
+ {MARK(mark, p); }
+ goto st24;
+st24:
+ if ( ++p == pe )
+ goto _test_eof24;
+case 24:
+#line 577 "parser.c"
+ switch( (*p) ) {
+ case 43: goto st24;
+ case 58: goto st25;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st24;
+ } else if ( (*p) > 57 ) {
+ if ( (*p) > 90 ) {
+ if ( 97 <= (*p) && (*p) <= 122 )
+ goto st24;
+ } else if ( (*p) >= 65 )
+ goto st24;
+ } else
+ goto st24;
+ goto st0;
+tr7:
+#line 22 "parser.rl"
+ {MARK(mark, p); }
+ goto st25;
+st25:
+ if ( ++p == pe )
+ goto _test_eof25;
+case 25:
+#line 602 "parser.c"
+ switch( (*p) ) {
+ case 32: goto tr8;
+ case 35: goto tr9;
+ case 37: goto st26;
+ case 127: goto st0;
+ }
+ if ( 0 <= (*p) && (*p) <= 31 )
+ goto st0;
+ goto st25;
+st26:
+ if ( ++p == pe )
+ goto _test_eof26;
+case 26:
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st27;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st27;
+ } else
+ goto st27;
+ goto st0;
+st27:
+ if ( ++p == pe )
+ goto _test_eof27;
+case 27:
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st25;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st25;
+ } else
+ goto st25;
+ goto st0;
+tr6:
+#line 22 "parser.rl"
+ {MARK(mark, p); }
+ goto st28;
+st28:
+ if ( ++p == pe )
+ goto _test_eof28;
+case 28:
+#line 646 "parser.c"
+ switch( (*p) ) {
+ case 32: goto tr42;
+ case 35: goto tr43;
+ case 37: goto st29;
+ case 63: goto tr45;
+ case 127: goto st0;
+ }
+ if ( 0 <= (*p) && (*p) <= 31 )
+ goto st0;
+ goto st28;
+st29:
+ if ( ++p == pe )
+ goto _test_eof29;
+case 29:
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st30;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st30;
+ } else
+ goto st30;
+ goto st0;
+st30:
+ if ( ++p == pe )
+ goto _test_eof30;
+case 30:
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st28;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st28;
+ } else
+ goto st28;
+ goto st0;
+tr45:
+#line 65 "parser.rl"
+ {
+ if (parser->request_path != NULL) {
+ parser->request_path(parser->data, PTR_TO(mark), LEN(mark,p));
+ }
+ }
+ goto st31;
+st31:
+ if ( ++p == pe )
+ goto _test_eof31;
+case 31:
+#line 695 "parser.c"
+ switch( (*p) ) {
+ case 32: goto tr48;
+ case 35: goto tr49;
+ case 37: goto tr50;
+ case 127: goto st0;
+ }
+ if ( 0 <= (*p) && (*p) <= 31 )
+ goto st0;
+ goto tr47;
+tr47:
+#line 52 "parser.rl"
+ {MARK(query_start, p); }
+ goto st32;
+st32:
+ if ( ++p == pe )
+ goto _test_eof32;
+case 32:
+#line 713 "parser.c"
+ switch( (*p) ) {
+ case 32: goto tr52;
+ case 35: goto tr53;
+ case 37: goto st33;
+ case 127: goto st0;
+ }
+ if ( 0 <= (*p) && (*p) <= 31 )
+ goto st0;
+ goto st32;
+tr50:
+#line 52 "parser.rl"
+ {MARK(query_start, p); }
+ goto st33;
+st33:
+ if ( ++p == pe )
+ goto _test_eof33;
+case 33:
+#line 731 "parser.c"
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st34;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st34;
+ } else
+ goto st34;
+ goto st0;
+st34:
+ if ( ++p == pe )
+ goto _test_eof34;
+case 34:
+ if ( (*p) < 65 ) {
+ if ( 48 <= (*p) && (*p) <= 57 )
+ goto st32;
+ } else if ( (*p) > 70 ) {
+ if ( 97 <= (*p) && (*p) <= 102 )
+ goto st32;
+ } else
+ goto st32;
+ goto st0;
+st35:
+ if ( ++p == pe )
+ goto _test_eof35;
+case 35:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st36;
+ case 95: goto st36;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st36;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st36;
+ } else
+ goto st36;
+ goto st0;
+st36:
+ if ( ++p == pe )
+ goto _test_eof36;
+case 36:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st37;
+ case 95: goto st37;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st37;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st37;
+ } else
+ goto st37;
+ goto st0;
+st37:
+ if ( ++p == pe )
+ goto _test_eof37;
+case 37:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st38;
+ case 95: goto st38;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st38;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st38;
+ } else
+ goto st38;
+ goto st0;
+st38:
+ if ( ++p == pe )
+ goto _test_eof38;
+case 38:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st39;
+ case 95: goto st39;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st39;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st39;
+ } else
+ goto st39;
+ goto st0;
+st39:
+ if ( ++p == pe )
+ goto _test_eof39;
+case 39:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st40;
+ case 95: goto st40;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st40;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st40;
+ } else
+ goto st40;
+ goto st0;
+st40:
+ if ( ++p == pe )
+ goto _test_eof40;
+case 40:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st41;
+ case 95: goto st41;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st41;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st41;
+ } else
+ goto st41;
+ goto st0;
+st41:
+ if ( ++p == pe )
+ goto _test_eof41;
+case 41:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st42;
+ case 95: goto st42;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st42;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st42;
+ } else
+ goto st42;
+ goto st0;
+st42:
+ if ( ++p == pe )
+ goto _test_eof42;
+case 42:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st43;
+ case 95: goto st43;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st43;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st43;
+ } else
+ goto st43;
+ goto st0;
+st43:
+ if ( ++p == pe )
+ goto _test_eof43;
+case 43:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st44;
+ case 95: goto st44;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st44;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st44;
+ } else
+ goto st44;
+ goto st0;
+st44:
+ if ( ++p == pe )
+ goto _test_eof44;
+case 44:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st45;
+ case 95: goto st45;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st45;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st45;
+ } else
+ goto st45;
+ goto st0;
+st45:
+ if ( ++p == pe )
+ goto _test_eof45;
+case 45:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st46;
+ case 95: goto st46;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st46;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st46;
+ } else
+ goto st46;
+ goto st0;
+st46:
+ if ( ++p == pe )
+ goto _test_eof46;
+case 46:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st47;
+ case 95: goto st47;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st47;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st47;
+ } else
+ goto st47;
+ goto st0;
+st47:
+ if ( ++p == pe )
+ goto _test_eof47;
+case 47:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st48;
+ case 95: goto st48;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st48;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st48;
+ } else
+ goto st48;
+ goto st0;
+st48:
+ if ( ++p == pe )
+ goto _test_eof48;
+case 48:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st49;
+ case 95: goto st49;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st49;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st49;
+ } else
+ goto st49;
+ goto st0;
+st49:
+ if ( ++p == pe )
+ goto _test_eof49;
+case 49:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st50;
+ case 95: goto st50;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st50;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st50;
+ } else
+ goto st50;
+ goto st0;
+st50:
+ if ( ++p == pe )
+ goto _test_eof50;
+case 50:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st51;
+ case 95: goto st51;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st51;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st51;
+ } else
+ goto st51;
+ goto st0;
+st51:
+ if ( ++p == pe )
+ goto _test_eof51;
+case 51:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st52;
+ case 95: goto st52;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st52;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st52;
+ } else
+ goto st52;
+ goto st0;
+st52:
+ if ( ++p == pe )
+ goto _test_eof52;
+case 52:
+ switch( (*p) ) {
+ case 32: goto tr2;
+ case 36: goto st53;
+ case 95: goto st53;
+ }
+ if ( (*p) < 48 ) {
+ if ( 45 <= (*p) && (*p) <= 46 )
+ goto st53;
+ } else if ( (*p) > 57 ) {
+ if ( 65 <= (*p) && (*p) <= 90 )
+ goto st53;
+ } else
+ goto st53;
+ goto st0;
+st53:
+ if ( ++p == pe )
+ goto _test_eof53;
+case 53:
+ if ( (*p) == 32 )
+ goto tr2;
+ goto st0;
+ }
+ _test_eof2: cs = 2; goto _test_eof;
+ _test_eof3: cs = 3; goto _test_eof;
+ _test_eof4: cs = 4; goto _test_eof;
+ _test_eof5: cs = 5; goto _test_eof;
+ _test_eof6: cs = 6; goto _test_eof;
+ _test_eof7: cs = 7; goto _test_eof;
+ _test_eof8: cs = 8; goto _test_eof;
+ _test_eof9: cs = 9; goto _test_eof;
+ _test_eof10: cs = 10; goto _test_eof;
+ _test_eof11: cs = 11; goto _test_eof;
+ _test_eof12: cs = 12; goto _test_eof;
+ _test_eof13: cs = 13; goto _test_eof;
+ _test_eof14: cs = 14; goto _test_eof;
+ _test_eof15: cs = 15; goto _test_eof;
+ _test_eof16: cs = 16; goto _test_eof;
+ _test_eof54: cs = 54; goto _test_eof;
+ _test_eof17: cs = 17; goto _test_eof;
+ _test_eof18: cs = 18; goto _test_eof;
+ _test_eof19: cs = 19; goto _test_eof;
+ _test_eof20: cs = 20; goto _test_eof;
+ _test_eof21: cs = 21; goto _test_eof;
+ _test_eof22: cs = 22; goto _test_eof;
+ _test_eof23: cs = 23; goto _test_eof;
+ _test_eof24: cs = 24; goto _test_eof;
+ _test_eof25: cs = 25; goto _test_eof;
+ _test_eof26: cs = 26; goto _test_eof;
+ _test_eof27: cs = 27; goto _test_eof;
+ _test_eof28: cs = 28; goto _test_eof;
+ _test_eof29: cs = 29; goto _test_eof;
+ _test_eof30: cs = 30; goto _test_eof;
+ _test_eof31: cs = 31; goto _test_eof;
+ _test_eof32: cs = 32; goto _test_eof;
+ _test_eof33: cs = 33; goto _test_eof;
+ _test_eof34: cs = 34; goto _test_eof;
+ _test_eof35: cs = 35; goto _test_eof;
+ _test_eof36: cs = 36; goto _test_eof;
+ _test_eof37: cs = 37; goto _test_eof;
+ _test_eof38: cs = 38; goto _test_eof;
+ _test_eof39: cs = 39; goto _test_eof;
+ _test_eof40: cs = 40; goto _test_eof;
+ _test_eof41: cs = 41; goto _test_eof;
+ _test_eof42: cs = 42; goto _test_eof;
+ _test_eof43: cs = 43; goto _test_eof;
+ _test_eof44: cs = 44; goto _test_eof;
+ _test_eof45: cs = 45; goto _test_eof;
+ _test_eof46: cs = 46; goto _test_eof;
+ _test_eof47: cs = 47; goto _test_eof;
+ _test_eof48: cs = 48; goto _test_eof;
+ _test_eof49: cs = 49; goto _test_eof;
+ _test_eof50: cs = 50; goto _test_eof;
+ _test_eof51: cs = 51; goto _test_eof;
+ _test_eof52: cs = 52; goto _test_eof;
+ _test_eof53: cs = 53; goto _test_eof;
-_again:
- if ( cs == 0 )
- goto _out;
- if ( ++p != pe )
- goto _resume;
_test_eof: {}
_out: {}
}
+
#line 116 "parser.rl"
parser->cs = cs;
View
3  ext/thin_parser/thin.c
@@ -207,6 +207,9 @@ static void header_done(void *data, const char *at, size_t length)
if (rb_hash_aref(req, global_query_string) == Qnil) {
rb_hash_aset(req, global_query_string, global_empty);
}
+ if (rb_hash_aref(req, global_path_info) == Qnil) {
+ rb_hash_aset(req, global_path_info, global_empty);
+ }
/* set some constants */
rb_hash_aset(req, global_server_protocol, global_server_protocol_value);
View
30 spec/request/parser_spec.rb
@@ -209,7 +209,35 @@
parser = HttpParser.new
req = {}
nread = parser.execute(req, req_str, 0)
- req.should be_has_key('HTTP_HOS_T')
+ req.should have_key('HTTP_HOS_T')
}
end
+
+ it "should parse PATH_INFO with semicolon" do
+ qs = "QUERY_STRING"
+ pi = "PATH_INFO"
+ {
+ "/1;a=b?c=d&e=f" => { qs => "c=d&e=f", pi => "/1;a=b" },
+ "/1?c=d&e=f" => { qs => "c=d&e=f", pi => "/1" },
+ "/1;a=b" => { qs => "", pi => "/1;a=b" },
+ "/1;a=b?" => { qs => "", pi => "/1;a=b" },
+ "/1?a=b;c=d&e=f" => { qs => "a=b;c=d&e=f", pi => "/1" },
+ "*" => { qs => "", pi => "" },
+ }.each do |uri, expect|
+ parser = HttpParser.new
+ env = {}
+ nread = parser.execute(env, "GET #{uri} HTTP/1.1\r\nHost: www.example.com\r\n\r\n", 0)
+
+ env[pi].should == expect[pi]
+ env[qs].should == expect[qs]
+ env["REQUEST_URI"].should == uri
+
+ next if uri == "*"
+
+ # Validate w/ Ruby's URI.parse
+ uri = URI.parse("http://example.com#{uri}")
+ env[qs].should == uri.query.to_s
+ env[pi].should == uri.path
+ end
+ end
end
View
18 tasks/gem.rake
@@ -1,8 +1,6 @@
require 'rake/gempackagetask'
require 'yaml'
-WIN_SUFFIX = ENV['WIN_SUFFIX'] || 'x86-mswin32'
-
task :clean => :clobber_package
Thin::GemSpec = Gem::Specification.new do |s|
@@ -59,16 +57,10 @@ end
task :gem => :tag_warn
namespace :gem do
- desc "Update the gemspec for GitHub's gem server"
- task :github do
- File.open("thin.gemspec", 'w') { |f| f << YAML.dump(Thin::GemSpec) }
- end
-
- desc 'Upload gems (ruby & win32) to rubyforge.org'
- task :upload => :gem do
- sh 'rubyforge login'
- sh "rubyforge add_release thin thin #{Thin::VERSION::STRING} pkg/#{Thin::GemSpec.full_name}.gem"
- sh "rubyforge add_file thin thin #{Thin::VERSION::STRING} pkg/#{Thin::GemSpec.full_name}.gem"
- sh "rubyforge add_file thin thin #{Thin::VERSION::STRING} pkg/#{Thin::GemSpec.full_name}-#{WIN_SUFFIX}.gem"
+ desc 'Upload gems to gemcutter.org'
+ task :push => :gem do
+ Dir["pkg/#{Thin::GemSpec.full_name}*.gem"].each do |file|
+ puts "gem push #{file}"
+ end
end
end
Please sign in to comment.
Something went wrong with that request. Please try again.