iudex-http-test 1.1.0-java
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/.gemtest +0 -0
- data/History.rdoc +2 -0
- data/Manifest.txt +16 -0
- data/README.rdoc +25 -0
- data/Rakefile +36 -0
- data/bin/iudex-http-test-fg +50 -0
- data/lib/iudex-http-test.rb +19 -0
- data/lib/iudex-http-test/base.rb +23 -0
- data/lib/iudex-http-test/broken_server.rb +50 -0
- data/lib/iudex-http-test/helper.rb +78 -0
- data/lib/iudex-http-test/server.rb +40 -0
- data/lib/iudex-http-test/test_app.rb +194 -0
- data/public/atom.xml +1230 -0
- data/test/setup.rb +28 -0
- data/test/test_broken_server.rb +62 -0
- data/test/test_server.rb +53 -0
- data/test/test_test_app.rb +104 -0
- metadata +144 -0
data/.gemtest
ADDED
File without changes
|
data/History.rdoc
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
History.rdoc
|
2
|
+
Manifest.txt
|
3
|
+
README.rdoc
|
4
|
+
Rakefile
|
5
|
+
bin/iudex-http-test-fg
|
6
|
+
lib/iudex-http-test/base.rb
|
7
|
+
lib/iudex-http-test.rb
|
8
|
+
lib/iudex-http-test/broken_server.rb
|
9
|
+
lib/iudex-http-test/helper.rb
|
10
|
+
lib/iudex-http-test/server.rb
|
11
|
+
lib/iudex-http-test/test_app.rb
|
12
|
+
public/atom.xml
|
13
|
+
test/setup.rb
|
14
|
+
test/test_broken_server.rb
|
15
|
+
test/test_server.rb
|
16
|
+
test/test_test_app.rb
|
data/README.rdoc
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
= iudex-http-test
|
2
|
+
|
3
|
+
* http://github.com/dekellum/iudex
|
4
|
+
|
5
|
+
== Description
|
6
|
+
|
7
|
+
Iudex is a general purpose web crawler and feed processor in
|
8
|
+
ruby/java. The iudex-http-test gem contains a HTTP test server for
|
9
|
+
testing HTTP client implementations.
|
10
|
+
|
11
|
+
== License
|
12
|
+
|
13
|
+
Copyright (c) 2011 David Kellum
|
14
|
+
|
15
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you
|
16
|
+
may not use this file except in compliance with the License. You
|
17
|
+
may obtain a copy of the License at:
|
18
|
+
|
19
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
20
|
+
|
21
|
+
Unless required by applicable law or agreed to in writing, software
|
22
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
23
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
24
|
+
implied. See the License for the specific language governing
|
25
|
+
permissions and limitations under the License.
|
data/Rakefile
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
$LOAD_PATH << './lib'
|
4
|
+
require 'iudex-http-test/base'
|
5
|
+
|
6
|
+
require 'rubygems'
|
7
|
+
gem 'rjack-tarpit', '~> 1.4'
|
8
|
+
require 'rjack-tarpit'
|
9
|
+
|
10
|
+
t = RJack::TarPit.new( 'iudex-http-test',
|
11
|
+
Iudex::HTTP::Test::VERSION,
|
12
|
+
:java_platform )
|
13
|
+
|
14
|
+
t.specify do |h|
|
15
|
+
h.developer( "David Kellum", "dek-oss@gravitext.com" )
|
16
|
+
h.extra_deps += [ [ 'fishwife', '~> 1.1.0' ],
|
17
|
+
[ 'sinatra', '~> 1.3.1' ],
|
18
|
+
[ 'markaby', '~> 0.7.1' ],
|
19
|
+
[ 'minitest', '~> 2.3' ] ]
|
20
|
+
|
21
|
+
h.testlib = :minitest
|
22
|
+
h.extra_dev_deps += [ [ 'rack-test', '~> 0.6.0' ] ]
|
23
|
+
end
|
24
|
+
|
25
|
+
task :check_history_version do
|
26
|
+
t.test_line_match( 'History.rdoc', /^==/, / #{t.version} / )
|
27
|
+
end
|
28
|
+
task :check_history_date do
|
29
|
+
t.test_line_match( 'History.rdoc', /^==/, /\([0-9\-]+\)$/ )
|
30
|
+
end
|
31
|
+
|
32
|
+
task :gem => [ :check_history_version ]
|
33
|
+
task :tag => [ :check_history_version, :check_history_date ]
|
34
|
+
task :push => [ :check_history_date ]
|
35
|
+
|
36
|
+
t.define_tasks
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/env jruby
|
2
|
+
#.hashdot.vm.options += -Xmx256m
|
3
|
+
# -*- ruby -*-
|
4
|
+
|
5
|
+
#--
|
6
|
+
# Copyright (c) 2011 David Kellum
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
9
|
+
# may not use this file except in compliance with the License. You
|
10
|
+
# may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
17
|
+
# implied. See the License for the specific language governing
|
18
|
+
# permissions and limitations under the License.
|
19
|
+
#++
|
20
|
+
|
21
|
+
$LOAD_PATH.unshift File.join( File.dirname(__FILE__), "..", "lib" )
|
22
|
+
|
23
|
+
module IudexBinScript
|
24
|
+
|
25
|
+
require 'rubygems'
|
26
|
+
require 'rjack-logback'
|
27
|
+
require 'optparse'
|
28
|
+
|
29
|
+
include RJack
|
30
|
+
Logback.config_console( :thread => true )
|
31
|
+
|
32
|
+
require 'iudex-http-test/server'
|
33
|
+
|
34
|
+
include Iudex
|
35
|
+
|
36
|
+
OptionParser.new do |opts|
|
37
|
+
opts.on( "-v", "--version", "Display version" ) do
|
38
|
+
puts "iudex-http-test-fg: #{ Iudex::HTTP::Test::VERSION }"
|
39
|
+
exit 1
|
40
|
+
end
|
41
|
+
opts.on( "-d", "--debug", "Enable verbose DEBUG logging" ) do
|
42
|
+
Logback.root.level = Logback::DEBUG
|
43
|
+
end
|
44
|
+
end.parse!
|
45
|
+
|
46
|
+
server = HTTP::Test::Server.new
|
47
|
+
server.start
|
48
|
+
server.join
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2011 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
require 'iudex-http-test/base'
|
18
|
+
require 'iudex-http-test/test_app'
|
19
|
+
require 'iudex-http-test/server'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2011 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
module Iudex
|
18
|
+
module HTTP
|
19
|
+
module Test
|
20
|
+
VERSION = '1.1.0'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2011 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
require 'iudex-http-test/base'
|
18
|
+
|
19
|
+
require 'socket'
|
20
|
+
|
21
|
+
module Iudex::HTTP::Test
|
22
|
+
|
23
|
+
class BrokenServer
|
24
|
+
attr_accessor :port
|
25
|
+
|
26
|
+
def initialize
|
27
|
+
@port = 19293
|
28
|
+
@server = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def start
|
32
|
+
@server = TCPServer.new( @port )
|
33
|
+
end
|
34
|
+
|
35
|
+
def accept
|
36
|
+
sock = @server.accept
|
37
|
+
yield sock if block_given?
|
38
|
+
end
|
39
|
+
|
40
|
+
def stop
|
41
|
+
if @server
|
42
|
+
@server.close
|
43
|
+
@server = nil
|
44
|
+
true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2011 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
require 'iudex-http-test/server'
|
18
|
+
|
19
|
+
require 'minitest/unit'
|
20
|
+
require 'net/http'
|
21
|
+
require 'ostruct'
|
22
|
+
|
23
|
+
module Iudex::HTTP::Test
|
24
|
+
|
25
|
+
class CustomUnit < MiniTest::Unit
|
26
|
+
|
27
|
+
def _run_suites(suites, type)
|
28
|
+
super(suites, type)
|
29
|
+
ensure
|
30
|
+
Helper.stop
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.register
|
34
|
+
MiniTest::Unit.runner = CustomUnit.new
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module Helper
|
39
|
+
|
40
|
+
def server
|
41
|
+
Helper.server
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.server
|
45
|
+
@server ||=
|
46
|
+
begin
|
47
|
+
if running_standalone?
|
48
|
+
OpenStruct.new( :port => Server::DEFAULT_PORT )
|
49
|
+
else
|
50
|
+
server = Server.new
|
51
|
+
server.start
|
52
|
+
server
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.running_standalone?
|
58
|
+
res = Net::HTTP.start( 'localhost', Server::DEFAULT_PORT ) do |http|
|
59
|
+
http.open_timeout = 0.5
|
60
|
+
http.read_timeout = 1.0
|
61
|
+
http.get( '/index' )
|
62
|
+
end
|
63
|
+
( res.code.to_i == 200 )
|
64
|
+
rescue Timeout::Error, Errno::ECONNREFUSED
|
65
|
+
false
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.stop
|
69
|
+
if @server
|
70
|
+
$stderr.puts
|
71
|
+
@server.stop
|
72
|
+
@server.join
|
73
|
+
@server = nil
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2011 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
require 'iudex-http-test/base'
|
18
|
+
require 'iudex-http-test/test_app'
|
19
|
+
|
20
|
+
require 'fishwife'
|
21
|
+
|
22
|
+
module Iudex::HTTP::Test
|
23
|
+
|
24
|
+
class Server < Fishwife::HttpServer
|
25
|
+
|
26
|
+
DEFAULT_PORT = 19292
|
27
|
+
|
28
|
+
def initialize( opts = {} )
|
29
|
+
opts = { :port => DEFAULT_PORT,
|
30
|
+
:max_threads => 20 }.merge( opts )
|
31
|
+
super( opts )
|
32
|
+
end
|
33
|
+
|
34
|
+
def start( app = TestApp )
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,194 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2011 David Kellum
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
5
|
+
# may not use this file except in compliance with the License. You
|
6
|
+
# may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
13
|
+
# implied. See the License for the specific language governing
|
14
|
+
# permissions and limitations under the License.
|
15
|
+
#++
|
16
|
+
|
17
|
+
require 'rack'
|
18
|
+
|
19
|
+
#FIXME: Otherwise rack can fail on threaded autoload (to be fixed in jruby)
|
20
|
+
require 'rack/mime'
|
21
|
+
require 'rack/head'
|
22
|
+
require 'rack/protection/frame_options'
|
23
|
+
|
24
|
+
require 'sinatra/base'
|
25
|
+
require 'markaby'
|
26
|
+
require 'cgi'
|
27
|
+
require 'thread'
|
28
|
+
require 'rjack-slf4j'
|
29
|
+
|
30
|
+
require 'iudex-http-test/base'
|
31
|
+
|
32
|
+
module Iudex::HTTP::Test
|
33
|
+
|
34
|
+
# Sets up rack.logger to write to rack.errors stream
|
35
|
+
class SLogger
|
36
|
+
include RJack
|
37
|
+
def initialize( app, level = :info )
|
38
|
+
@app = app
|
39
|
+
@logger = SLF4J[ self.class ]
|
40
|
+
@level = level
|
41
|
+
|
42
|
+
def @logger.<<( msg )
|
43
|
+
send( @level, msg )
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def call(env)
|
48
|
+
env['rack.logger'] = @logger
|
49
|
+
@app.call(env)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class ConcurrentCounter
|
54
|
+
def initialize
|
55
|
+
@lock = Mutex.new
|
56
|
+
@count = 0
|
57
|
+
end
|
58
|
+
|
59
|
+
def sync( &block )
|
60
|
+
@lock.synchronize( &block )
|
61
|
+
end
|
62
|
+
|
63
|
+
def enter
|
64
|
+
sync { @count += 1 }
|
65
|
+
end
|
66
|
+
|
67
|
+
def exit
|
68
|
+
sync { @count -= 1 }
|
69
|
+
end
|
70
|
+
|
71
|
+
def count
|
72
|
+
sync { @count }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class TestApp < Sinatra::Base
|
77
|
+
|
78
|
+
PUBLIC = File.expand_path( File.join( File.dirname( __FILE__ ),
|
79
|
+
'..', '..', 'public' ) )
|
80
|
+
|
81
|
+
set :environment, :production
|
82
|
+
set :show_exceptions, false
|
83
|
+
set :raise_errors, true
|
84
|
+
set :dump_errors, false
|
85
|
+
use SLogger
|
86
|
+
|
87
|
+
@@counter = ConcurrentCounter.new
|
88
|
+
|
89
|
+
before do
|
90
|
+
# Handle (con)currency param, halting if exceeded
|
91
|
+
@con = params[:con].to_i # 0 if nil
|
92
|
+
if @con > 0 && @@counter.enter > @con
|
93
|
+
halt( 418, "Concurrency #{@con} exceeded" )
|
94
|
+
end
|
95
|
+
|
96
|
+
# Sleep now if requested
|
97
|
+
s = params[:sleep].to_f # 0.0 if nil
|
98
|
+
sleep s if s > 0.0
|
99
|
+
end
|
100
|
+
|
101
|
+
after do
|
102
|
+
@@counter.exit if @con > 0
|
103
|
+
end
|
104
|
+
|
105
|
+
get '/' do
|
106
|
+
redirect to( '/index' )
|
107
|
+
end
|
108
|
+
|
109
|
+
get '/301' do
|
110
|
+
redirect( to( '/index' ), 301 ) #"redirect body"
|
111
|
+
end
|
112
|
+
|
113
|
+
get '/redirect' do
|
114
|
+
loc = params[ :loc ]
|
115
|
+
redirect loc if loc
|
116
|
+
halt 400, "loc query parameter required"
|
117
|
+
end
|
118
|
+
|
119
|
+
get '/redirects/multi/:depth' do
|
120
|
+
depth = params[:depth].to_i
|
121
|
+
status = ( params[:code] || 302 ).to_i
|
122
|
+
if depth > 1
|
123
|
+
redirect( to( "/redirects/multi/#{depth - 1}#{common params}" ),
|
124
|
+
status )
|
125
|
+
else
|
126
|
+
"You finally made it"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
get '/index' do
|
131
|
+
markaby do
|
132
|
+
html do
|
133
|
+
head { title "Test Index Page" }
|
134
|
+
body do
|
135
|
+
h1 "Iudex HTTP Test Service"
|
136
|
+
a( :href => url( '/foobar' ) ) { "foobar" }
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
get '/atom.xml' do
|
143
|
+
send_file( "#{PUBLIC}/atom.xml",
|
144
|
+
:type => 'application/atom+xml' )
|
145
|
+
end
|
146
|
+
|
147
|
+
get '/env' do
|
148
|
+
request.inspect
|
149
|
+
end
|
150
|
+
|
151
|
+
get '/error' do
|
152
|
+
raise "Raising this ERROR for you"
|
153
|
+
end
|
154
|
+
|
155
|
+
get '/304' do
|
156
|
+
halt 304
|
157
|
+
end
|
158
|
+
|
159
|
+
get '/concount' do
|
160
|
+
content_type 'text/plain'
|
161
|
+
@@counter.count.to_s
|
162
|
+
end
|
163
|
+
|
164
|
+
get '/echo/header/:name' do
|
165
|
+
content_type 'text/plain'
|
166
|
+
env[ 'HTTP_' + params[ :name ].gsub( /-/, '_' ).upcase ].to_s
|
167
|
+
end
|
168
|
+
|
169
|
+
class GiantGenerator
|
170
|
+
FILLER = <<-END
|
171
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
|
172
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
173
|
+
END
|
174
|
+
|
175
|
+
def each
|
176
|
+
loop { yield FILLER }
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
get '/giant' do
|
181
|
+
[ 200, { 'Content-Type' => 'text/plain' }, GiantGenerator.new ]
|
182
|
+
end
|
183
|
+
|
184
|
+
def common( params )
|
185
|
+
ps = [ :sleep, :con ].
|
186
|
+
map { |k| ( v = params[k] ) && [ k, v ] }.
|
187
|
+
compact.
|
188
|
+
map { |k,v| [ k, CGI.escape( v.to_s ) ].join( '=' ) }
|
189
|
+
'?' + ps.join( '&' ) unless ps.empty?
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|