knjrbfw 0.0.33 → 0.0.34
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/VERSION +1 -1
- data/knjrbfw.gemspec +2 -2
- data/lib/knj/gtk2.rb +1 -1
- data/lib/knj/gtk2_statuswindow.rb +1 -0
- data/lib/knj/http2.rb +83 -78
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.34
|
data/knjrbfw.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{knjrbfw}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.34"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kasper Johansen"]
|
12
|
-
s.date = %q{2012-05-
|
12
|
+
s.date = %q{2012-05-19}
|
13
13
|
s.description = %q{Including stuff for HTTP, SSH and much more.}
|
14
14
|
s.email = %q{k@spernj.org}
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/knj/gtk2.rb
CHANGED
data/lib/knj/http2.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "#{$knjpath}web"
|
2
|
+
require "socket"
|
2
3
|
|
3
4
|
#This class tries to emulate a browser in Ruby without any visual stuff. Remember cookies, keep sessions alive, reset connections according to keep-alive rules and more.
|
4
5
|
#===Examples
|
@@ -21,7 +22,9 @@ class Knj::Http2
|
|
21
22
|
@args = args
|
22
23
|
@cookies = {}
|
23
24
|
@debug = @args[:debug]
|
24
|
-
|
25
|
+
|
26
|
+
require "monitor"
|
27
|
+
@mutex = Monitor.new
|
25
28
|
|
26
29
|
if !@args[:port]
|
27
30
|
if @args[:ssl]
|
@@ -155,25 +158,20 @@ class Knj::Http2
|
|
155
158
|
# res = http.get("somepage.html")
|
156
159
|
# print res.body #=> <String>-object containing the HTML gotten.
|
157
160
|
def get(addr, args = {})
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
return resp
|
173
|
-
end
|
174
|
-
rescue Knj::Errors::Retry => e
|
175
|
-
print "Redirecting to: #{e.message}\n" if @debug
|
176
|
-
return self.get(e.message, args)
|
161
|
+
@mutex.synchronize do
|
162
|
+
args[:addr] = addr
|
163
|
+
header_str = "GET /#{addr} HTTP/1.1#{@nl}"
|
164
|
+
header_str << self.header_str(self.default_headers(args), args)
|
165
|
+
header_str << "#{@nl}"
|
166
|
+
|
167
|
+
print "Http2: Writing headers.\n" if @debug
|
168
|
+
self.write(header_str)
|
169
|
+
|
170
|
+
print "Http2: Reading response.\n" if @debug
|
171
|
+
resp = self.read_response(args)
|
172
|
+
|
173
|
+
print "Http2: Done with get request.\n" if @debug
|
174
|
+
return resp
|
177
175
|
end
|
178
176
|
end
|
179
177
|
|
@@ -242,20 +240,20 @@ class Knj::Http2
|
|
242
240
|
#===Examples
|
243
241
|
# res = http.post("login.php", {"username" => "John Doe", "password" => 123)
|
244
242
|
def post(addr, pdata = {}, args = {})
|
245
|
-
|
246
|
-
@
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
return self.
|
243
|
+
@mutex.synchronize do
|
244
|
+
print "Doing post.\n" if @debug
|
245
|
+
|
246
|
+
praw = Knj::Http2.post_convert_data(pdata)
|
247
|
+
|
248
|
+
header_str = "POST /#{addr} HTTP/1.1#{@nl}"
|
249
|
+
header_str << self.header_str(self.default_headers(args).merge("Content-Length" => praw.length), args)
|
250
|
+
header_str << "#{@nl}"
|
251
|
+
header_str << praw
|
252
|
+
|
253
|
+
print "Header str: #{header_str}\n" if @debug
|
254
|
+
|
255
|
+
self.write(header_str)
|
256
|
+
return self.read_response(args)
|
259
257
|
end
|
260
258
|
end
|
261
259
|
|
@@ -263,51 +261,50 @@ class Knj::Http2
|
|
263
261
|
#===Examples
|
264
262
|
# res = http.post_multipart("upload.php", {"normal_value" => 123, "file" => Tempfile.new(?)})
|
265
263
|
def post_multipart(addr, pdata, args = {})
|
266
|
-
|
267
|
-
|
268
|
-
|
264
|
+
require "digest"
|
265
|
+
|
266
|
+
@mutex.synchronize do
|
267
|
+
boundary = Digest::MD5.hexdigest(Time.now.to_f.to_s)
|
268
|
+
|
269
|
+
praw = ""
|
270
|
+
pdata.each do |key, val|
|
271
|
+
praw << "--#{boundary}#{@nl}"
|
269
272
|
|
270
|
-
|
271
|
-
|
272
|
-
praw << "
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
praw << "Content-Length: #{val[:content].bytesize}#{@nl}"
|
280
|
-
else
|
281
|
-
praw << "Content-Disposition: form-data; name=\"#{key}\";#{@nl}"
|
282
|
-
praw << "Content-Length: #{val.bytesize}#{@nl}"
|
283
|
-
end
|
284
|
-
|
285
|
-
praw << "Content-Type: text/plain#{@nl}"
|
286
|
-
praw << @nl
|
287
|
-
|
288
|
-
if val.is_a?(StringIO)
|
289
|
-
praw << val.read
|
290
|
-
elsif val.is_a?(Hash) and val[:content]
|
291
|
-
praw << val[:content].to_s
|
292
|
-
else
|
293
|
-
praw << val.to_s
|
294
|
-
end
|
295
|
-
|
296
|
-
praw << @nl
|
273
|
+
if val.class.name == "Tempfile" and val.respond_to?("original_filename")
|
274
|
+
praw << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{val.original_filename}\";#{@nl}"
|
275
|
+
praw << "Content-Length: #{val.bytesize}#{@nl}"
|
276
|
+
elsif val.is_a?(Hash) and val[:filename]
|
277
|
+
praw << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{val[:filename]}\";#{@nl}"
|
278
|
+
praw << "Content-Length: #{val[:content].bytesize}#{@nl}"
|
279
|
+
else
|
280
|
+
praw << "Content-Disposition: form-data; name=\"#{key}\";#{@nl}"
|
281
|
+
praw << "Content-Length: #{val.bytesize}#{@nl}"
|
297
282
|
end
|
298
283
|
|
299
|
-
|
300
|
-
|
301
|
-
header_str << self.header_str(self.default_headers(args).merge("Content-Length" => praw.bytesize), args)
|
302
|
-
header_str << "#{@nl}"
|
303
|
-
header_str << praw
|
304
|
-
header_str << "--#{boundary}--"
|
284
|
+
praw << "Content-Type: text/plain#{@nl}"
|
285
|
+
praw << @nl
|
305
286
|
|
306
|
-
|
307
|
-
|
287
|
+
if val.is_a?(StringIO)
|
288
|
+
praw << val.read
|
289
|
+
elsif val.is_a?(Hash) and val[:content]
|
290
|
+
praw << val[:content].to_s
|
291
|
+
else
|
292
|
+
praw << val.to_s
|
293
|
+
end
|
294
|
+
|
295
|
+
praw << @nl
|
308
296
|
end
|
309
|
-
|
310
|
-
|
297
|
+
|
298
|
+
header_str = "POST /#{addr} HTTP/1.1#{@nl}"
|
299
|
+
header_str << self.header_str(self.default_headers(args).merge("Content-Type" => "multipart/form-data; boundary=#{boundary}", "Content-Length" => praw.bytesize), args)
|
300
|
+
header_str << "#{@nl}"
|
301
|
+
header_str << praw
|
302
|
+
header_str << "--#{boundary}--"
|
303
|
+
|
304
|
+
print "Headerstr: #{header_str}\n" if @debug
|
305
|
+
|
306
|
+
self.write(header_str)
|
307
|
+
return self.read_response(args)
|
311
308
|
end
|
312
309
|
end
|
313
310
|
|
@@ -353,15 +350,18 @@ class Knj::Http2
|
|
353
350
|
else
|
354
351
|
line = @sock.gets
|
355
352
|
end
|
353
|
+
|
354
|
+
print "<#{@mode}>: '#{line}'\n" if @debug
|
356
355
|
rescue Errno::ECONNRESET
|
357
356
|
print "Http2: The connection was reset while reading - breaking gently...\n" if @debug
|
358
|
-
line = ""
|
359
357
|
@sock = nil
|
358
|
+
break
|
360
359
|
end
|
361
360
|
|
362
361
|
break if line.to_s == ""
|
363
362
|
|
364
363
|
if @mode == "headers" and line == @nl
|
364
|
+
print "Changing mode to body!\n" if @debug
|
365
365
|
break if @length == 0
|
366
366
|
@mode = "body"
|
367
367
|
next
|
@@ -406,17 +406,22 @@ class Knj::Http2
|
|
406
406
|
raise "No status-code was received from the server.\n\nHeaders:\n#{Knj::Php.print_r(resp.headers, true)}\n\nBody:\n#{resp.args[:body]}" if !resp.args[:code]
|
407
407
|
|
408
408
|
if resp.args[:code].to_s == "302" and resp.header?("location") and (!@args.key?(:follow_redirects) or @args[:follow_redirects])
|
409
|
+
require "uri"
|
409
410
|
uri = URI.parse(resp.header("location"))
|
411
|
+
url = uri.path
|
412
|
+
url << "?#{uri.query}" if uri.query.to_s.length > 0
|
410
413
|
|
411
414
|
args = {:host => uri.host}
|
412
415
|
args[:ssl] = true if uri.scheme == "https"
|
413
416
|
args[:port] = uri.port if uri.port
|
414
417
|
|
418
|
+
print "Redirecting from location-header to '#{url}'.\n" if @debug
|
419
|
+
|
415
420
|
if !args[:host] or args[:host] == @args[:host]
|
416
|
-
|
421
|
+
return self.get(url)
|
417
422
|
else
|
418
423
|
http = Knj::Http2.new(args)
|
419
|
-
return http.get(
|
424
|
+
return http.get(url)
|
420
425
|
end
|
421
426
|
elsif resp.args[:code].to_s == "500"
|
422
427
|
raise "500 - Internal server error: '#{args[:addr]}':\n\n#{resp.body}"
|
@@ -476,7 +481,7 @@ class Knj::Http2
|
|
476
481
|
@resp.args[:code] = match[2]
|
477
482
|
@resp.args[:http_version] = match[1]
|
478
483
|
else
|
479
|
-
raise "Could not understand header string: '#{line}'."
|
484
|
+
raise "Could not understand header string: '#{line}'.\n\n#{@sock.read(409600)}"
|
480
485
|
end
|
481
486
|
end
|
482
487
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: knjrbfw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.34
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Kasper Johansen
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-05-
|
13
|
+
date: 2012-05-19 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -371,7 +371,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
371
371
|
requirements:
|
372
372
|
- - ">="
|
373
373
|
- !ruby/object:Gem::Version
|
374
|
-
hash:
|
374
|
+
hash: -3216752149804920107
|
375
375
|
segments:
|
376
376
|
- 0
|
377
377
|
version: "0"
|