rfuzz 0.6 → 0.7

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 (94) hide show
  1. data/README +18 -17
  2. data/Rakefile +8 -3
  3. data/doc/rdoc/classes/RFuzz/Browser.html +229 -0
  4. data/doc/rdoc/classes/RFuzz/Browser.src/M000068.html +25 -0
  5. data/doc/rdoc/classes/RFuzz/Browser.src/M000069.html +23 -0
  6. data/doc/rdoc/classes/RFuzz/Browser.src/M000070.html +24 -0
  7. data/doc/rdoc/classes/RFuzz/HttpClient.html +10 -0
  8. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000010.html +10 -10
  9. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000011.html +18 -18
  10. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000012.html +36 -35
  11. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000013.html +35 -35
  12. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000014.html +43 -43
  13. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000015.html +22 -22
  14. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000016.html +12 -12
  15. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000017.html +18 -18
  16. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000018.html +4 -4
  17. data/doc/rdoc/classes/RFuzz/HttpClient.src/M000019.html +12 -12
  18. data/doc/rdoc/classes/RFuzz/HttpEncoding.html +13 -0
  19. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000001.html +12 -12
  20. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000002.html +4 -4
  21. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000003.html +12 -12
  22. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000004.html +4 -4
  23. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000005.html +18 -18
  24. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000006.html +4 -4
  25. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000007.html +6 -6
  26. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000008.html +6 -6
  27. data/doc/rdoc/classes/RFuzz/HttpEncoding.src/M000009.html +18 -18
  28. data/doc/rdoc/classes/RFuzz/Notifier.src/M000044.html +3 -3
  29. data/doc/rdoc/classes/RFuzz/Notifier.src/M000045.html +3 -3
  30. data/doc/rdoc/classes/RFuzz/Notifier.src/M000046.html +3 -3
  31. data/doc/rdoc/classes/RFuzz/Notifier.src/M000047.html +3 -3
  32. data/doc/rdoc/classes/RFuzz/Notifier.src/M000048.html +3 -3
  33. data/doc/rdoc/classes/RFuzz/Notifier.src/M000049.html +3 -3
  34. data/doc/rdoc/classes/RFuzz/Session.html +11 -1
  35. data/doc/rdoc/classes/RFuzz/Session.src/M000020.html +16 -16
  36. data/doc/rdoc/classes/RFuzz/Session.src/M000021.html +4 -4
  37. data/doc/rdoc/classes/RFuzz/Session.src/M000022.html +4 -4
  38. data/doc/rdoc/classes/RFuzz/Session.src/M000023.html +20 -20
  39. data/doc/rdoc/classes/RFuzz/Session.src/M000024.html +5 -5
  40. data/doc/rdoc/classes/RFuzz/Session.src/M000025.html +5 -5
  41. data/doc/rdoc/classes/RFuzz/Session.src/M000026.html +12 -12
  42. data/doc/rdoc/classes/RFuzz/Session.src/M000027.html +15 -15
  43. data/doc/rdoc/classes/RFuzz/Session.src/M000028.html +5 -5
  44. data/doc/rdoc/classes/RFuzz/Session.src/M000029.html +4 -4
  45. data/doc/rdoc/classes/RFuzz/Session.src/M000030.html +4 -4
  46. data/doc/rdoc/classes/RFuzz/Session.src/M000031.html +9 -9
  47. data/doc/rdoc/classes/RFuzz.html +5 -0
  48. data/doc/rdoc/created.rid +1 -1
  49. data/doc/rdoc/files/COPYING.html +1 -1
  50. data/doc/rdoc/files/LICENSE.html +1 -1
  51. data/doc/rdoc/files/README.html +23 -24
  52. data/doc/rdoc/files/lib/rfuzz/browser_rb.html +109 -0
  53. data/doc/rdoc/files/lib/rfuzz/client_rb.html +2 -1
  54. data/doc/rdoc/files/lib/rfuzz/random_rb.html +1 -1
  55. data/doc/rdoc/files/lib/rfuzz/rfuzz_rb.html +1 -1
  56. data/doc/rdoc/files/lib/rfuzz/session_rb.html +1 -1
  57. data/doc/rdoc/files/lib/rfuzz/stats_rb.html +1 -1
  58. data/doc/rdoc/fr_class_index.html +1 -0
  59. data/doc/rdoc/fr_file_index.html +1 -0
  60. data/doc/rdoc/fr_method_index.html +9 -6
  61. data/examples/cl_watcher.rb +36 -0
  62. data/examples/mongrel_test_suite/test/http/access_authentication.rb +8 -0
  63. data/examples/mongrel_test_suite/test/http/appendix.rb +76 -0
  64. data/examples/mongrel_test_suite/test/http/base_protocol.rb +4 -7
  65. data/examples/mongrel_test_suite/test/http/caching_in_http.rb +140 -0
  66. data/examples/mongrel_test_suite/test/http/connections.rb +48 -0
  67. data/examples/mongrel_test_suite/test/http/content_negotiation.rb +20 -0
  68. data/examples/mongrel_test_suite/test/http/entity.rb +24 -0
  69. data/examples/mongrel_test_suite/test/http/header_field_definitions.rb +231 -0
  70. data/examples/mongrel_test_suite/test/http/http_message.rb +122 -0
  71. data/examples/mongrel_test_suite/test/http/method_definitions.rb +52 -0
  72. data/examples/mongrel_test_suite/test/http/protocol_parameters.rb +286 -0
  73. data/examples/mongrel_test_suite/test/http/request.rb +28 -0
  74. data/examples/mongrel_test_suite/test/http/response.rb +20 -0
  75. data/examples/mongrel_test_suite/test/http/security_considerations.rb +54 -0
  76. data/examples/mongrel_test_suite/test/http/status_code_definitions.rb +192 -0
  77. data/ext/fuzzrnd/fuzzrnd.c +1 -2
  78. data/lib/rfuzz/browser.rb +53 -0
  79. data/lib/rfuzz/client.rb +11 -6
  80. data/lib/rfuzz/session.rb +3 -1
  81. data/tools/rakehelp.rb +4 -2
  82. metadata +24 -15
  83. data/test/coverage/index.html +0 -388
  84. data/test/coverage/lib-rfuzz-client_rb.html +0 -1127
  85. data/test/coverage/lib-rfuzz-random_rb.html +0 -739
  86. data/test/coverage/lib-rfuzz-session_rb.html +0 -783
  87. data/test/coverage/lib-rfuzz-stats_rb.html +0 -788
  88. data/test/server.rb +0 -101
  89. data/test/test_client.rb +0 -164
  90. data/test/test_fuzzrnd.rb +0 -31
  91. data/test/test_httpparser.rb +0 -48
  92. data/test/test_random.rb +0 -75
  93. data/test/test_session.rb +0 -33
  94. data/test/test_stats.rb +0 -45
