rabies 0.0.1
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/src/cgi.c +117 -0
- data/src/cgi.h +11 -0
- data/src/extconf.rb +2 -0
- data/src/rabies.c +9 -0
- data/src/uri.c +7 -0
- data/src/uri.h +4 -0
- data/test/abstract.rb +20 -0
- data/test/cgi_test.rb +15 -0
- data/test/preserve_versions.rb +19 -0
- data/test/uri_test.rb +6 -0
- metadata +56 -0
data/src/cgi.c
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
#include "ruby.h"
|
2
|
+
#include "intern.h"
|
3
|
+
#include "ctype.h"
|
4
|
+
#include "cgi.h"
|
5
|
+
|
6
|
+
void Init_CGI() {
|
7
|
+
VALUE cgi = rb_define_class("CGI", rb_cObject);
|
8
|
+
|
9
|
+
rb_define_module_function(cgi, "escape", CGI_escape, 1);
|
10
|
+
rb_define_module_function(cgi, "escape_without_plus", CGI_escape_without_plus, 1);
|
11
|
+
|
12
|
+
rb_define_module_function(cgi, "unescape", CGI_unescape, 1);
|
13
|
+
|
14
|
+
rb_define_module_function(cgi, "escapeHTML", CGI_escapeHTML, 1);
|
15
|
+
}
|
16
|
+
|
17
|
+
inline char digit2hex(char ch) {
|
18
|
+
if (ch < 9) return '0' + ch;
|
19
|
+
else return 'A' + ch - 10;
|
20
|
+
}
|
21
|
+
inline char hex2digit(char ch) {
|
22
|
+
if (isdigit(ch)) return ch - '0';
|
23
|
+
else if (ch >= 'A' && ch <= 'F') return ch - 'A';
|
24
|
+
else if (ch >= 'a' && ch <= 'f') return ch - 'a';
|
25
|
+
else return 0;
|
26
|
+
}
|
27
|
+
|
28
|
+
VALUE CGI_escape(VALUE cgi, VALUE str) {
|
29
|
+
return CGI_internal_escape(cgi, str, 1);
|
30
|
+
}
|
31
|
+
VALUE CGI_escape_without_plus(VALUE cgi, VALUE str) {
|
32
|
+
return CGI_internal_escape(cgi, str, 0);
|
33
|
+
}
|
34
|
+
|
35
|
+
VALUE CGI_internal_escape(VALUE cgi, VALUE str, int use_pluses) {
|
36
|
+
long output_length = 1;
|
37
|
+
char *input, *output, *r, *w, ch;
|
38
|
+
|
39
|
+
r = input = StringValueCStr(str);
|
40
|
+
// First find the length of the resulting string we'll need.
|
41
|
+
while ((ch = *r)) {
|
42
|
+
++r;
|
43
|
+
if (isalpha(ch) || isdigit(ch) || (ch == ' ' && use_pluses) || ch == '_' || ch == '.' || ch == '-')
|
44
|
+
output_length += 1; // Normal takes 1 character
|
45
|
+
else
|
46
|
+
output_length += 3; // Escaped, needs %XX characters
|
47
|
+
}
|
48
|
+
|
49
|
+
// Create the string of proper size
|
50
|
+
w = output = ALLOC_N(char, output_length);
|
51
|
+
r = input;
|
52
|
+
|
53
|
+
// And fill it with the escaped characters
|
54
|
+
while ((ch = *r)) {
|
55
|
+
r++;
|
56
|
+
if (isalpha(ch) || isdigit(ch) || ch == '_' || ch == '.' || ch == '-')
|
57
|
+
*w++ = ch;
|
58
|
+
else if (ch == ' ' && use_pluses)
|
59
|
+
*w++ = '+';
|
60
|
+
else {
|
61
|
+
*w++ = '%';
|
62
|
+
*w++ = digit2hex((ch / 0x10) & 0xF);
|
63
|
+
*w++ = digit2hex(ch & 0xF);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
*w = '\0';
|
67
|
+
return rb_str_new2(output);
|
68
|
+
}
|
69
|
+
|
70
|
+
VALUE CGI_unescape(VALUE cgi, VALUE str) {
|
71
|
+
char *input, *output, *r, *w, ch;
|
72
|
+
r = input = StringValueCStr(str);
|
73
|
+
w = output = ALLOC_N(char, RSTRING(str)->len + 1);
|
74
|
+
|
75
|
+
while ((ch = *r)) {
|
76
|
+
++r;
|
77
|
+
if (ch == '%')
|
78
|
+
*w++ = (hex2digit(*r++) * 0x10) | hex2digit(*r++);
|
79
|
+
else if (ch == '+') *w++ = ' ';
|
80
|
+
else *w++ = ch;
|
81
|
+
}
|
82
|
+
*w = '\0';
|
83
|
+
|
84
|
+
return rb_str_new2(output);
|
85
|
+
}
|
86
|
+
|
87
|
+
#define CH(c) (*w++ = c)
|
88
|
+
VALUE CGI_escapeHTML(VALUE cgi, VALUE str) {
|
89
|
+
long output_length = 1;
|
90
|
+
char *input, *output, *r, *w, ch;
|
91
|
+
|
92
|
+
r = input = StringValueCStr(str);
|
93
|
+
// First find the length of the resulting string we'll need.
|
94
|
+
while ((ch = *r)) {
|
95
|
+
++r;
|
96
|
+
if (ch == '&') output_length += 5;
|
97
|
+
else if (ch == '"') output_length += 6;
|
98
|
+
else if (ch == '<' || ch == '>') output_length += 4;
|
99
|
+
else output_length++;
|
100
|
+
}
|
101
|
+
|
102
|
+
// Create the string of proper size
|
103
|
+
w = output = ALLOC_N(char, output_length);
|
104
|
+
r = input;
|
105
|
+
|
106
|
+
// And fill it with the escaped characters
|
107
|
+
while ((ch = *r)) {
|
108
|
+
r++;
|
109
|
+
if (ch == '&') { CH('&'); CH('a'); CH('m'); CH('p'); CH(';'); }
|
110
|
+
else if (ch == '"') { CH('&'); CH('q'); CH('u'); CH('o'); CH('t'); CH(';'); }
|
111
|
+
else if (ch == '<' || ch == '>') { CH('&'); CH(ch == '>' ? 'g' : 'l'); CH(';'); }
|
112
|
+
else CH(ch);
|
113
|
+
}
|
114
|
+
*w = '\0';
|
115
|
+
|
116
|
+
return rb_str_new2(output);
|
117
|
+
}
|
data/src/cgi.h
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#include "ruby.h"
|
2
|
+
|
3
|
+
void Init_CGI();
|
4
|
+
|
5
|
+
VALUE CGI_escape(VALUE cgi, VALUE str);
|
6
|
+
VALUE CGI_escape_without_plus(VALUE cgi, VALUE str);
|
7
|
+
VALUE CGI_internal_escape(VALUE cgi, VALUE str, int use_pluses);
|
8
|
+
|
9
|
+
VALUE CGI_unescape(VALUE cgi, VALUE str);
|
10
|
+
|
11
|
+
VALUE CGI_escapeHTML(VALUE cgi, VALUE str);
|
data/src/extconf.rb
ADDED
data/src/rabies.c
ADDED
data/src/uri.c
ADDED
data/src/uri.h
ADDED
data/test/abstract.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.dirname(__FILE__) + '/preserve_versions.rb'
|
3
|
+
|
4
|
+
class << Test::Unit::TestCase
|
5
|
+
|
6
|
+
def preserve_result_of(target, selector, *arguments)
|
7
|
+
|
8
|
+
# Find an unused selector for the test case
|
9
|
+
s = "test_preservation_of_#{target}_#{selector}"
|
10
|
+
i = 1
|
11
|
+
i += 1 while instance_methods.include?(s + i.to_s)
|
12
|
+
|
13
|
+
define_method s + i.to_s do
|
14
|
+
old = target.send "old_#{selector}", *arguments
|
15
|
+
current = target.send selector, *arguments
|
16
|
+
assert_equal old, current, "The result of #{target}.#{selector}(#{arguments.inspect[1..-2]}) changed"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
data/test/cgi_test.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
class CGITest < Test::Unit::TestCase
|
3
|
+
|
4
|
+
preserve_result_of CGI, :escape, "Hello World!"
|
5
|
+
|
6
|
+
preserve_result_of CGI, :unescape, "Hello+World%21"
|
7
|
+
preserve_result_of CGI, :unescape, "Hello%20World%21"
|
8
|
+
|
9
|
+
preserve_result_of CGI, :escapeHTML, "<script>alert('pwned');</script>"
|
10
|
+
preserve_result_of CGI, :escapeHTML, "<b>All your base<b><pwned>are belong to us</pwned>"
|
11
|
+
|
12
|
+
# This seems broken, but we'll preserve the behavior for now
|
13
|
+
preserve_result_of CGI, :escapeHTML, "<b>I have π for dinner…</b>"
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
class << Module
|
3
|
+
|
4
|
+
def preserve_method(*selectors)
|
5
|
+
selectors.flatten.each { |sel| alias_method "old_#{sel}", sel }
|
6
|
+
end
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'cgi'
|
11
|
+
class << CGI; preserve_method %w(escape unescape escapeHTML); end
|
12
|
+
|
13
|
+
require 'uri'
|
14
|
+
class << URI; preserve_method %w(encode); end
|
15
|
+
|
16
|
+
|
17
|
+
# Now require rabies:
|
18
|
+
$: << File.expand_path(File.dirname(__FILE__) + '/../src/')
|
19
|
+
require 'rabies'
|
data/test/uri_test.rb
ADDED
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.0
|
3
|
+
specification_version: 1
|
4
|
+
name: rabies
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.0.1
|
7
|
+
date: 2007-03-12 00:00:00 -04:00
|
8
|
+
summary: A library which replaces hotspots in Rails with C implementations to increase performance.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: nseckar@gmail.com
|
12
|
+
homepage: http://http://code.google.com/p/rabies/
|
13
|
+
rubyforge_project:
|
14
|
+
description:
|
15
|
+
autorequire: rabies
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: false
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Nicholas Seckar
|
31
|
+
files:
|
32
|
+
- src/cgi.c
|
33
|
+
- src/cgi.h
|
34
|
+
- src/extconf.rb
|
35
|
+
- src/rabies.c
|
36
|
+
- src/uri.c
|
37
|
+
- src/uri.h
|
38
|
+
- test/abstract.rb
|
39
|
+
- test/cgi_test.rb
|
40
|
+
- test/preserve_versions.rb
|
41
|
+
- test/uri_test.rb
|
42
|
+
test_files:
|
43
|
+
- test/cgi_test.rb
|
44
|
+
- test/uri_test.rb
|
45
|
+
rdoc_options: []
|
46
|
+
|
47
|
+
extra_rdoc_files: []
|
48
|
+
|
49
|
+
executables: []
|
50
|
+
|
51
|
+
extensions:
|
52
|
+
- src/extconf.rb
|
53
|
+
requirements: []
|
54
|
+
|
55
|
+
dependencies: []
|
56
|
+
|