fastdfs-client 1.0.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cc4dd420f881d1186e7f715d17e9046a6664175b
4
- data.tar.gz: 88c89c5e2965f5d734557f09965da923ae71def2
3
+ metadata.gz: 564b4fc72139a1d9bc1faeba24ecf21394bf9e4b
4
+ data.tar.gz: ef2717e16860af59cfaeccc0b99d1ad0284d1972
5
5
  SHA512:
6
- metadata.gz: 957b8d370b27114586c4e1c1caf67c3736c987a5dd86f460fcc61d5a7b8431c56c844285f3cd88865318e9df5e05f0eaa55bfca9bd3d79c7c242d8e7e7afb9c8
7
- data.tar.gz: e7ef416611d1967bf72db8d292d29574ee6b60e4347968426a85380a3ccf28c509cb9794643acf7f6f01b8b31d2cb8923eff8f8d30d9732a00939eda671a1fcd
6
+ metadata.gz: afec497233fb8ecc7736dff565ea90db045376381d012cbede8f7f47e69f156410ab0fb87e017085066f03e55be2b049b41304fb105e6efd48dfc78745157a15
7
+ data.tar.gz: fc7979eb1bf964b0bc5ee5942535f264d4518453191ab76d9eecb73e7b56cafcbb508e464be17ad55337cb1cd5bd7391c3ac8ace7120d998c3ca08d23bf827a0
Binary file
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1.3"
23
- spec.add_development_dependency "rspec", "~> 3.4.0"
24
- spec.add_development_dependency "debugger", "~> 1.6.8"
22
+ spec.add_development_dependency "bundler", "~> 1.6"
23
+ spec.add_development_dependency "rspec", "~> 3.4"
24
+ spec.add_development_dependency "debugger", "~> 1.6"
25
25
 
26
26
  end
@@ -1,28 +1,33 @@
1
+ require 'monitor'
2
+
1
3
  module Fastdfs
2
4
  module Client
3
5
 
4
6
  class ClientProxy
5
- attr_accessor :data, :header, :content, :socket
7
+ include MonitorMixin
6
8
 
7
- def initialize(cmd, socket, content_len, header = [])
8
- @cmd = cmd
9
- socket.connection
10
- @socket = socket
11
- @header = ProtoCommon.header_bytes(cmd, content_len) + header
12
- @content = []
13
- end
9
+ attr_accessor :host, :port, :socket
14
10
 
15
- def push_content
16
- raise "argument not block!" unless block_given?
17
- @content << yield
11
+ def initialize(host, port, options = {})
12
+ super()
13
+ options ||= {}
14
+ @host = host
15
+ @port = port
16
+
17
+ @socket = Socket.new(host, port, options[:socket])
18
18
  end
19
19
 
20
- def dispose(&block)
21
- @socket.write(@cmd, @header)
22
- @content.each do |c|
23
- @socket.write(@cmd, c)
20
+ def dispose(cmd, content_len, header = [], content = [], &block)
21
+ synchronize do
22
+ @socket.connection do
23
+ full_header = ProtoCommon.header_bytes(cmd, content_len) + header
24
+ @socket.write(cmd, full_header)
25
+ Array(@content).each do |c|
26
+ @socket.write(cmd, c)
27
+ end
28
+ @socket.receive &block
29
+ end
24
30
  end
25
- @socket.receive &block
26
31
  ensure
27
32
  @socket.close
28
33
  end
@@ -29,12 +29,13 @@ module Fastdfs
29
29
  @socket.close if connected
30
30
  end
31
31
 
32
- def connection
32
+ def connection(&block)
33
33
  if @socket.nil? || !connected
34
34
  @socket = Timeout.timeout(@connection_timeout) do
35
35
  TCPSocket.new(@host, @port)
36
36
  end
37
37
  end
38
+ yield if block_given?
38
39
  end
39
40
 
40
41
  def connected
@@ -58,7 +59,7 @@ module Fastdfs
58
59
  def parseHeader
59
60
  err_msg = nil
60
61
  err_msg = "recv package size #{@header} is not equal #{@header_len}, cmd: #{@cmd}" unless @header.length == @header_len || err_msg
61
- err_msg = "recv cmd: #{@header[8]} is not correct, expect cmd: #{CMD::RESP_CODE}, cmd: #{@cmd}" unless @header[8] == CMD::RESP_CODE || err_msg
62
+ err_msg = "recv cmd: #{@header[8]} is not correct, expect recv code: #{CMD::RESP_CODE}, cmd: #{@cmd}" unless @header[8] == CMD::RESP_CODE || err_msg
62
63
  err_msg = "recv erron #{@header[9]}, 0 is correct cmd: #{@cmd}" unless @header[9] == 0 || err_msg
63
64
  {status: err_msg.nil?, err_msg: err_msg}
64
65
  end
@@ -4,14 +4,14 @@ module Fastdfs
4
4
  module Client
5
5
 
6
6
  class Storage