@@ -0,0 +1,286 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "3: Protocol Parameters" do
4
+ setup do
5
+ @sess = RFuzz::Session.new :host => "localhost", :port => 3000
6
+ end
7
+
8
+ specify "3.1: HTTP Version" do
9
+ # "HTTP" "/" 1*DIGIT "." 1*DIGIT
10
+ @sess.run {|c,r|
11
+ c.get("/").http_version.should_match /HTTP\/[0-9]+\.[0-9]+/
12
+ }
13
+ end
14
+
15
+
16
+ specify "3.2: Uniform Resource Identifiers" do
17
+
18
+ end
19
+
20
+
21
+ specify "3.2.1: General Syntax" do
22
+ # Valid URIs are from RFC 2396:
23
+ # "URI-reference", "absoluteURI", "relativeURI", "port",
24
+ # "host","abs_path", "rel_path", and "authority"
25
+
26
+ # MUST be able to handle the URI of any resource they serve
27
+
28
+ # SHOULD be able to handle URIs of unbounded length if they
29
+ # provide GET-based forms that could generate such URIs.
30
+
31
+ # A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer
32
+ # than the server can handle (see section 10.4.15).
33
+ end
34
+
35
+
36
+ specify "3.2.2: http URL" do
37
+ # http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
38
+
39
+ # The use of IP addresses in URLs SHOULD be avoided whenever possible
40
+
41
+ # If the abs_path is not present in the URL, it MUST be given as "/" when
42
+ # used as a Request-URI for a resource (section 5.1.2).
43
+
44
+ # If a proxy receives a host name which is not a fully qualified domain
45
+ # name, it MAY add its domain to the host name it received.
46
+
47
+ # If a proxy receives a fully qualified domain name, the proxy MUST NOT
48
+ # change the host name.
49
+ end
50
+
51
+
52
+ specify "3.2.3: URI Comparison" do
53
+ # When comparing two URIs to decide if they match or not, a client SHOULD
54
+ # use a case-sensitive octet-by-octet comparison of the entire URIs, with
55
+ # these exceptions:
56
+
57
+ # - A port that is empty or not given is equivalent to the default port for
58
+ # that URI-reference;
59
+
60
+ # - Comparisons of host names MUST be case-insensitive;
61
+
62
+ # - Comparisons of scheme names MUST be case-insensitive;
63
+
64
+ # - An empty abs_path is equivalent to an abs_path of "/".
65
+
66
+ # http://abc.com:80/~smith/home.html
67
+ # http://ABC.com/%7Esmith/home.html
68
+ # http://ABC.com:/%7esmith/home.html
69
+ end
70
+
71
+
72
+ specify "3.3: Date/Time Formats" do
73
+ end
74
+
75
+
76
+ specify "3.3.1: Full Date" do
77
+ # HTTP/1.1 clients and servers that parse the date value MUST accept
78
+ # all three formats:
79
+
80
+ # Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
81
+ # Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
82
+ # Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
83
+
84
+ # MUST only generate the RFC 1123 format for representing HTTP-date values
85
+ # in header fields
86
+
87
+ # MUST be represented in Greenwich Mean Time (GMT), without exception
88
+
89
+ # MUST be assumed when reading the asctime format
90
+
91
+ # HTTP-date is case sensitive and MUST NOT include
92
+ # additional LWS beyond that specifically included as SP in the
93
+ # grammar.
94
+ end
95
+
96
+
97
+ specify "3.3.2: Delta Seconds" do
98
+ # delta-seconds = 1*DIGIT (for some http headers)
99
+ end
100
+
101
+
102
+ specify "3.4: Character Sets" do
103
+ # MIME character set name MUST fully specify the mapping to be performed
104
+ # from octets to characters.
105
+
106
+ # any token that has a predefined value within the IANA Character Set
107
+ # registry [19] MUST represent the character set defined by that registry
108
+ end
109
+
110
+ specify "3.4.1: Missing Charset" do
111
+ # Some HTTP/1.0 software has interpreted a Content-Type header without
112
+ # charset parameter incorrectly to mean "recipient should guess."
113
+ # Senders wishing to defeat this behavior
114
+
115
+ # MAY include a charset parameter even when the charset is ISO-8859-1 and
116
+ # SHOULD do so when it is known that it will not confuse the recipient.
117
+
118
+ # HTTP/1.1 recipients MUST respect the charset label provided by the
119
+ # sender; and
120
+
121
+ # those user agents that have a provision to "guess" a charset MUST use the
122
+ # charset from the content-type field if they support that charset, rather
123
+ # than the recipient's preference, when initially displaying a document.
124
+
125
+ # See section 3.7.1.
126
+ end
127
+
128
+
129
+ specify "3.5: Content Codings" do
130
+ # All content-coding values are case-insensitive
131
+
132
+ # gzip
133
+ # compress
134
+ # deflate
135
+ # identity
136
+
137
+ # New content-coding value tokens SHOULD be registered
138
+ end
139
+
140
+
141
+ specify "3.6: Transfer Codings" do
142
+ # the transfer-coding is a property of the message, not of the original entity.
143
+
144
+ # transfer-coding = "chunked" | transfer-extension
145
+ # transfer-extension = token *( ";" parameter )
146
+
147
+ # Parameters are in the form of attribute/value pairs.
148
+
149
+ # parameter = attribute "=" value
150
+ # attribute = token
151
+ # value = token | quoted-string
152
+
153
+ # All transfer-coding values are case-insensitive
154
+
155
+ # Whenever a transfer-coding is applied to a message-body, the set of
156
+ # transfer-codings MUST include "chunked", unless the message is terminated
157
+ # by closing the connection
158
+
159
+ # "chunked" MUST be the last transfer-coding applied to the message-body
160
+
161
+ # A server which receives an entity-body with a transfer-coding it does not
162
+ # understand SHOULD return 501 (Unimplemented), and close the connection.
163
+
164
+ # A server MUST NOT send transfer-codings to an HTTP/1.0 client.
165
+ end
166
+
167
+
168
+ specify "3.6.1: Chunked Transfer Coding" do
169
+ # AMBIGUITY: It's not clear whether clients can use chunked encoding on requests.
170
+
171
+ # MUST NOT use the trailer for any header fields unless at least one of the
172
+ # following is true:
173
+
174
+ # - The TE header includes "trailers"
175
+ # - server is origin, trailer is all optional, recipient can use if discarded
176
+
177
+ # All HTTP/1.1 applications MUST be able to receive and decode the
178
+ # "chunked" transfer-coding, and MUST ignore chunk-extension extensions
179
+ # they do not understand.
180
+ # AMBIGUITY: "applications"? WTF is that? client? server?
181
+ end
182
+
183
+
184
+ specify "3.7: Media Types" do
185
+ # Parameters MAY follow the type/subtype in the form of attribute/value pairs
186
+
187
+ # Linear white space (LWS) MUST NOT be used between the type and subtype,
188
+ # nor between an attribute and its value
189
+
190
+ # When sending data to older HTTP applications, implementations SHOULD only
191
+ # use media type parameters when they are required by that type/subtype
192
+ # definition.
193
+ # AMBIGUITY: How the hell do we determine that an app is old?
194
+ end
195
+
196
+
197
+ specify "3.7.1: Canonicalization and Text Defaults" do
198
+ # RANT: The majority of this section is impossible to test.
199
+
200
+ # The entire paragraph about CR,LF,and CRLF is garbage. Basically,
201
+ # if you set a media subtype of "text" then the client has to deal
202
+ # with just about any 'line break' combo humanly possible.
203
+
204
+ # If an entity-body is encoded with a content-coding, the underlying data
205
+ # MUST be in a form defined above prior to being encoded.
206
+
207
+ # Data in character sets other than "ISO-8859-1" or its subsets MUST be
208
+ # labeled with an appropriate charset value. See section 3.4.1 for
209
+ # compatibility problems.
210
+ end
211
+
212
+
213
+ specify "3.7.2: Multipart Types" do
214
+ # MUST include a boundary parameter as part of the media type value.
215
+
216
+ # MUST therefore use only CRLF to represent line breaks between body-parts
217
+
218
+ # Unlike in RFC 2046, the epilogue of any multipart message MUST be empty;
219
+
220
+ # HTTP applications MUST NOT transmit the epilogue (even if the original
221
+ # multipart contains an epilogue).
222
+
223
+ # ... "multipart/byteranges" type (appendix 19.2) when it appears in a 206
224
+ # (Partial Content) response, which will be interpreted by some HTTP
225
+ # caching mechanisms as described in sections 13.5.4 and 14.16
226
+
227
+ # an HTTP user agent SHOULD follow the same or similar behavior as a MIME
228
+ # user agent would upon receipt of a multipart type
229
+
230
+ # If an application receives an unrecognized multipart subtype, the
231
+ # application MUST treat it as being equivalent to "multipart/mixed".
232
+ end
233
+
234
+
235
+ specify "3.8: Product Tokens" do
236
+ # product = token ["/" product-version]
237
+ # product-version = token
238
+
239
+ # SHOULD be short and to the point
240
+
241
+ # MUST NOT be used for advertising or other non-essential information
242
+
243
+ # Although any token character MAY appear in a product-version, this token
244
+ # SHOULD only be used for a version identifier
245
+ end
246
+
247
+
248
+ specify "3.9: Quality Values" do
249
+ # HTTP/1.1 applications MUST NOT generate more than three digits after the
250
+ # decimal point.
251
+
252
+ # User configuration of these values SHOULD also be limited in this
253
+ # fashion.
254
+ end
255
+
256
+
257
+ specify "3.10: Language Tags" do
258
+ # language-tag = primary-tag *( "-" subtag )
259
+ # primary-tag = 1*8ALPHA
260
+ # subtag = 1*8ALPHA
261
+
262
+ # White space is not allowed within the tag and all tags are case-
263
+ # insensitive.
264
+ end
265
+
266
+
267
+ specify "3.11: Entity Tags" do
268
+ # An entity tag MUST be unique across all versions of all entities
269
+ # associated with a particular resource.
270
+
271
+ # A given entity tag value MAY be used for entities obtained by requests on
272
+ # different URIs.
273
+ end
274
+
275
+
276
+ specify "3.12: Range Units" do
277
+ # range-unit = bytes-unit | other-range-unit
278
+ # bytes-unit = "bytes"
279
+ # other-range-unit = token
280
+
281
+ # The only range unit defined by HTTP/1.1 is "bytes". HTTP/1.1
282
+ # implementations MAY ignore ranges specified using other units.
283
+ end
284
+
285
+
286
+ end
@@ -0,0 +1,28 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "5: Request" do
4
+ setup do
5
+ @sess = RFuzz::Session.new :host => "localhost", :port => 3000
6
+ end
7
+
8
+ specify "5.1: Request-Line" do
9
+ end
10
+
11
+
12
+ specify "5.1.1: Method" do
13
+ end
14
+
15
+
16
+ specify "5.1.2: Request-URI" do
17
+ end
18
+
19
+
20
+ specify "5.2: The Resource Identified by a Request" do
21
+ end
22
+
23
+
24
+ specify "5.3: Request Header Fields" do
25
+ end
26
+
27
+
28
+ end
@@ -0,0 +1,20 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "6: Response" do
4
+ setup do
5
+ @sess = RFuzz::Session.new :host => "localhost", :port => 3000
6
+ end
7
+
8
+ specify "6.1: Status-Line" do
9
+ end
10
+
11
+
12
+ specify "6.1.1: Status Code and Reason Phrase" do
13
+ end
14
+
15
+
16
+ specify "6.2: Response Header Fields" do
17
+ end
18
+
19
+
20
+ end
@@ -0,0 +1,54 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "15: Security Considerations" do
4
+ setup do
5
+ @sess = RFuzz::Session.new :host => "localhost", :port => 3000
6
+ end
7
+
8
+ specify "15.1: Personal Information" do
9
+ end
10
+
11
+
12
+ specify "15.1.1: Abuse of Server Log Information" do
13
+ end
14
+
15
+
16
+ specify "15.1.2: Transfer of Sensitive Information" do
17
+ end
18
+
19
+
20
+ specify "15.1.3: Encoding Sensitive Information in URI's" do
21
+ end
22
+
23
+
24
+ specify "15.1.4: Privacy Issues Connected to Accept Headers" do
25
+ end
26
+
27
+
28
+ specify "15.2: Attacks Based On File and Path Names" do
29
+ end
30
+
31
+
32
+ specify "15.3: DNS Spoofing" do
33
+ end
34
+
35
+
36
+ specify "15.4: Location Headers and Spoofing" do
37
+ end
38
+
39
+
40
+ specify "15.5: Content-Disposition Issues" do
41
+ end
42
+
43
+
44
+ specify "15.6: Authentication Credentials and Idle Clients" do
45
+ end
46
+
47
+
48
+ specify "15.7: Proxies and Caching" do
49
+ end
50
+
51
+
52
+ specify "15.7.1: Denial of Service Attacks on Proxies" do
53
+ end
54
+ end
@@ -0,0 +1,192 @@
1
+ require 'rfuzz/session'
2
+
3
+ context "10: Status Code Definitions" do
4
+ setup do
5
+ @sess = RFuzz::Session.new :host => "localhost", :port => 3000
6
+ end
7
+
8
+ specify "10.1: Informational 1xx" do
9
+ end
10
+
11
+
12
+ specify "10.1.1: 100 Continue" do
13
+ end
14
+
15
+
16
+ specify "10.1.2: 101 Switching Protocols" do
17
+ end
18
+
19
+
20
+ specify "10.2: Successful 2xx" do
21
+ end
22
+
23
+
24
+ specify "10.2.1: 200 OK" do
25
+ end
26
+
27
+
28
+ specify "10.2.2: 201 Created" do
29
+ end
30
+
31
+
32
+ specify "10.2.3: 202 Accepted" do
33
+ end
34
+
35
+
36
+ specify "10.2.4: 203 Non-Authoritative Information" do
37
+ end
38
+
39
+
40
+ specify "10.2.5: 204 No Content" do
41
+ end
42
+
43
+
44
+ specify "10.2.6: 205 Reset Content" do
45
+ end
46
+
47
+
48
+ specify "10.2.7: 206 Partial Content" do
49
+ end
50
+
51
+
52
+ specify "10.3: Redirection 3xx" do
53
+ end
54
+
55
+
56
+ specify "10.3.1: 300 Multiple Choices" do
57
+ end
58
+
59
+
60
+ specify "10.3.2: 301 Moved Permanently" do
61
+ end
62
+
63
+
64
+ specify "10.3.3: 302 Found" do
65
+ end
66
+
67
+
68
+ specify "10.3.4: 303 See Other" do
69
+ end
70
+
71
+
72
+ specify "10.3.5: 304 Not Modified" do
73
+ end
74
+
75
+
76
+ specify "10.3.6: 305 Use Proxy" do
77
+ end
78
+
79
+
80
+ specify "10.3.7: 306 (Unused)" do
81
+ end
82
+
83
+
84
+ specify "10.3.8: 307 Temporary Redirect" do
85
+ end
86
+
87
+
88
+ specify "10.4: Client Error 4xx" do
89
+ end
90
+
91
+
92
+ specify "10.4.1: 400 Bad Request" do
93
+ end
94
+
95
+
96
+ specify "10.4.2: 401 Unauthorized" do
97
+ end
98
+
99
+
100
+ specify "10.4.3: 402 Payment Required" do
101
+ end
102
+
103
+
104
+ specify "10.4.4: 403 Forbidden" do
105
+ end
106
+
107
+
108
+ specify "10.4.5: 404 Not Found" do
109
+ end
110
+
111
+
112
+ specify "10.4.6: 405 Method Not Allowed" do
113
+ end
114
+
115
+
116
+ specify "10.4.7: 406 Not Acceptable" do
117
+ end
118
+
119
+
120
+ specify "10.4.8: 407 Proxy Authentication Required" do
121
+ end
122
+
123
+
124
+ specify "10.4.9: 408 Request Timeout" do
125
+ end
126
+
127
+
128
+ specify "10.4.10: 409 Conflict" do
129
+ end
130
+
131
+
132
+ specify "10.4.11: 410 Gone" do
133
+ end
134
+
135
+
136
+ specify "10.4.12: 411 Length Required" do
137
+ end
138
+
139
+
140
+ specify "10.4.13: 412 Precondition Failed" do
141
+ end
142
+
143
+
144
+ specify "10.4.14: 413 Request Entity Too Large" do
145
+ end
146
+
147
+
148
+ specify "10.4.15: 414 Request-URI Too Long" do
149
+ end
150
+
151
+
152
+ specify "10.4.16: 415 Unsupported Media Type" do
153
+ end
154
+
155
+
156
+ specify "10.4.17: 416 Requested Range Not Satisfiable" do
157
+ end
158
+
159
+
160
+ specify "10.4.18: 417 Expectation Failed" do
161
+ end
162
+
163
+
164
+ specify "10.5: Server Error 5xx" do
165
+ end
166
+
167
+
168
+ specify "10.5.1: 500 Internal Server Error" do
169
+ end
170
+
171
+
172
+ specify "10.5.2: 501 Not Implemented" do
173
+ end
174
+
175
+
176
+ specify "10.5.3: 502 Bad Gateway" do
177
+ end
178
+
179
+
180
+ specify "10.5.4: 503 Service Unavailable" do
181
+ end
182
+
183
+
184
+ specify "10.5.5: 504 Gateway Timeout" do
185
+ end
186
+
187
+
188
+ specify "10.5.6: 505 HTTP Version Not Supported" do
189
+ end
190
+
191
+
192
+ end
@@ -8,7 +8,6 @@
8
8
  #include <assert.h>
