ht2p 0.0.6 → 0.0.7

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 CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Jun Kikuchi
1
+ Copyright (c) 2009, 2010 Jun Kikuchi
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.rdoc CHANGED
@@ -40,4 +40,4 @@ HT2P is a Ruby library for HTTP and HTTPS.
40
40
 
41
41
  == Copyright
42
42
 
43
- Copyright (c) 2009 Jun Kikuchi. See LICENSE for details.
43
+ Copyright (c) 2009, 2010 Jun Kikuchi. See LICENSE for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.6
1
+ 0.0.7
data/ht2p.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ht2p}
8
- s.version = "0.0.6"
8
+ s.version = "0.0.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jun Kikuchi"]
12
- s.date = %q{2009-11-21}
12
+ s.date = %q{2010-01-16}
13
13
  s.description = %q{ht2p}
14
14
  s.email = %q{kikuchi@bonnou.com}
15
15
  s.extra_rdoc_files = [
data/lib/ht2p/client.rb CHANGED
@@ -1,8 +1,12 @@
1
1
  require 'uri'
2
2
  require 'socket'
3
3
  require 'openssl'
4
+ require 'forwardable'
4
5
 
5
6
  class HT2P::Client
7
+ extend Forwardable
8
+ def_delegators :@socket, :write, :read, :gets, :flush
9
+
6
10
  attr_reader :uri, :request
7
11
 
8
12
  def initialize(uri, params={}, &block)
@@ -13,8 +17,16 @@ class HT2P::Client
13
17
 
14
18
  TCPSocket.open(ip, @uri.port) do |socket|
15
19
  if @uri.scheme == 'https'
20
+ context = OpenSSL::SSL::SSLContext.new
21
+ context.ca_file = params[:ca_file]
22
+ context.ca_path = params[:ca_path] || OpenSSL::X509::DEFAULT_CERT_DIR
23
+ context.timeout = params[:timeout]
24
+ context.verify_depth = params[:verify_depth]
25
+ context.verify_mode = OpenSSL::SSL.const_get\
26
+ "VERIFY_#{(params[:verify_mode] || 'PEER').to_s.upcase}"
27
+
16
28
  begin
17
- @socket = OpenSSL::SSL::SSLSocket.new(socket)
29
+ @socket = OpenSSL::SSL::SSLSocket.new(socket, context)
18
30
  @socket.connect
19
31
  @request = HT2P::Client::Request.new(self, params)
20
32
  block.call @request
@@ -29,30 +41,6 @@ class HT2P::Client
29
41
  end
30
42
  end
31
43
 
32
- def request_header(method, header)
33
- @socket.write header.format(method, @uri)
34
- end
35
-
36
- def response_header
37
- HT2P::Header.load @socket
38
- end
39
-
40
- def write(val)
41
- @socket.write val.to_s
42
- end
43
-
44
- def read(length=nil)
45
- @socket.read length
46
- end
47
-
48
- def gets
49
- @socket.gets
50
- end
51
-
52
- def flush
53
- @socket.flush
54
- end
55
-
56
44
  autoload :Request, 'ht2p/client/request'
57
45
  autoload :Response, 'ht2p/client/response'
58
46
  end
@@ -1,7 +1,11 @@
1
1
  class HT2P::Client::Request
2
- METHODS = %w'get head post put delete options trace connect'
2
+ extend Forwardable
3
+ def_delegators :@client, :uri, :write
4
+ def_delegators :@header, :[], :[]=
5
+
6
+ attr_accessor :method, :header
3
7
 
4
- attr_accessor :uri, :method, :header
8
+ alias :headers :header
5
9
 
6
10
  def initialize(client, params)
7
11
  @client = client
@@ -11,18 +15,15 @@ class HT2P::Client::Request
11
15
 
12
16
  def send(body=nil, &block)
13
17
  @header['content-length'] = body.to_s.size if body
14
- @client.request_header(@method, @header)
15
- @client.write(body) if body
16
- block.call(self) if block_given?
18
+ @client.write @header.format(@method, @client.uri)
19
+ @client.write body if body
20
+ block.call self if block_given?
17
21
  @client.flush
18
- HT2P::Client::Response.new(@client)
22
+ HT2P::Client::Response.new @client
19
23
  end
20
24
 
25
+ METHODS = %w'get head post put delete options trace connect'
21
26
  METHODS.each do |val|
22
- define_method(val, instance_method(:send))
23
- end
24
-
25
- def write(val)
26
- @client.write(val)
27
+ define_method val, instance_method(:send)
27
28
  end
28
29
  end
@@ -1,16 +1,21 @@
1
1
  class HT2P::Client::Response
2
+ extend Forwardable
3
+ def_delegators :@header, :[], :[]=
4
+
2
5
  attr_reader :code, :header
3
6
 
7
+ alias :headers :header
8
+
4
9
  HAS_BODY = [:get, :post, :put, :delete, :trace]
5
10
 
6
11
  def initialize(client)
7
- @client, @code, @header = client, *client.response_header
12
+ @client, @code, @header = client, *HT2P::Header.load(client)
8
13
 
9
14
  @body = if HAS_BODY.include? @client.request.method.to_s.downcase.to_sym
10
15
  if @header['transfer-encoding'].to_s.downcase == 'chunked'
11
- Chunked.new(@client)
16
+ Chunked.new @client
12
17
  else
13
- Transfer.new(@client, @header['content-length'].to_i)
18
+ Transfer.new @client, @header['content-length'].to_i
14
19
  end
15
20
  else
16
21
  Empty.new
@@ -19,14 +24,14 @@ class HT2P::Client::Response
19
24
 
20
25
  def receive(&block)
21
26
  if block_given?
22
- block.call(self)
27
+ block.call self
23
28
  else
24
29
  read
25
30
  end
26
31
  end
27
32
 
28
33
  def read(length=nil)
29
- @body.read(length)
34
+ @body.read length
30
35
  end
31
36
 
32
37
  class Transfer
@@ -36,13 +41,13 @@ class HT2P::Client::Response
36
41
 
37
42
  def read(length=nil)
38
43
  if @size.nil?
39
- @client.read(length)
44
+ @client.read length
40
45
  elsif @size > 0
41
46
  length ||= @size
42
47
  length = @size if @size < length
43
48
  @size -= length
44
49
 
45
- @client.read(length)
50
+ @client.read length
46
51
  else
47
52
  nil
48
53
  end
@@ -51,18 +56,19 @@ class HT2P::Client::Response
51
56
 
52
57
  class Chunked < Transfer
53
58
  def initialize(client)
54
- super(client, nil)
59
+ super client, nil
55
60
  parse_size
56
61
  end
57
62
 
58
63
  def read(length=nil)
59
- parse_size unless @size > 0
60
- super(length)
64
+ parse_size if @size <= 0
65
+ super length
61
66
  end
62
67
 
63
68
  def parse_size
64
69
  @size = @client.gets.chop!.hex
65
70
  end
71
+ private :parse_size
66
72
  end
67
73
 
68
74
  class Empty
data/lib/ht2p/header.rb CHANGED
@@ -12,24 +12,28 @@ class HT2P::Header < Hash
12
12
  code = md[1].to_i
13
13
  elsif md = /(.+?):\s*(.*)/.match(line)
14
14
  key, val = md[1].downcase, md[2]
15
- header[key] = val
15
+ if header.key? key
16
+ header.add key, val
17
+ else
18
+ header[key] = val
19
+ end
16
20
  elsif md = /\s+(.*)/.match(line)
17
- header.append(key, md[1])
21
+ header.append key, md[1]
18
22
  end
19
23
  end
20
24
 
21
25
  [code, header]
22
26
  end
23
27
 
24
- def []=(key, val)
25
- if self.key? key
28
+ def add(key, val)
29
+ if key? key
26
30
  if self[key].is_a? Array
27
31
  self[key] << val
28
32
  else
29
- super(key, [self[key], val])
33
+ self[key] = [self[key], val]
30
34
  end
31
35
  else
32
- super(key, val)
36
+ self[key] = [val]
33
37
  end
34
38
  end
35
39
 
data/spec/ht2p_spec.rb CHANGED
@@ -42,29 +42,16 @@ describe HT2P::Header do
42
42
  @header = HT2P::Header.new
43
43
  end
44
44
 
45
- it 'should store some keys and values like a Hash' do
45
+ it '見た目は Hash として動作' do
46
46
  @header['a'] = 'A'
47
47
  @header['a'].should == 'A'
48
- end
49
48
 
50
- it 'should change the value to an Array if the key has been stored' do
51
- @header['a'] = 'A'
49
+ @header['a'] = 'a'
52
50
  @header['a'] = 'A'
53
- @header['a'].should == ['A', 'A']
54
- end
55
-
56
- it 'should perform `append` to append the value' do
57
- @header['a'] = 'A'
58
- @header.append('a', 'A')
59
- @header['a'].should == 'AA'
60
-
61
- @header['b'] = 'B'
62
- @header['b'] = 'B'
63
- @header.append('b', 'B')
64
- @header['b'].should == ['B', 'BB']
51
+ @header['a'].should == 'A'
65
52
  end
66
53
 
67
- it 'should perform `load` to load HTTP header' do
54
+ it 'class メソッドの load HTTP ヘッダーを読み込む' do
68
55
  s =<<END
69
56
  HTTP/1.1 100 continue
70
57
  HTTP/1.1 200 ok
@@ -85,7 +72,7 @@ END
85
72
  header['d'].should == ['D', 'DD']
86
73
  end
87
74
 
88
- it 'should perform `format` to return header string' do
75
+ it 'format メソッドは HTTP ヘッダー文字列を返す' do
89
76
  uri = URI.parse('http://example.com/')
90
77
  s =<<END
91
78
  GET / HTTP/1.1
@@ -101,6 +88,17 @@ GET / HTTP/1.1
101
88
  Host: example.com
102
89
  a: A
103
90
 
91
+ END
92
+ @header.format(:get, uri).should == s.gsub("\n", "\r\n")
93
+
94
+ @header['b'] = 'b'
95
+ uri = URI.parse('http://example.com/')
96
+ s =<<END
97
+ GET / HTTP/1.1
98
+ Host: example.com
99
+ a: A
100
+ b: b
101
+
104
102
  END
105
103
  @header.format(:get, uri).should == s.gsub("\n", "\r\n")
106
104
 
@@ -115,14 +113,25 @@ b: B
115
113
  END
116
114
  @header.format(:get, uri).should == s.gsub("\n", "\r\n")
117
115
 
118
- @header['b'] = 'BB'
116
+ @header.add('b', 'B')
119
117
  uri = URI.parse('http://example.com/')
120
118
  s =<<END
121
119
  GET / HTTP/1.1
122
120
  Host: example.com
123
121
  a: A
124
122
  b: B
125
- b: BB
123
+ b: B
124
+
125
+ END
126
+ @header.format(:get, uri).should == s.gsub("\n", "\r\n")
127
+
128
+ @header['b'] = 'b'
129
+ uri = URI.parse('http://example.com/')
130
+ s =<<END
131
+ GET / HTTP/1.1
132
+ Host: example.com
133
+ a: A
134
+ b: b
126
135
 
127
136
  END
128
137
  @header.format(:get, uri).should == s.gsub("\n", "\r\n")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ht2p
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jun Kikuchi
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-21 00:00:00 +09:00
12
+ date: 2010-01-16 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency