rhack 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +17 -1
- data/LICENSE +2 -1
- data/Manifest.txt +8 -0
- data/Rakefile +3 -4
- data/ext/curb/Makefile +125 -69
- data/ext/curb/curb.o +0 -0
- data/ext/curb/curb_config.h +37 -2
- data/ext/curb/curb_core.so +0 -0
- data/ext/curb/curb_easy.o +0 -0
- data/ext/curb/curb_errors.o +0 -0
- data/ext/curb/curb_multi.o +0 -0
- data/ext/curb/curb_postfield.o +0 -0
- data/ext/curb/curb_upload.o +0 -0
- data/ext/curb/mkmf.log +4770 -0
- data/lib/curl-global.rb +11 -5
- data/lib/frame.rb +106 -42
- data/lib/rhack.yml.template +19 -19
- data/lib/rhack/services.rb +14 -7
- data/lib/scout.rb +6 -8
- metadata +14 -6
data/lib/curl-global.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Curl
|
3
3
|
|
4
|
-
def execute
|
5
|
-
|
6
|
-
|
4
|
+
def execute(unless_allready=false)
|
5
|
+
if unless_allready and Curl.status
|
6
|
+
return L.debug "Non-nil status! Avoid executing"
|
7
|
+
end
|
7
8
|
if $CarierThread and s = $CarierThread.status
|
8
9
|
L.debug "Carier thread allready started and has status #{s}"
|
9
10
|
else
|
@@ -33,13 +34,16 @@ module Curl
|
|
33
34
|
} unless error
|
34
35
|
error
|
35
36
|
}
|
37
|
+
# until main thread has sleep a bit, $CarierThread will have status "run",
|
38
|
+
# no matter whether it's idling or performing requests
|
39
|
+
sleep 0.001
|
36
40
|
end
|
37
41
|
end
|
38
42
|
alias :run :execute
|
39
43
|
module_function :execute, :run
|
40
44
|
|
41
45
|
def wait
|
42
|
-
if $CarierThread
|
46
|
+
if $CarierThread and $CarierThread.status
|
43
47
|
if !(within = Thread.current == $CarierThread)
|
44
48
|
# We can't set `perform' timeout lesser than 1 second in the curl binding
|
45
49
|
# because in that case thread status would always be "run"
|
@@ -84,7 +88,9 @@ module Curl
|
|
84
88
|
end
|
85
89
|
end
|
86
90
|
else
|
87
|
-
L
|
91
|
+
L < "No thread to wait. I guess I should create one"
|
92
|
+
execute
|
93
|
+
wait
|
88
94
|
end
|
89
95
|
end
|
90
96
|
module_function :wait
|
data/lib/frame.rb
CHANGED
@@ -21,11 +21,12 @@ module HTTPAccessKit
|
|
21
21
|
|
22
22
|
class Frame
|
23
23
|
__init__
|
24
|
-
attr_reader :loc, :static, :ss, :opts
|
24
|
+
attr_reader :loc, :static, :ss, :opts, :use_cache, :write_to
|
25
|
+
@@cache = {}
|
25
26
|
|
26
27
|
def initialize *args
|
27
28
|
args << 10 unless args[-1].is Fixnum
|
28
|
-
args
|
29
|
+
args.insert -2, {} unless args[-2].is Hash
|
29
30
|
@opts = {:eval => Johnson::Enabled, :redir => true, :cp => true, :result => Page}.merge!(args[-2].kinda(Hash) ? args[-2] : {})
|
30
31
|
args[-2] = @opts
|
31
32
|
if args[0].is String
|
@@ -39,8 +40,7 @@ module HTTPAccessKit
|
|
39
40
|
@static = false
|
40
41
|
end
|
41
42
|
@ss = ScoutSquad *args
|
42
|
-
|
43
|
-
Curl.run unless Curl.status
|
43
|
+
Curl.run :unless_allready
|
44
44
|
end
|
45
45
|
|
46
46
|
def retarget to, forced=nil
|
@@ -48,23 +48,40 @@ module HTTPAccessKit
|
|
48
48
|
@ss.update to, forced
|
49
49
|
@loc = to.parse:uri
|
50
50
|
end
|
51
|
-
|
52
|
-
def target=to
|
53
|
-
retarget to
|
54
|
-
end
|
51
|
+
alias :target= :retarget
|
55
52
|
|
56
53
|
def next() @ss.next end
|
57
54
|
def rand() @ss.rand end
|
58
55
|
def each(&block) @ss.each &block end
|
59
56
|
def [](i) @ss[i] end
|
60
57
|
|
58
|
+
def copy_cookies! i=0
|
59
|
+
@ss.each {|s| s.cookies.replace @ss[i].cookies}
|
60
|
+
end
|
61
|
+
|
62
|
+
def use_cache! opts={}
|
63
|
+
if opts == false
|
64
|
+
@use_cache = false
|
65
|
+
else
|
66
|
+
@@cache = opts[:pages].kinda(Hash) ? opts[:pages] : opts[:pages].map_hash {|p| [p.href, p]} if opts[:pages]
|
67
|
+
#@write_to = opts[:write_to] if :write_to.in opts
|
68
|
+
@use_cache = true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def drop_cache! use=nil
|
73
|
+
@@cache.clear
|
74
|
+
GC.start
|
75
|
+
@use_cache = use if use.in [true, false]
|
76
|
+
end
|
77
|
+
|
61
78
|
def inspect
|
62
79
|
"<#Frame @ #{@ss.untargeted ? 'no target' : @loc.root}: #{'scout'.x @ss.size}#{', static' if @static}, cookies #{@ss[0].cookieProc ? 'on' : 'off'}>"
|
63
80
|
end
|
64
81
|
|
65
82
|
# opts are :eval, :json, :hash, :wait, :proc_result, :save_result, :load_scripts,
|
66
83
|
# :zip, :thread_safe, :result, :stream, :raw, :xhr + any opts for Scouts in one hash
|
67
|
-
def
|
84
|
+
def exec *args, &callback
|
68
85
|
many, order, orders, with_opts = interpret_request *args
|
69
86
|
L.log({:many => many, :order => order, :orders => orders, :with_opts => with_opts})
|
70
87
|
|
@@ -79,7 +96,7 @@ module HTTPAccessKit
|
|
79
96
|
if many then exec_many orders, with_opts, &callback
|
80
97
|
else exec_one order, with_opts, &callback end
|
81
98
|
end
|
82
|
-
alias :
|
99
|
+
alias :get :exec
|
83
100
|
alias :run :get
|
84
101
|
|
85
102
|
def interpret_request(*args)
|
@@ -431,28 +448,46 @@ module HTTPAccessKit
|
|
431
448
|
uris.map! {|u| validate u}
|
432
449
|
end
|
433
450
|
|
434
|
-
def
|
451
|
+
def run_callbacks!(page, opts, &callback)
|
452
|
+
if callback
|
453
|
+
yres = callback.call page
|
454
|
+
if opts[:save_result] or :proc_result.in opts
|
455
|
+
page.res = yres
|
456
|
+
end
|
457
|
+
if opts[:proc_result].is Proc and yres != :skip
|
458
|
+
opts[:proc_result].call yres
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
# TODO: found why/how IO on callbacks breaks +curl.res.body+ content and how to fix or how to avoid it
|
464
|
+
def exec_one(order, opts, &callback)
|
465
|
+
if @use_cache and order[0] == :loadGet and page = @@cache[order[1]]
|
466
|
+
run_callbacks! page, opts, &callback
|
467
|
+
res = opts[:wait] && (opts[:save_result] or :proc_result.in opts) ? page.res : page
|
468
|
+
return res
|
469
|
+
end
|
435
470
|
# must result in Page (default) or it's subclass
|
436
471
|
page = opts[:result].new
|
437
|
-
# if no spare scouts can be found, squad simply waits for
|
472
|
+
# if no spare scouts can be found, squad simply waits for first callbacks to complete
|
438
473
|
s = @ss.next
|
439
|
-
#s.raise_err = true# Зачем это тут? Можно добавлять :raise=>1 фрейму при запиле
|
440
474
|
s.send(*(order << opts)) {|curl|
|
475
|
+
# there is a problem with storing html on disk
|
476
|
+
if order[0] == :loadGet and @write_to
|
477
|
+
# sometimes (about 2% for 100-threads-dling) when this string is calling
|
478
|
+
# no matter what +curl.res.body+ has contained here
|
479
|
+
RMTools.rw @write_to+'/'+order[-2].sub(/^[a-z]+:\/\//, ''), curl.res.body.xml_to_utf
|
480
|
+
end
|
441
481
|
if opts[:raw]
|
442
482
|
yield curl
|
443
|
-
|
444
|
-
|
445
|
-
if
|
446
|
-
|
447
|
-
end
|
448
|
-
if opts[:proc_result].is Proc and yres != :skip
|
449
|
-
opts[:proc_result].call yres
|
450
|
-
end
|
483
|
+
# here +curl.res.body+ become empty
|
484
|
+
elsif page.process(curl, opts)
|
485
|
+
@@cache[page.href] = page if order[0] == :loadGet and @use_cache
|
486
|
+
run_callbacks! page, opts, &callback
|
451
487
|
end
|
452
488
|
}
|
453
489
|
if opts[:wait]
|
454
490
|
opts[:thread_safe] ? $Carier.perform : Curl.wait
|
455
|
-
# почему бы не уменьшить бойлерплейт в сервисах и не возвращать res сразу?
|
456
491
|
(opts[:save_result] or :proc_result.in opts) ? page.res : page
|
457
492
|
else page
|
458
493
|
end
|
@@ -530,39 +565,49 @@ module HTTPAccessKit
|
|
530
565
|
# for debug, just enable L#debug, don't write tons of chaotic log-lines
|
531
566
|
__init__
|
532
567
|
# res here is result of page processing made in frame context
|
533
|
-
|
534
|
-
attr_reader :html, :loc, :hash, :doc, :js
|
568
|
+
attr_writer :title
|
569
|
+
attr_reader :html, :loc, :hash, :doc, :js, :curl_res, :failed
|
570
|
+
attr_accessor :res
|
535
571
|
@@ignore = /google|_gat|tracker|adver/i
|
536
572
|
|
537
573
|
def initialize(obj='', loc=Hash.new(''), js=$JSRuntime||Johnson::Runtime.new)
|
538
574
|
loc = loc.parse:uri if !loc.is Hash
|
539
575
|
@js = js
|
540
576
|
if obj.is Curl::Easy or obj.kinda Scout
|
541
|
-
c = obj.kinda(Scout) ? obj.http :
|
577
|
+
c = obj.kinda(Scout) ? obj.http : obj
|
542
578
|
@html = ''
|
543
579
|
# just (c, loc) would pass to #process opts variable that returns '' on any key
|
544
|
-
process(c, loc.b || {})
|
580
|
+
process(c, loc.b || {})
|
545
581
|
else
|
546
582
|
@html = obj
|
547
583
|
@loc = loc
|
548
584
|
end
|
549
585
|
end
|
586
|
+
|
587
|
+
def empty?
|
588
|
+
!(@hash.nil? ? @html : @hash).b
|
589
|
+
end
|
550
590
|
|
551
591
|
def inspect
|
552
592
|
if !@hash.nil?
|
553
593
|
"<#FramePage (#{@hash ? @hash.inspect.size.bytes : 'failed to parse'}) #{@json ? 'json' : 'params hash'}>"
|
554
594
|
else
|
555
|
-
"<#FramePage #{@html.b ? "
|
595
|
+
"<#FramePage #{@html.b ? "#{@failed ? @curl_res.header : '«'+title(false)+'»'} (#{@html.size.bytes}" : '(empty'})#{' js enabled' if @js and @doc and @hash.nil?}>"
|
556
596
|
end
|
557
597
|
end
|
558
598
|
|
599
|
+
def html!(encoding='UTF-8')
|
600
|
+
@html.force_encoding(encoding)
|
601
|
+
end
|
602
|
+
|
559
603
|
# We can then alternate #process in Page subclasses
|
560
604
|
# Frame doesn't mind about value returned by #process
|
561
605
|
def process(c, opts={})
|
562
606
|
@loc = c.last_effective_url.parse:uri
|
563
|
-
|
564
|
-
|
565
|
-
|
607
|
+
@curl_res = c.res
|
608
|
+
L.debug "#{@loc.fullpath} -> #{@curl_res}"
|
609
|
+
if @curl_res.code == 200
|
610
|
+
body = @curl_res.body
|
566
611
|
if opts[:json]
|
567
612
|
@json = true
|
568
613
|
@hash = begin; body.from_json
|
@@ -577,7 +622,7 @@ module HTTPAccessKit
|
|
577
622
|
|
578
623
|
elsif opts[:hash]
|
579
624
|
if body.inline
|
580
|
-
@hash = body.
|
625
|
+
@hash = body.to_params
|
581
626
|
else
|
582
627
|
@hash = false
|
583
628
|
L.debug "failed to get params hash from #{c.last_effective_url}, take a look at my @doc for info; my object_id is #{object_id}"
|
@@ -585,12 +630,16 @@ module HTTPAccessKit
|
|
585
630
|
end
|
586
631
|
|
587
632
|
else
|
588
|
-
@html = body
|
633
|
+
@html = body.xml_to_utf
|
634
|
+
to_doc
|
589
635
|
if opts[:eval]
|
590
636
|
load_scripts opts[:load_scripts]
|
591
637
|
eval_js
|
592
638
|
end
|
593
639
|
end
|
640
|
+
elsif !(opts[:json] or opts[:hash])
|
641
|
+
@html = @curl_res.body
|
642
|
+
@failed = @curl_res.code
|
594
643
|
end
|
595
644
|
self
|
596
645
|
end
|
@@ -630,17 +679,32 @@ module HTTPAccessKit
|
|
630
679
|
|
631
680
|
def to_doc
|
632
681
|
@doc = @html.to_doc :forceutf
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
if
|
638
|
-
|
639
|
-
|
640
|
-
|
682
|
+
end
|
683
|
+
|
684
|
+
def title(full=true)
|
685
|
+
if @hash.nil? and !@failed and @html.b
|
686
|
+
if full
|
687
|
+
to_doc unless defined? @doc
|
688
|
+
if @doc.title.b
|
689
|
+
@title = @doc.title
|
690
|
+
else
|
691
|
+
@title = @loc.href
|
692
|
+
@doc.at('head').prepend XML::Node('title', @title) if @doc.at('head')
|
693
|
+
@title
|
694
|
+
end
|
695
|
+
else
|
696
|
+
title true unless defined? @title
|
697
|
+
if RUBY_VERSION < '1.9' and @title.cyr? and UTF2ANSI[@title].size > 40
|
698
|
+
@short_title = ANSI2UTF[UTF2ANSI[@title][/.{1,30}\S*/][0..38]]+'…'
|
699
|
+
elsif @title.size > 40
|
700
|
+
@short_title = @title[/.{1,30}\S*/][0..38]+'…'
|
701
|
+
else
|
702
|
+
@short_title = @title
|
703
|
+
end
|
641
704
|
end
|
705
|
+
else
|
706
|
+
@loc.href
|
642
707
|
end
|
643
|
-
@doc
|
644
708
|
end
|
645
709
|
|
646
710
|
def find(xp) (@doc || to_doc).find xp end
|
@@ -717,7 +781,7 @@ module HTTPAccessKit
|
|
717
781
|
end
|
718
782
|
|
719
783
|
def submit(form, frame, hash={}, opts={}, &callback)
|
720
|
-
(opts[:
|
784
|
+
(opts[:headers] ||= {}).Referer ||= @loc.href if @loc
|
721
785
|
query = form(form, hash, opts)
|
722
786
|
|
723
787
|
curr_target, new_target = frame.loc.href, (query[2] || query[0])
|
data/lib/rhack.yml.template
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
ua file: /
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
1
|
+
#ua file: db/useragents.txt
|
2
|
+
#logger:
|
3
|
+
# :out: log/rhack.log
|
4
|
+
#scout retry: {host => [Curl::Error subclass, ], }
|
5
|
+
# example.com:
|
6
|
+
# - TimeoutError
|
7
|
+
#db: # defaults file @ to RAILS_PATH/config/RAILS_ENV.yml
|
8
|
+
# reconnect: true
|
9
|
+
# encoding: utf8
|
10
|
+
# username: root
|
11
|
+
# adapter: mysql
|
12
|
+
# database: dbname
|
13
|
+
# pool: 5
|
14
|
+
# password:
|
15
|
+
# socket: /var/run/mysqld/mysqld.sock
|
16
|
+
#cache: # deprecated
|
17
|
+
# dir: /path/to/cache/dir
|
18
|
+
# table: hack_cache
|
19
|
+
# clean: 30.days
|
data/lib/rhack/services.rb
CHANGED
@@ -13,6 +13,17 @@ module HTTPAccessKit
|
|
13
13
|
# first argument should be a string so that frame won't be static
|
14
14
|
@f = frame || Frame(self.class::URI[service] || self.class::URI[:login], *args)
|
15
15
|
end
|
16
|
+
|
17
|
+
# Usable only for sync requests
|
18
|
+
def login(*)
|
19
|
+
Curl.run
|
20
|
+
@f[0].cookies.clear
|
21
|
+
json, wait, @f.opts[:json], @f.opts[:wait] = @f.opts[:json], @f.opts[:wait], false, true
|
22
|
+
yield @f.get(self.class::URI[:login])
|
23
|
+
@f.get(self.class::URI[:home]) if self.class::URI[:home]
|
24
|
+
@f.opts[:json], @f.opts[:wait] = json, wait
|
25
|
+
@f.copy_cookies!
|
26
|
+
end
|
16
27
|
|
17
28
|
def go(*args, &block)
|
18
29
|
__send__(@service, *args, &block)
|
@@ -307,13 +318,9 @@ module HTTPAccessKit
|
|
307
318
|
end
|
308
319
|
|
309
320
|
def login params={'email'=>'fshm@bk.ru', 'pass'=>'Riddick2', 'expire'=>nil}
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
login_page.submit('form', @f, params, :json=>nil) {|redirection|
|
314
|
-
redirection.submit('form', @f, {}, :json=>nil) {|logged|
|
315
|
-
@f.each {|s| s.cookies.replace @f[0].cookies}
|
316
|
-
}}}
|
321
|
+
super {|login_page|
|
322
|
+
login_page.submit('form', @f, params).submit('form', @f, {})
|
323
|
+
}
|
317
324
|
end
|
318
325
|
|
319
326
|
def get_links h, pagenum, &block
|
data/lib/scout.rb
CHANGED
@@ -114,7 +114,7 @@ module HTTPAccessKit
|
|
114
114
|
}
|
115
115
|
@name, @value = ck[0].split('=', 2)
|
116
116
|
#@value.gsub!(/^['"]|['"]$/, '')
|
117
|
-
L.debug args if !@domain
|
117
|
+
#L.debug args if !@domain
|
118
118
|
(scout.cookies[scout.uri.host] ||= {})[@name] = self
|
119
119
|
else
|
120
120
|
@name, cookie = args[0]
|
@@ -337,7 +337,7 @@ module HTTPAccessKit
|
|
337
337
|
# exc = ['0chan.ru', '2-ch.ru', 'www.nomer.org', 'nomer.org'].select_in('http://www.nomer.org') = ['www.nomer.org', 'nomer.org']
|
338
338
|
exc = (@@retry.keys + @retry.keys).select_in @root
|
339
339
|
return false if !exc.b
|
340
|
-
# ['www.nomer.org', 'nomer.org'].every |www| 'TimeoutError'.in({'nomer.org' => 'TimeoutError'}[www])} ?
|
340
|
+
# ['www.nomer.org', 'nomer.org'].every {|www| 'TimeoutError'.in({'nomer.org' => 'TimeoutError'}[www])} ?
|
341
341
|
exc.no? {|e| err[0].self_name.in((@@retry[e] || []) + @retry[e])}
|
342
342
|
end
|
343
343
|
|
@@ -346,7 +346,6 @@ module HTTPAccessKit
|
|
346
346
|
end
|
347
347
|
|
348
348
|
def load!
|
349
|
-
$log <= [$Carier, @http]
|
350
349
|
unless $Carier.add @http
|
351
350
|
$Carier.remove @http
|
352
351
|
$Carier.add @http
|
@@ -427,9 +426,7 @@ module HTTPAccessKit
|
|
427
426
|
end
|
428
427
|
emu = lambda {
|
429
428
|
@headers = ''
|
430
|
-
$log << @headers
|
431
429
|
@http.on_header {|h|
|
432
|
-
$log << @headers
|
433
430
|
@headers << h
|
434
431
|
h == "\r\n" ? 0 : h.size
|
435
432
|
}
|
@@ -439,7 +436,6 @@ module HTTPAccessKit
|
|
439
436
|
if emulate != :always
|
440
437
|
load(uri, headers) {|c|
|
441
438
|
if !@error and c.res.code != 200 and emulate == :if_retry
|
442
|
-
$log << @headers
|
443
439
|
emu.call
|
444
440
|
else
|
445
441
|
callback[c]
|
@@ -499,7 +495,8 @@ module HTTPAccessKit
|
|
499
495
|
if scout = to_a.rand {|_|!_.loaded?}; scout
|
500
496
|
else # Curl should run here, otherwise `next'/`rand'-recursion will cause stack overflow
|
501
497
|
raise "Curl must run in order to use ScoutSquad#rand" if !Curl.status
|
502
|
-
Curl.wait
|
498
|
+
#Curl.wait
|
499
|
+
loop {sleep 1; break if $Carier.reqs.size < size}
|
503
500
|
self.rand
|
504
501
|
end
|
505
502
|
end
|
@@ -509,7 +506,8 @@ module HTTPAccessKit
|
|
509
506
|
if scout = find {|_|!_.loaded?}; scout
|
510
507
|
else # Curl should run here, otherwise `next'/`rand'-recursion will cause stack overflow
|
511
508
|
raise "Curl must run in order to use ScoutSquad#next" if !Curl.status
|
512
|
-
Curl.wait
|
509
|
+
#Curl.wait
|
510
|
+
loop {sleep 1; break if $Carier.reqs.size < size}
|
513
511
|
self.next
|
514
512
|
end
|
515
513
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rhack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rmtools
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.
|
21
|
+
version: 1.2.12
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.
|
29
|
+
version: 1.2.12
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rake
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -105,20 +105,28 @@ extra_rdoc_files:
|
|
105
105
|
files:
|
106
106
|
- ext/curb/curb_errors.c
|
107
107
|
- ext/curb/curb_errors.h
|
108
|
+
- ext/curb/curb_errors.o
|
108
109
|
- ext/curb/Makefile
|
109
110
|
- ext/curb/curb_macros.h
|
110
111
|
- ext/curb/curb_multi.c
|
111
112
|
- ext/curb/curb_multi.h
|
113
|
+
- ext/curb/curb_multi.o
|
112
114
|
- ext/curb/curb_upload.c
|
113
115
|
- ext/curb/curb_upload.h
|
116
|
+
- ext/curb/curb_upload.o
|
114
117
|
- ext/curb/curb_config.h
|
115
118
|
- ext/curb/extconf.rb
|
116
119
|
- ext/curb/curb.c
|
117
120
|
- ext/curb/curb.h
|
121
|
+
- ext/curb/curb.o
|
122
|
+
- ext/curb/curb_core.so
|
118
123
|
- ext/curb/curb_easy.c
|
119
124
|
- ext/curb/curb_easy.h
|
125
|
+
- ext/curb/curb_easy.o
|
126
|
+
- ext/curb/mkmf.log
|
120
127
|
- ext/curb/curb_postfield.c
|
121
128
|
- ext/curb/curb_postfield.h
|
129
|
+
- ext/curb/curb_postfield.o
|
122
130
|
- ext/curb-original/curb_errors.c
|
123
131
|
- ext/curb-original/curb_errors.h
|
124
132
|
- ext/curb-original/curb_macros.h
|
@@ -165,7 +173,7 @@ files:
|
|
165
173
|
- ./Gemfile
|
166
174
|
- ./History.txt
|
167
175
|
- .gemtest
|
168
|
-
homepage:
|
176
|
+
homepage: https://github.com/tinbka/rhack
|
169
177
|
licenses: []
|
170
178
|
post_install_message:
|
171
179
|
rdoc_options:
|
@@ -181,7 +189,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
189
|
version: '0'
|
182
190
|
segments:
|
183
191
|
- 0
|
184
|
-
hash: -
|
192
|
+
hash: -84270947
|
185
193
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
194
|
none: false
|
187
195
|
requirements:
|