fastdfs-client 1.0.2 → 1.2.0

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.
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