7
- attr_accessor :host, :port, :group_name, :store_path, :socket, :options
7
+ attr_accessor :group_name, :store_path, :proxy, :options, :socket
8
8
 
9
9
  def initialize(host, port, store_path = nil, options = {})
10
- @host = host
11
- @port = port
12
10
  @options = options || {}
13
11
  @options = store_path if store_path.is_a?(Hash)
14
- @socket = Socket.new(host, port, @options[:socket])
12
+
13
+ @proxy = ClientProxy.new(host, port, @options[:socket])
14
+ @socket = @proxy.socket
15
15
  @extname_len = ProtoCommon::EXTNAME_LEN
16
16
  @size_len = ProtoCommon::SIZE_LEN
17
17
  @store_path = store_path || 0
@@ -22,9 +22,7 @@ module Fastdfs
22
22
  size_byte = ([@store_path] + Utils.number_to_buffer(file.size)).full_fill(0, @size_len)
23
23
  content_len = (@size_len + @extname_len + file.size)
24
24
 
25
- client = ClientProxy.new(CMD::UPLOAD_FILE, @socket, content_len, size_byte + ext_name_bs)
26
- client.push_content{ IO.read(file) }
27
- client.dispose do |body|
25
+ @proxy.dispose(CMD::UPLOAD_FILE, content_len, size_byte + ext_name_bs, IO.read(file)) do |body|
28
26
  group_name_max_len = ProtoCommon::GROUP_NAME_MAX_LEN
29
27
 
30
28
  res = {group_name: body[0...group_name_max_len].strip, path: body[group_name_max_len..-1]}
@@ -35,14 +33,12 @@ module Fastdfs
35
33
 
36
34
  def delete(path, group_name = nil)
37
35
  path_bytes = group_path_bytes(path, group_name).flatten
38
- client = ClientProxy.new(CMD::DELETE_FILE, @socket, path_bytes.length, path_bytes)
39
- client.dispose
36
+ @proxy.dispose(CMD::DELETE_FILE, path_bytes.length, path_bytes)
40
37
  end
41
38
 
42
39
  def get_metadata(path, group_name = nil)
43
40
  path_bytes = group_path_bytes(path, group_name).flatten
44
- client = ClientProxy.new(CMD::GET_METADATA, @socket, path_bytes.length, path_bytes)
45
- client.dispose do |body|
41
+ @proxy.dispose(CMD::GET_METADATA, path_bytes.length, path_bytes) do |body|
46
42
  res = body.split(ProtoCommon::RECORD_SEPERATOR).map do |c|
47
43
  c.split(ProtoCommon::FILE_SEPERATOR)
48
44
  end.flatten
@@ -51,15 +47,8 @@ module Fastdfs
51
47
  end
52
48
 
53
49
  def set_metadata(path, group_name = nil, options = {}, flag = :cover)
54
- unless options.is_a?(Hash)
55
- flag = options
56
- options = {}
57
- end
58
-
59
- if group_name.is_a?(Hash)
60
- options = group_name
61
- group_name = nil
62
- end
50
+ flag, options = options, {} unless options.is_a?(Hash)
51
+ options, group_name = group_name, nil if group_name.is_a?(Hash)
63
52
  _set_metadata(path, group_name, options, flag)
64
53
  end
65
54
 
@@ -67,8 +56,7 @@ module Fastdfs
67
56
  path_bytes = group_path_bytes(path, group_name).flatten
68
57
  download_bytes = Utils.number_to_buffer(0) + Utils.number_to_buffer(0)
69
58
  data = download_bytes + path_bytes
70
- client = ClientProxy.new(CMD::DOWNLOAD_FILE, @socket, data.length, data)
71
- client.dispose do |body|
59
+ @proxy.dispose(CMD::DOWNLOAD_FILE, data.length, data) do |body|
72
60
  create_tempfile(path, body) if body
73
61
  end
74
62
  end
@@ -103,9 +91,7 @@ module Fastdfs
103
91
  size_bytes = (size_bytes).full_fill(0, 16)
104
92
  total = size_bytes.length + flag.length + group_bytes.length + path_bytes.length + meta_bytes.length
105
93
 
106
- client = ClientProxy.new(CMD::SET_METADATA, @socket, total, (size_bytes + flag.bytes + group_bytes + path_bytes))
107
- client.push_content{ meta_bytes }
108
- client.dispose
94
+ @proxy.dispose(CMD::SET_METADATA, total, (size_bytes + flag.bytes + group_bytes + path_bytes), meta_bytes)
109
95
  end
110
96
 
111
97
  def convert_meta_flag(flag)
@@ -5,17 +5,17 @@ module Fastdfs
5
5
 
6
6
  class Tracker
7
7
 
8
- attr_accessor :socket, :cmd, :options
8
+ attr_accessor :socket, :cmd, :options, :socket
9
9
 
10
10
  def initialize(host, port, options = {})
11
11
  @options = options
