rhack 0.4.0 → 0.4.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/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
|