rhack 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +14 -46
- data/Manifest.txt +2 -11
- data/README.md +76 -0
- data/Rakefile +3 -3
- data/ext/curb/Makefile +25 -21
- data/lib/curl-global.rb +21 -16
- data/lib/frame.rb +17 -4
- metadata +6 -18
- data/History.txt +0 -38
- data/README.txt +0 -12
- data/ext/curb/curb.o +0 -0
- 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 +0 -4770
data/LICENSE
CHANGED
@@ -1,52 +1,20 @@
|
|
1
1
|
Copyright (c) 2010-2013
|
2
2
|
Sergey Baev <tinbka@gmail.com>
|
3
|
-
Curb is free software licensed under the following terms:
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
This work is licensed under the same license as Ruby language.
|
5
|
+
|
6
|
+
This licence also implies a compliance with details of CURB-LICENSE.
|
8
7
|
|
9
|
-
|
10
|
-
|
8
|
+
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
9
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
10
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
11
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
12
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
13
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
14
|
+
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
15
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
16
|
+
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
17
|
+
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
18
|
+
SUCH DAMAGE.
|
11
19
|
|
12
|
-
a) place your modifications in the Public Domain or otherwise
|
13
|
-
make them Freely Available, such as by posting said
|
14
|
-
modifications to Usenet or an equivalent medium, or by allowing
|
15
|
-
the author to include your modifications in the software.
|
16
20
|
|
17
|
-
b) use the modified software only within your corporation or
|
18
|
-
organization.
|
19
|
-
|
20
|
-
c) give non-standard binaries non-standard names, with
|
21
|
-
instructions on where to get the original software distribution.
|
22
|
-
|
23
|
-
d) make other distribution arrangements with the author.
|
24
|
-
|
25
|
-
3. You may distribute the software in object code or binary form,
|
26
|
-
provided that you do at least ONE of the following:
|
27
|
-
|
28
|
-
a) distribute the binaries and library files of the software,
|
29
|
-
together with instructions (in the manual page or equivalent)
|
30
|
-
on where to get the original distribution.
|
31
|
-
|
32
|
-
b) accompany the distribution with the machine-readable source of
|
33
|
-
the software.
|
34
|
-
|
35
|
-
c) give non-standard binaries non-standard names, with
|
36
|
-
instructions on where to get the original software distribution.
|
37
|
-
|
38
|
-
d) make other distribution arrangements with the author.
|
39
|
-
|
40
|
-
4. You may modify and include the part of the software into any other
|
41
|
-
software (possibly commercial).
|
42
|
-
|
43
|
-
5. The scripts and library files supplied as input to or produced as
|
44
|
-
output from the software do not automatically fall under the
|
45
|
-
copyright of the software, but belong to whomever generated them,
|
46
|
-
and may be sold commercially, and may be aggregated with this
|
47
|
-
software.
|
48
|
-
|
49
|
-
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
50
|
-
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
51
|
-
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
52
|
-
PURPOSE.
|
data/Manifest.txt
CHANGED
@@ -1,27 +1,19 @@
|
|
1
1
|
ext/curb/curb_errors.c
|
2
2
|
ext/curb/curb_errors.h
|
3
|
-
ext/curb/curb_errors.o
|
4
3
|
ext/curb/Makefile
|
5
4
|
ext/curb/curb_macros.h
|
6
5
|
ext/curb/curb_multi.c
|
7
6
|
ext/curb/curb_multi.h
|
8
|
-
ext/curb/curb_multi.o
|
9
7
|
ext/curb/curb_upload.c
|
10
8
|
ext/curb/curb_upload.h
|
11
|
-
ext/curb/curb_upload.o
|
12
9
|
ext/curb/curb_config.h
|
13
10
|
ext/curb/extconf.rb
|
14
11
|
ext/curb/curb.c
|
15
12
|
ext/curb/curb.h
|
16
|
-
ext/curb/curb.o
|
17
|
-
ext/curb/curb_core.so
|
18
13
|
ext/curb/curb_easy.c
|
19
14
|
ext/curb/curb_easy.h
|
20
|
-
ext/curb/curb_easy.o
|
21
|
-
ext/curb/mkmf.log
|
22
15
|
ext/curb/curb_postfield.c
|
23
16
|
ext/curb/curb_postfield.h
|
24
|
-
ext/curb/curb_postfield.o
|
25
17
|
ext/curb-original/curb_errors.c
|
26
18
|
ext/curb-original/curb_errors.h
|
27
19
|
ext/curb-original/curb_macros.h
|
@@ -61,9 +53,8 @@ test/test_scout.rb
|
|
61
53
|
test/test_frame.rb
|
62
54
|
./Gemfile.lock
|
63
55
|
./LICENSE
|
56
|
+
./README.md
|
64
57
|
./Rakefile
|
65
58
|
./Manifest.txt
|
66
59
|
./CURB-LICENSE
|
67
|
-
./
|
68
|
-
./Gemfile
|
69
|
-
./History.txt
|
60
|
+
./Gemfile
|
data/README.md
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
### RHACK
|
2
|
+
[github](https://github.com/tinbka/rhack)
|
3
|
+
|
4
|
+
RHACK is Ruby Http ACcess Kit -- curl-based web-client for developing web-scrapers/bots.
|
5
|
+
|
6
|
+
##### Features
|
7
|
+
* Asynchronous, still EventMachine independent. Synchronization can be turned on with 1sec per waiting penalty
|
8
|
+
* Fast as on simple queries as on high load. Can process up to thousands (limited by a net interface, of course) different parallel requests of any HTTP method with no penalty
|
9
|
+
* Flexibly configurable on 3 levels:
|
10
|
+
* * Curl::Easy (simplest request configuration, inherited from [curb gem](http://github.com/taf2/curb))
|
11
|
+
* * ::Scout (Curl::Easy wrapper with transparent cookies and extendable anonimization processing, detailed request/response info, callbacks and retry configuration)
|
12
|
+
* * ::Frame (Scout array wrapper with smart request interpretor, load balancing and extendable response processor)
|
13
|
+
* Included support of javascript processing on loaded pages (johnson gem)
|
14
|
+
* Web-service abstraction for creating scrapers, that implement some examples of how to use this library
|
15
|
+
|
16
|
+
---
|
17
|
+
|
18
|
+
It's still randomly documented since it's just my working tool.
|
19
|
+
|
20
|
+
#### Expected to complete:
|
21
|
+
|
22
|
+
* Redis-based configurable cache for ::Service and for downloads
|
23
|
+
* Full javascript processing, including linked scripts; maybe support of other javascript engines gems
|
24
|
+
|
25
|
+
### CHANGES
|
26
|
+
|
27
|
+
##### Version 0.4.1
|
28
|
+
|
29
|
+
* Сhanged ::Frame @static behaviour, :static option now accept hash with :procotol key (::Frame#validate comment)
|
30
|
+
* Changed log level in curl-global.rb
|
31
|
+
* Described the library and *marked down* this readme
|
32
|
+
|
33
|
+
##### Version 0.4
|
34
|
+
|
35
|
+
* Fixed bugs
|
36
|
+
* * idle execution in Rails application thread
|
37
|
+
* * Curl::Easy default callback
|
38
|
+
* * some misspelling-bugs
|
39
|
+
* Minified ::ScoutSquad#next waiting time
|
40
|
+
* ::Service
|
41
|
+
* * added meta-methods #login (sync only) and #scrape!(<::Page>)
|
42
|
+
* ::Frame
|
43
|
+
* * made new cache prototype. Call #use_cache!(false?) for (in)activate and #drop_cache! for clearance
|
44
|
+
* * added :xhr exec option
|
45
|
+
* ::Page
|
46
|
+
* * #title returns full title by default
|
47
|
+
* * #html is auto-encoded to UTF-8 during #process
|
48
|
+
|
49
|
+
##### Version 0.3
|
50
|
+
|
51
|
+
* Adjusted cookie processor in accordance with web-servers and entrust redirection process to ::Scout
|
52
|
+
* Added some shortcuts to ::Frame and Curl modules
|
53
|
+
* Сonfig defaults are now taken from rails
|
54
|
+
* Removed crappy database usage from lib/words.rb
|
55
|
+
* curb_multi.c: Moved callbacks out of rb_rescue so that I could know wtf was happen there
|
56
|
+
|
57
|
+
##### Version 0.2
|
58
|
+
|
59
|
+
* Nastily pulled down curb-0.8.1 extension sources and harshly patched by changes made long before, so that the core will be as modern as possible and with necessary features
|
60
|
+
* Fixed syntax for Ruby 1.9
|
61
|
+
|
62
|
+
##### Version 0.1
|
63
|
+
|
64
|
+
* A long time ago in a galaxy far, far away...
|
65
|
+
* A library had been created based on Net::HTTP
|
66
|
+
* In a few months its base had been changed by curb-0.4.4 because of poorness and incovinience of Net::HTTP
|
67
|
+
* Had been made background-mode for Curl::Multi and multipart body setting for Curl::Easy so that Curl could be both sync and async
|
68
|
+
* Had been added a couple of wrappers for Curl::Easy and its results, proxy lists processor, scrapers for a few web-services, and plugin for libxml-ruby that lives at rmtools gem now
|
69
|
+
|
70
|
+
### License
|
71
|
+
|
72
|
+
RHACK is copyright (c) 2010-2013 Sergey Baev <tinbka@gmail.com>, and released under the terms of the Ruby license.
|
73
|
+
See the LICENSE file for the details.
|
74
|
+
Rhack is also include slightly modified Curb gem extension source code. For original
|
75
|
+
Curb gem code you may want to check ext/curb-original or visit <http://github.com/taf2/curb/tree/master>.
|
76
|
+
See the CURB-LICENSE file for the details.
|
data/Rakefile
CHANGED
@@ -8,14 +8,14 @@ rescue LoadError
|
|
8
8
|
end
|
9
9
|
|
10
10
|
compile_manifest
|
11
|
-
RHACK_VERSION = '0.4.
|
11
|
+
RHACK_VERSION = '0.4.1'
|
12
12
|
begin
|
13
13
|
require 'hoe'
|
14
14
|
config = Hoe.spec "rhack" do |h|
|
15
15
|
h.developer("Sergey Baev", "tinbka@gmail.com")
|
16
16
|
|
17
|
-
h.description = '
|
18
|
-
|
17
|
+
h.description = 'Ruby Http ACcess Kit -- curl-based web-client for developing web-scrapers/bots'
|
18
|
+
h.summary = h.description
|
19
19
|
h.urls = ['https://github.com/tinbka/rhack']
|
20
20
|
|
21
21
|
h.extra_deps << ['rmtools','>= 1.2.12']
|
data/ext/curb/Makefile
CHANGED
@@ -12,11 +12,11 @@ ECHO = $(ECHO1:0=@echo)
|
|
12
12
|
#### Start of system configuration section. ####
|
13
13
|
|
14
14
|
srcdir = .
|
15
|
-
topdir = /home/shinku/.rvm/rubies/ruby-1.9.3-
|
16
|
-
hdrdir = /home/shinku/.rvm/rubies/ruby-1.9.3-
|
17
|
-
arch_hdrdir = /home/shinku/.rvm/rubies/ruby-1.9.3-
|
15
|
+
topdir = /home/shinku/.rvm/rubies/ruby-1.9.3-p327/include/ruby-1.9.1
|
16
|
+
hdrdir = /home/shinku/.rvm/rubies/ruby-1.9.3-p327/include/ruby-1.9.1
|
17
|
+
arch_hdrdir = /home/shinku/.rvm/rubies/ruby-1.9.3-p327/include/ruby-1.9.1/$(arch)
|
18
18
|
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
|
19
|
-
prefix = $(DESTDIR)/home/shinku/.rvm/rubies/ruby-1.9.3-
|
19
|
+
prefix = $(DESTDIR)/home/shinku/.rvm/rubies/ruby-1.9.3-p327
|
20
20
|
rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
|
21
21
|
exec_prefix = $(prefix)
|
22
22
|
vendorhdrdir = $(rubyhdrdir)/vendor_ruby
|
@@ -59,21 +59,22 @@ LIBRUBY = $(LIBRUBY_SO)
|
|
59
59
|
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
|
60
60
|
LIBRUBYARG_SHARED = -Wl,-R -Wl,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)
|
61
61
|
LIBRUBYARG_STATIC = -Wl,-R -Wl,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static
|
62
|
-
|
63
|
-
|
62
|
+
empty =
|
63
|
+
OUTFLAG = -o $(empty)
|
64
|
+
COUTFLAG = -o $(empty)
|
64
65
|
|
65
66
|
RUBY_EXTCONF_H = curb_config.h
|
66
67
|
cflags = $(optflags) $(debugflags) $(warnflags)
|
67
68
|
optflags = -O3
|
68
69
|
debugflags = -ggdb
|
69
|
-
warnflags = -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration
|
70
|
-
CFLAGS = -fPIC
|
70
|
+
warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration
|
71
|
+
CFLAGS = -fPIC -I/home/shinku/.rvm/usr/include -fPIC -g -Wall $(ARCH_FLAG)
|
71
72
|
INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
|
72
73
|
DEFS = -D_FILE_OFFSET_BITS=64
|
73
|
-
CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\" -I/home/shinku/.rvm/usr/include
|
74
|
+
CPPFLAGS = -DRUBY_EXTCONF_H=\"$(RUBY_EXTCONF_H)\" $(DEFS) $(cppflags) -I/home/shinku/.rvm/usr/include
|
74
75
|
CXXFLAGS = $(CFLAGS) $(cxxflags)
|
75
|
-
ldflags = -L.
|
76
|
-
dldflags =
|
76
|
+
ldflags = -L. -L/home/shinku/.rvm/usr/lib -rdynamic -Wl,-export-dynamic -L/home/shinku/.rvm/usr/lib -Wl,-R/home/shinku/.rvm/usr/lib
|
77
|
+
dldflags = -L/home/shinku/.rvm/usr/lib -Wl,-R/home/shinku/.rvm/usr/lib
|
77
78
|
ARCH_FLAG =
|
78
79
|
DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
|
79
80
|
LDSHARED = $(CC) -shared
|
@@ -87,7 +88,7 @@ RUBY_SO_NAME = ruby
|
|
87
88
|
arch = i686-linux
|
88
89
|
sitearch = $(arch)
|
89
90
|
ruby_version = 1.9.1
|
90
|
-
ruby = /home/shinku/.rvm/rubies/ruby-1.9.3-
|
91
|
+
ruby = /home/shinku/.rvm/rubies/ruby-1.9.3-p327/bin/ruby
|
91
92
|
RUBY = $(ruby)
|
92
93
|
RM = rm -f
|
93
94
|
RM_RF = $(RUBY) -run -e rm -- -rf
|
@@ -97,6 +98,7 @@ INSTALL = /usr/bin/install -c
|
|
97
98
|
INSTALL_PROG = $(INSTALL) -m 0755
|
98
99
|
INSTALL_DATA = $(INSTALL) -m 644
|
99
100
|
COPY = cp
|
101
|
+
TOUCH = exit >
|
100
102
|
|
101
103
|
#### End of system configuration section. ####
|
102
104
|
|
@@ -115,8 +117,8 @@ extout_prefix =
|
|
115
117
|
target_prefix =
|
116
118
|
LOCAL_LIBS =
|
117
119
|
LIBS = $(LIBRUBYARG_SHARED) -lpthread -lrt -ldl -lcrypt -lm -lc -lcurl
|
118
|
-
SRCS =
|
119
|
-
OBJS =
|
120
|
+
SRCS = curb.c curb_errors.c curb_multi.c curb_upload.c curb_easy.c curb_postfield.c
|
121
|
+
OBJS = curb.o curb_errors.o curb_multi.o curb_upload.o curb_easy.o curb_postfield.o
|
120
122
|
TARGET = curb_core
|
121
123
|
DLLIB = $(TARGET).so
|
122
124
|
EXTSTATIC =
|
@@ -124,8 +126,8 @@ STATIC_LIB =
|
|
124
126
|
|
125
127
|
BINDIR = $(bindir)
|
126
128
|
RUBYCOMMONDIR = $(sitedir)$(target_prefix)
|
127
|
-
RUBYLIBDIR = /home/shinku/.rvm/gems/ruby-1.9.3-
|
128
|
-
RUBYARCHDIR = /home/shinku/.rvm/gems/ruby-1.9.3-
|
129
|
+
RUBYLIBDIR = /home/shinku/.rvm/gems/ruby-1.9.3-p327/gems/rhack-0.4.0/lib$(target_prefix)
|
130
|
+
RUBYARCHDIR = /home/shinku/.rvm/gems/ruby-1.9.3-p327/gems/rhack-0.4.0/lib$(target_prefix)
|
129
131
|
HDRDIR = $(rubyhdrdir)/ruby$(target_prefix)
|
130
132
|
ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix)
|
131
133
|
|
@@ -155,19 +157,21 @@ distclean: clean distclean-so distclean-rb-default distclean-rb
|
|
155
157
|
realclean: distclean
|
156
158
|
install: install-so install-rb
|
157
159
|
|
158
|
-
install-so: $(RUBYARCHDIR)
|
159
160
|
install-so: $(RUBYARCHDIR)/$(DLLIB)
|
160
161
|
$(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
|
161
|
-
|
162
|
+
-$(Q)$(MAKEDIRS) $(@D)
|
162
163
|
$(INSTALL_PROG) $(DLLIB) $(@D)
|
164
|
+
clean-static::
|
165
|
+
-$(Q)$(RM) $(STATIC_LIB)
|
163
166
|
install-rb: pre-install-rb install-rb-default
|
164
167
|
install-rb-default: pre-install-rb-default
|
165
168
|
pre-install-rb: Makefile
|
166
169
|
pre-install-rb-default: Makefile
|
167
170
|
pre-install-rb-default:
|
168
171
|
$(ECHO) installing default curb_core libraries
|
169
|
-
|
170
|
-
$(Q) $(MAKEDIRS)
|
172
|
+
./.RUBYARCHDIR.time:
|
173
|
+
$(Q) $(MAKEDIRS) $(RUBYARCHDIR)
|
174
|
+
$(Q) $(TOUCH) $@
|
171
175
|
|
172
176
|
site-install: site-install-so site-install-rb
|
173
177
|
site-install-so: install-so
|
@@ -205,7 +209,7 @@ site-install-rb: install-rb
|
|
205
209
|
|
206
210
|
$(DLLIB): $(OBJS) Makefile
|
207
211
|
$(ECHO) linking shared-object $(DLLIB)
|
208
|
-
|
212
|
+
-$(Q)$(RM) $(@)
|
209
213
|
$(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
|
210
214
|
|
211
215
|
|
data/lib/curl-global.rb
CHANGED
@@ -3,13 +3,13 @@ module Curl
|
|
3
3
|
|
4
4
|
def execute(unless_allready=false)
|
5
5
|
if unless_allready and Curl.status
|
6
|
-
return L.
|
6
|
+
return L.log "Non-nil status! Avoid executing"
|
7
7
|
end
|
8
8
|
if $CarierThread and s = $CarierThread.status
|
9
|
-
L.
|
9
|
+
L.log "Carier thread allready started and has status #{s}"
|
10
10
|
else
|
11
11
|
if s = Curl.status(false) then L.warn s end
|
12
|
-
L.
|
12
|
+
L.log($CarierThread ? "Resetting Carier thread" : "Setting Carier thread up")
|
13
13
|
$CarierThread = Thread.new {
|
14
14
|
error = nil
|
15
15
|
begin
|
@@ -22,7 +22,7 @@ module Curl
|
|
22
22
|
begin
|
23
23
|
# with true argument (idle) it would break only if no requests to perform
|
24
24
|
break unless $Carier.perform true
|
25
|
-
L.
|
25
|
+
L.log "Nothing to perform; idling..."
|
26
26
|
rescue => error
|
27
27
|
break
|
28
28
|
# but ruby mystically crashes if next sequence occur:
|
@@ -44,7 +44,7 @@ module Curl
|
|
44
44
|
|
45
45
|
def wait
|
46
46
|
if $CarierThread and $CarierThread.status
|
47
|
-
|
47
|
+
unless within = Thread.current == $CarierThread
|
48
48
|
# We can't set `perform' timeout lesser than 1 second in the curl binding
|
49
49
|
# because in that case thread status would always be "run"
|
50
50
|
# so here we wait for exactly 1 sec
|
@@ -52,13 +52,14 @@ module Curl
|
|
52
52
|
end
|
53
53
|
# Also, if thread do Kernel.sleep, it would skip Curl.wait here
|
54
54
|
if !$Carier.sheduled and ($CarierThread.status == 'sleep' or within && $Carier.reqs.empty?)
|
55
|
-
L.
|
55
|
+
L.log "No shedule to wait"
|
56
56
|
else
|
57
|
-
|
57
|
+
this_thread = within ? 'it\'s thread' : Thread.main == Thread.current ? 'main thread' : 'thread '+Thread.current.object_id
|
58
|
+
L.log "Waiting for Carier to complete in #{this_thread}"
|
58
59
|
begin
|
59
|
-
L.log { "Trying to change $CarierThreadIsJoined #{$CarierThreadIsJoined} -> true from #{
|
60
|
+
L.log { "Trying to change $CarierThreadIsJoined #{$CarierThreadIsJoined} -> true from #{this_thread}" }
|
60
61
|
if within
|
61
|
-
L.
|
62
|
+
L.log "calling this from one of callbacks to wait for the rest to complete"
|
62
63
|
begin
|
63
64
|
$Carier.perform
|
64
65
|
rescue RuntimeError => e
|
@@ -74,12 +75,16 @@ module Curl
|
|
74
75
|
recall!
|
75
76
|
L.info "Carier thread recalled by keyboard"
|
76
77
|
ensure
|
77
|
-
L.log "trying to change $CarierThreadIsJoined #{$CarierThreadIsJoined} -> false from #{
|
78
|
+
L.log "trying to change $CarierThreadIsJoined #{$CarierThreadIsJoined} -> false from #{this_thread}"
|
78
79
|
if !within
|
79
80
|
$CarierThreadIsJoined = false
|
81
|
+
# using Curl#execute from different threads may cause problems here when you don't control input,
|
82
|
+
# for example, in a daemonized ruby process
|
83
|
+
# just do not get $CarierThread joined from non-main thread
|
80
84
|
if $CarierThread and e = $CarierThread.value
|
81
85
|
# this will raise thread-safely in main thread
|
82
86
|
# in case of unrescued error in CarierThread
|
87
|
+
L.log(([e.message]+RMTools.format_trace(e.backtrace))*"\n")
|
83
88
|
recall!
|
84
89
|
raise e
|
85
90
|
end
|
@@ -98,23 +103,23 @@ module Curl
|
|
98
103
|
def recall
|
99
104
|
L.debug caller
|
100
105
|
if $CarierThread
|
101
|
-
L.
|
106
|
+
L.log "Recalling Carier thread"
|
102
107
|
$CarierThread.kill
|
103
108
|
sleep 1
|
104
109
|
else
|
105
|
-
L.
|
110
|
+
L.log "No thread to recall"
|
106
111
|
end
|
107
112
|
end
|
108
113
|
alias :stop :recall
|
109
114
|
|
110
115
|
def recall!
|
111
116
|
if $CarierThread
|
112
|
-
L.
|
117
|
+
L.warn "Recalling thread and resetting Carier!!!"
|
113
118
|
$CarierThread.kill
|
114
119
|
$CarierThread = nil
|
115
120
|
$Carier.reset
|
116
121
|
else
|
117
|
-
L.
|
122
|
+
L.log "No thread to recall!"
|
118
123
|
end
|
119
124
|
end
|
120
125
|
alias :stop! :recall!
|
@@ -147,10 +152,10 @@ module Curl
|
|
147
152
|
e
|
148
153
|
end
|
149
154
|
else
|
150
|
-
L.
|
155
|
+
L.log "Carier Thread is exited without error"
|
151
156
|
end
|
152
157
|
else
|
153
|
-
L.
|
158
|
+
L.log "There is no Carier Thread atm"
|
154
159
|
end
|
155
160
|
end
|
156
161
|
alias :st :status
|
data/lib/frame.rb
CHANGED
@@ -34,7 +34,7 @@ module HTTPAccessKit
|
|
34
34
|
'http://' >> uri if uri !~ /^\w+:\/\//
|
35
35
|
@loc = uri.parse:uri
|
36
36
|
# be careful, if you set :static => false, frame will be unable to use implicit url
|
37
|
-
@static = @opts.fetch(:static, true)
|
37
|
+
@static = @opts.fetch(:static, true)
|
38
38
|
else
|
39
39
|
@loc = {}
|
40
40
|
@static = false
|
@@ -76,7 +76,7 @@ module HTTPAccessKit
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def inspect
|
79
|
-
"<#Frame @ #{@ss.untargeted ? 'no target' : @loc.root}: #{'scout'.x @ss.size}#{', static' if @static}, cookies #{@ss[0].cookieProc ? 'on' : 'off'}>"
|
79
|
+
"<#Frame @ #{@ss.untargeted ? 'no target' : @loc.root}: #{'scout'.x @ss.size}#{', static'+(' => '+@static.protocol if @static.is(Hash)) if @static}, cookies #{@ss[0].cookieProc ? 'on' : 'off'}>"
|
80
80
|
end
|
81
81
|
|
82
82
|
# opts are :eval, :json, :hash, :wait, :proc_result, :save_result, :load_scripts,
|
@@ -426,15 +426,28 @@ module HTTPAccessKit
|
|
426
426
|
end
|
427
427
|
end
|
428
428
|
|
429
|
+
# :static option now can accept hash with :procotol key, in that case Frame can be relocated to the same domain on another protocol and default protocol would be the value of @static.protocol
|
429
430
|
def validate(uri)
|
430
431
|
if uri
|
431
432
|
loc = uri.parse:uri
|
432
433
|
if loc.root and loc.root != @loc.root
|
433
|
-
|
434
|
-
|
434
|
+
if @static
|
435
|
+
if @static.is Hash
|
436
|
+
if loc.host != @loc.host
|
437
|
+
raise TargetError, "unable to get #{uri} by static frame [#{@static.protocol}://]#{@loc.host}, you should first update it with new target"
|
438
|
+
end
|
439
|
+
else
|
440
|
+
raise TargetError, "unable to get #{uri} by static frame #{@loc.root}, you should first update it with new target"
|
441
|
+
end
|
442
|
+
end
|
443
|
+
@loc.root, @loc.host, @loc.protocol = loc.root, loc.host, loc.protocol
|
435
444
|
uri
|
436
445
|
elsif !loc.root
|
437
446
|
raise TargetError if !@static
|
447
|
+
if @static.is Hash
|
448
|
+
@loc.protocol = @static.protocol
|
449
|
+
@loc.root = @loc.protocol+'://'+@loc.host
|
450
|
+
end
|
438
451
|
File.join @loc.root, uri
|
439
452
|
else uri
|
440
453
|
end
|