12
- @socket = Socket.new(host, port, @options[:socket])
12
+ @proxy = ClientProxy.new(host, port, @options[:socket])
13
+ @socket = @proxy.socket
13
14
  @cmd = CMD::STORE_WITHOUT_GROUP_ONE
14
15
  end
15
16
 
16
17
  def get_storage
17
- client = ClientProxy.new(@cmd, @socket, 0)
18
- res = client.dispose do |body|
18
+ res = @proxy.dispose(@cmd, 0) do |body|
19
19
  storage_ip = body[ProtoCommon::IPADDR].strip
20
20
  storage_port = body[ProtoCommon::PORT].unpack("C*").to_pack_long
21
21
  store_path = body[ProtoCommon::TRACKER_BODY_LEN-1].unpack("C*")[0]
@@ -1,5 +1,5 @@
1
1
  module Fastdfs
2
2
  module Client
3
- VERSION = '1.0.2'
3
+ VERSION = '1.2.0'
4
4
  end
5
5
  end
Binary file
@@ -13,9 +13,9 @@ class MockTCPSocket
13
13
  end
14
14
 
15
15
  def write(*args)
16
+ sleep(0..7)
16
17
  pkg = args[0].unpack("C*")
17
- @cmd ||= pkg[8]
18
- sleep(2)
18
+ @cmd ||= pkg[8]
19
19
  end
20
20
 
21
21
  def recv(len)
Binary file
@@ -13,7 +13,7 @@ describe Fastdfs::Client::Tracker do
13
13
  end
14
14
 
15
15
  it "should have access to the storage connection" do
16
- expect(tracker.socket).to receive(:connection)
16
+ expect(tracker.socket).to receive(:connection).and_return({})
17
17
  expect(tracker.socket).to receive(:close)
18
18
  tracker.get_storage
19
19
  end
@@ -23,9 +23,9 @@ describe Fastdfs::Client::Tracker do
23
23
  end
24
24
 
25
25
  it "verify the server address and port" do
26
- expect(tracker.get_storage.host).to eq(TestConfig::STORAGE_IP)
26
+ expect(tracker.get_storage.socket.host).to eq(TestConfig::STORAGE_IP)
27
27
  #[0, 0, 0, 0, 0, 89, 216, 0]
28
- expect(tracker.get_storage.port.to_s).to eq(TestConfig::STORAGE_PORT)
28
+ expect(tracker.get_storage.socket.port.to_s).to eq(TestConfig::STORAGE_PORT)
29
29
  expect(tracker.get_storage.store_path).to eq(TestConfig::STORE_PATH)
30
30
  end
31
31
 
@@ -37,13 +37,20 @@ describe Fastdfs::Client::Tracker do
37
37
  end
38
38
 
39
39
  it "run server flow" do
40
- 1.times.map do
41
- tracker.get_storage
40
+ items = 5.times.map do
41
+ Thread.new do
42
+ storage = tracker.get_storage
43
+ results = storage.upload(File.open(File.expand_path("../page.png", __FILE__)))[:result]
44
+ puts results
45
+ puts storage.delete(results[:path], results[:group_name])
46
+ end
42
47
  end
43
48
 
49
+ items.each{|item| item.join }
50
+
44
51
  # storage = tracker.get_storage
45
52
  # puts "#{storage.host}, #{storage.port}"
46
- # results = storage.upload(File.open("/Users/huxinghai/Documents/shark/app/assets/images/page.png"))
53
+ # results = storage.upload(File.open("page.png"))
47
54
  # puts results
48
55
  # puts storage.delete(results[:path], results[:group_name])
49
56
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastdfs-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ka Ka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-10 00:00:00.000000000 Z
11
+ date: 2016-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: '1.6'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.3'
26
+ version: '1.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 3.4.0
33
+ version: '3.4'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 3.4.0
40
+ version: '3.4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: debugger
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.6.8
47
+ version: '1.6'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.6.8
54
+ version: '1.6'
55
55
  description: fastdfs upload file client for ruby
56
56
  email:
57
57
  - huxinghai1988@gmail.com
@@ -59,6 +59,7 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".DS_Store"
62
63
  - ".gitignore"
63
64
  - Gemfile
64
65
  - README.md
@@ -73,7 +74,9 @@ files:
73
74
  - lib/fastdfs-client/tracker.rb
74
75
  - lib/fastdfs-client/utils.rb
75
76
  - lib/fastdfs-client/version.rb
77
+ - spec/.DS_Store
76
78
  - spec/mock_tcp_socket.rb
79
+ - spec/page.png
77
80
  - spec/spec_helper.rb
78
81
  - spec/storage_spec.rb
79
82
  - spec/test_config.rb
@@ -103,7 +106,9 @@ signing_key:
103
106
  specification_version: 4
104
107
  summary: fastdfs upload file client for ruby
105
108
  test_files:
109
+ - spec/.DS_Store
106
110
  - spec/mock_tcp_socket.rb
111
+ - spec/page.png
107
112
  - spec/spec_helper.rb
108
113
  - spec/storage_spec.rb
109
114
  - spec/test_config.rb