9
9
  #include <string.h>
10
10
  #include <ctype.h>
11
- #include <inttypes.h>
12
11
 
13
12
  static VALUE mRFuzz;
14
13
  static VALUE cFuzzRnd;
@@ -48,7 +47,7 @@ static struct
48
47
  VALUE FuzzRnd_data(VALUE self, VALUE length)
49
48
  {
50
49
 
51
- uint32_t n;
50
+ unsigned int n;
52
51
  unsigned char a,b;
53
52
  size_t len = 0;
54
53
  VALUE data;
@@ -0,0 +1,53 @@
1
+ require 'rfuzz/session'
2
+ require 'hpricot'
3
+
4
+ module RFuzz
5
+
6
+ # A simple class that emulates a browser using hpricot.
7
+ class Browser
8
+ attr_accessor :client
9
+ attr_accessor :doc
10
+ attr_accessor :response
11
+ attr_accessor :agent
12
+
13
+ DEFAULT_AGENT="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4"
14
+
15
+ # The default agent used is Mozilla (from linux Dapper Drake), but you
16
+ # can change it to something else.
17
+ def initialize(host, port=80, ops={}, agent=DEFAULT_AGENT)
18
+ @agent = agent
19
+ @client = HttpClient.new(host, port, ops)
20
+
21
+ ops[:head] ||= {}
22
+ ops[:head]["User-Agent"] ||= @agent
23
+
24
+ @doc = nil
25
+ @response = nil
26
+ end
27
+
28
+ # Makes the browser do a GET to this location. It takes the same
29
+ # params as HttpClient does for any method.
30
+ def start(uri, ops={})
31
+ @response = @client.get(uri,ops)
32
+ if @response.http_status != "200"
33
+ raise "Invalid status: #{@response.http_status}"
34
+ end
35
+
36
+ @doc = Hpricot(@response.http_body)
37
+ end
38
+
39
+ # Returns an Array of Hpricot objects that are the links on the
40
+ # current page. If you pass in matching as a regex (or any ===
41
+ # compatible with String) then it'll only return those links.
42
+ def links(matching=nil)
43
+ links = @doc/:a
44
+ if matching
45
+ # return only the ones that match
46
+ return links.select {|l| matching === l.attributes["href"]}
47
+ else
48
+ return links
49
+ end
50
+ end
51
+ end
52
+
53
+ end