rpc4json 0.0.1.alpha → 0.0.2.alpha
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/README.md +2 -0
- data/lib/jsonrpc/abstract_request.rb +57 -0
- data/lib/jsonrpc/client/proxy.rb +23 -0
- data/lib/jsonrpc/client.rb +143 -0
- data/lib/jsonrpc/content_type_parser.rb +10 -0
- data/lib/jsonrpc/notification.rb +14 -0
- data/lib/jsonrpc/request.rb +7 -0
- data/lib/jsonrpc/response.rb +37 -0
- data/lib/jsonrpc/version.rb +1 -1
- data/lib/jsonrpc.rb +3 -0
- data/rpc4json.gemspec +1 -4
- metadata +10 -36
- data/certs/jsonrpc.pem +0 -22
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -3
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# JSONRPC
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/rpc4json) [](https://gemnasium.com/GRoguelon/JSONRPC)
|
4
|
+
|
3
5
|
An Ruby implementation of the JSON-RPC 2.0 specification.
|
4
6
|
|
5
7
|
## Installation
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'securerandom'
|
5
|
+
|
6
|
+
module JSONRPC
|
7
|
+
class AbstractRequest
|
8
|
+
attr_reader :id, :jsonrpc, :method, :params
|
9
|
+
|
10
|
+
JSONRPC_VERSION = '2.0'
|
11
|
+
|
12
|
+
class << self
|
13
|
+
private :new
|
14
|
+
|
15
|
+
def inherited(subclass)
|
16
|
+
subclass.public_class_method(:new)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(method, params = nil)
|
21
|
+
assert_valid_arguements(method, params)
|
22
|
+
|
23
|
+
@id = unique_request_id
|
24
|
+
@jsonrpc = JSONRPC_VERSION
|
25
|
+
@method = method
|
26
|
+
@params = params if params
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_hash
|
30
|
+
@request ||= {
|
31
|
+
:jsonrpc => jsonrpc,
|
32
|
+
:method => method,
|
33
|
+
:params => params,
|
34
|
+
:id => id
|
35
|
+
}.delete_if { |_, value| value.nil? }
|
36
|
+
end
|
37
|
+
alias :to_h :to_hash
|
38
|
+
|
39
|
+
def to_json
|
40
|
+
JSON.dump(to_hash)
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
|
45
|
+
def assert_valid_arguements(method, params)
|
46
|
+
if method.start_with?('rpc.')
|
47
|
+
raise ArgumentError, 'the method argument cannot begin by `rpc.`'
|
48
|
+
elsif params && !(params.is_a?(Hash) || params.is_a?(Array))
|
49
|
+
raise ArgumentError, 'the params argument must be an Array or a Hash.'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def unique_request_id
|
54
|
+
SecureRandom.uuid
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'securerandom'
|
5
|
+
|
6
|
+
module JSONRPC
|
7
|
+
class Client
|
8
|
+
class Proxy
|
9
|
+
def initialize(server, prefix, args = [], meth = :call, delim ='.')
|
10
|
+
@server = server
|
11
|
+
@prefix = prefix ? prefix + delim : ''
|
12
|
+
@args = args
|
13
|
+
@meth = meth
|
14
|
+
end
|
15
|
+
|
16
|
+
def method_missing(mid, *args)
|
17
|
+
pre = @prefix + mid.to_s
|
18
|
+
arg = @args + args
|
19
|
+
@server.send(@meth, pre, *arg)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/jsonrpc/client.rb
CHANGED
@@ -1,10 +1,153 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
require 'net/http'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'jsonrpc/client/proxy'
|
6
|
+
require 'jsonrpc/content_type_parser'
|
7
|
+
require 'jsonrpc/request'
|
8
|
+
require 'jsonrpc/response'
|
9
|
+
|
3
10
|
module JSONRPC
|
4
11
|
# This class provides a way to dial with JSON-RPC server.
|
5
12
|
#
|
6
13
|
# @author {mailto:geoffrey.roguelon@gmail.com Geoffrey Roguelon}
|
7
14
|
class Client
|
15
|
+
include ContentTypeParser
|
16
|
+
|
17
|
+
USER_AGENT = "JSONRPC::Client (Ruby #{RUBY_VERSION})"
|
18
|
+
|
19
|
+
# Add additional HTTP headers to the request.
|
20
|
+
attr_accessor :http_header_extra
|
21
|
+
|
22
|
+
def initialize(host = nil, path = nil, port = nil, proxy_host = nil,
|
23
|
+
proxy_port = nil, user = nil, password = nil, use_ssl = nil, timeout = nil)
|
24
|
+
@http_header_extra = nil
|
25
|
+
@http_last_response = nil
|
26
|
+
@cookie = nil
|
27
|
+
|
28
|
+
@host = host || 'localhost'
|
29
|
+
@path = path || '/RPC2'
|
30
|
+
@proxy_host = proxy_host
|
31
|
+
@proxy_port = proxy_port
|
32
|
+
@proxy_host ||= 'localhost' unless @proxy_port.nil?
|
33
|
+
@proxy_port ||= 8080 unless @proxy_host.nil?
|
34
|
+
@use_ssl = use_ssl || false
|
35
|
+
@timeout = timeout || 30
|
36
|
+
|
37
|
+
@port = if use_ssl
|
38
|
+
require 'net/https'
|
39
|
+
port || 443
|
40
|
+
else
|
41
|
+
port || 80
|
42
|
+
end
|
43
|
+
|
44
|
+
@user, @password = user, password
|
45
|
+
|
46
|
+
set_auth
|
47
|
+
|
48
|
+
# convert ports to integers
|
49
|
+
@port = @port.to_i unless @port.nil?
|
50
|
+
@proxy_port = @proxy_port.to_i unless @proxy_port.nil?
|
51
|
+
|
52
|
+
# HTTP object for synchronous calls
|
53
|
+
@http = new_http
|
54
|
+
end
|
55
|
+
|
56
|
+
def request_with_array(method, *args)
|
57
|
+
request = Request.new(method, args).to_json
|
58
|
+
result = do_rpc(request, false)
|
59
|
+
Response.from_json(result, request)
|
60
|
+
end
|
61
|
+
|
62
|
+
def notify_with_array(method, *args)
|
63
|
+
Request.new(method, args).tap do |request|
|
64
|
+
do_rpc(request.to_json, false)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def proxy(prefix = nil, *args)
|
69
|
+
Proxy.new(self, prefix, args, :request_with_array)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def do_rpc(request, async = false)
|
75
|
+
headers, response = headers(request, async), nil
|
76
|
+
|
77
|
+
if async
|
78
|
+
new_http.start {
|
79
|
+
response = http.post2(@path, request, headers)
|
80
|
+
}
|
81
|
+
else
|
82
|
+
# reuse the HTTP object for each call => connection alive is possible
|
83
|
+
# we must start connection explicitely first time so that http.request
|
84
|
+
# does not assume that we don't want keepalive
|
85
|
+
@http.start unless @http.started?
|
86
|
+
|
87
|
+
response = @http.post2(@path, request, headers)
|
88
|
+
end
|
89
|
+
|
90
|
+
@http_last_response = response
|
91
|
+
|
92
|
+
response.body.tap do |data|
|
93
|
+
if response.code == '401'
|
94
|
+
# Authorization Required
|
95
|
+
raise "Authorization failed.\nHTTP-Error: #{response.code} #{response.message}"
|
96
|
+
elsif response.code[0, 1] != "2"
|
97
|
+
raise "HTTP-Error: #{response.code} #{response.message}"
|
98
|
+
end
|
99
|
+
|
100
|
+
content_type = parse_content_type(response['Content-Type']).first
|
101
|
+
if content_type != 'application/json'
|
102
|
+
raise "Wrong content-type (received '#{content_type}' but expected 'application/json')"
|
103
|
+
end
|
104
|
+
|
105
|
+
expected = response['Content-Length'] || '<unknown>'
|
106
|
+
if data.nil? || data.bytesize == 0 || expected != '<unknown>' && expected.to_i != data.bytesize && response['Transfer-Encoding'].nil?
|
107
|
+
raise "Wrong size. Was #{data.bytesize}, should be #{expected}"
|
108
|
+
end
|
109
|
+
|
110
|
+
set_cookies = response.get_fields('Set-Cookie')
|
111
|
+
if set_cookies && !set_cookies.empty?
|
112
|
+
require 'webrick/cookie'
|
113
|
+
@cookie = set_cookies.collect do |set_cookie|
|
114
|
+
cookie = WEBrick::Cookie.parse_set_cookie(set_cookie)
|
115
|
+
WEBrick::Cookie.new(cookie.name, cookie.value).to_s
|
116
|
+
end.join('; ')
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def headers(request, async)
|
122
|
+
headers = {
|
123
|
+
'User-Agent' => USER_AGENT,
|
124
|
+
'Accept' => 'application/json',
|
125
|
+
'Content-Type' => 'application/json; charset=utf-8',
|
126
|
+
'Content-Length' => request.bytesize.to_s,
|
127
|
+
'Connection' => (async ? 'close' : 'keep-alive')
|
128
|
+
}
|
129
|
+
|
130
|
+
headers['Cookie'] = @cookie if @cookie
|
131
|
+
headers.merge!(@http_header_extra) if @http_header_extra
|
132
|
+
headers['Authorization'] = @auth unless @auth.nil?
|
133
|
+
headers
|
134
|
+
end
|
135
|
+
|
136
|
+
def new_http
|
137
|
+
Net::HTTP.new(@host, @port, @proxy_host, @proxy_port).tap do |http|
|
138
|
+
http.set_debug_output($stdout)
|
139
|
+
http.use_ssl = @use_ssl if @use_ssl
|
140
|
+
http.read_timeout = @timeout
|
141
|
+
http.open_timeout = @timeout
|
142
|
+
end
|
143
|
+
end
|
8
144
|
|
145
|
+
def set_auth
|
146
|
+
@auth = if !@user.nil?
|
147
|
+
credentials = "#{@user}"
|
148
|
+
credentials << ":#{@password}" unless @password.nil?
|
149
|
+
@auth = 'Basic ' + [credentials].pack('m0')
|
150
|
+
end
|
151
|
+
end
|
9
152
|
end
|
10
153
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'jsonrpc/abstract_request'
|
5
|
+
|
6
|
+
module JSONRPC
|
7
|
+
class Response
|
8
|
+
attr_reader :request, :id, :jsonrpc, :result, :error
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def from_json(json, request = nil)
|
12
|
+
new(JSON.parse(json), request)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(response, request = nil)
|
17
|
+
@raw = response
|
18
|
+
@id = response['id']
|
19
|
+
@jsonrpc = response['jsonrpc']
|
20
|
+
@result = response['result']
|
21
|
+
@error = response['error']
|
22
|
+
@request = request
|
23
|
+
end
|
24
|
+
|
25
|
+
def body
|
26
|
+
success? ? result : error
|
27
|
+
end
|
28
|
+
|
29
|
+
def error?
|
30
|
+
!success?
|
31
|
+
end
|
32
|
+
|
33
|
+
def success?
|
34
|
+
@error.nil?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/jsonrpc/version.rb
CHANGED
data/lib/jsonrpc.rb
CHANGED
data/rpc4json.gemspec
CHANGED
@@ -22,13 +22,10 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
23
23
|
gem.require_paths = %w{lib}
|
24
24
|
|
25
|
-
gem.cert_chain = %w{certs/jsonrpc.pem}
|
26
|
-
gem.signing_key = File.expand_path('~/.ssh/gem-private_key.pem') if $0 =~/gem\z/
|
27
|
-
|
28
25
|
gem.add_development_dependency 'bundler', '~> 1.5'
|
29
26
|
gem.add_development_dependency 'rake'
|
30
27
|
|
31
28
|
# Documentation
|
32
|
-
gem.add_development_dependency 'yard',
|
29
|
+
gem.add_development_dependency 'yard', '~> 0.8.7.3'
|
33
30
|
gem.add_development_dependency 'redcarpet', '~> 3.0.0'
|
34
31
|
end
|
metadata
CHANGED
@@ -1,46 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rpc4json
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2.alpha
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Geoffrey Roguelon
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
|
-
cert_chain:
|
12
|
-
-
|
13
|
-
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURsakNDQW42Z0F3SUJB
|
14
|
-
Z0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJJTVJvd0dBWURWUVFEREJGblpX
|
15
|
-
OW0KWm5KbGVTNXliMmQxWld4dmJqRVZNQk1HQ2dtU0pvbVQ4aXhrQVJrV0JX
|
16
|
-
ZHRZV2xzTVJNd0VRWUtDWkltaVpQeQpMR1FCR1JZRFkyOXRNQjRYRFRFek1U
|
17
|
-
SXpNREE1TlRrd05Gb1hEVEUwTVRJek1EQTVOVGt3TkZvd1NERWFNQmdHCkEx
|
18
|
-
VUVBd3dSWjJWdlptWnlaWGt1Y205bmRXVnNiMjR4RlRBVEJnb0praWFKay9J
|
19
|
-
c1pBRVpGZ1ZuYldGcGJERVQKTUJFR0NnbVNKb21UOGl4a0FSa1dBMk52YlRD
|
20
|
-
Q0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQwpnZ0VCQUsw
|
21
|
-
UVZoL0NNWWZ5clpZc1VWWHU2ZXhhekZRU0FiN3ZSRlZaOFVLUkNwdlB4cVMx
|
22
|
-
YjFCbUwrMnNpdkd3CklpZmNQT1EzT1BnVjI0VFd5Yi9jMWI2YU5KYjNZRGN5
|
23
|
-
M1ZKMlErbUFPL1pWTmJrdTQrUXQrV2dPa1lzWE0vcTQKZENiUWhzaTViMkRa
|
24
|
-
bkoyaE8xcEI1ZEt6Qi84cW1INS83QVkrbStIZU9KZkRDVmJkeVU5K3VEd0ZS
|
25
|
-
T1F6eXp6aAorbmtnVzMvOVZBb3R5R1VLNXFnYkFaSXRReC94bytnbjJSVzVv
|
26
|
-
Si9WQTlVdTZEVDJxbUhReGRlRzdEemYxZWJnCm84a09ZbGxHejY0cThOcXJa
|
27
|
-
N0l3c3FqTzRMTk9KYlN4Z2hXRDlrTlJ6bGpnLzRVTDRMYXU4ZmVkS0lSTXVO
|
28
|
-
ekgKdTgxY2xnN3JpQWxoN1ducDNBeDc0bm9FdzdjQ0F3RUFBYU9CaWpDQmh6
|
29
|
-
QUpCZ05WSFJNRUFqQUFNQXNHQTFVZApEd1FFQXdJRXNEQWRCZ05WSFE0RUZn
|
30
|
-
UVV1b0syZDFuTnAwQW9kV3hwLzVwTnE2MS9STEl3SmdZRFZSMFJCQjh3CkhZ
|
31
|
-
RWJaMlZ2Wm1aeVpYa3VjbTluZFdWc2IyNUFaMjFoYVd3dVkyOXRNQ1lHQTFV
|
32
|
-
ZEVnUWZNQjJCRzJkbGIyWm0KY21WNUxuSnZaM1ZsYkc5dVFHZHRZV2xzTG1O
|
33
|
-
dmJUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFrSGI1YkRPUgpKU1dJNlpm
|
34
|
-
OCtKRkFFdGFUTmN5TWJaYStNQzFvTFg1Z2hVaXRNWFdGNlpFdGVNeGZzanh6
|
35
|
-
VjVacUJuSEVHUlV5CkE3ZXBTS2ErUmNvdGZxU1BBc3gwdmt4bVl0NHo0Mm1o
|
36
|
-
KzlFUXpHKzJ5cGhEZlI1ZDdvaU00UDRjVjN5ZVNPVE8KNGlVcGpya2JjNWRV
|
37
|
-
VlVydVlTTUFBVFJ2WkE3YVp2Qm0zcGJEU01zYzVvTkdWdU5RTEtQU3RHeURq
|
38
|
-
aWQxZHVWSwpEdmFFY2s2U1FkY2FkeVZ1Vm5sTVZoek8vSTZpdkIrOTJKbXVh
|
39
|
-
TWl4ZG1OcTUzWlNzNS9HbithWHkvakZBcXhOCjdyRzNmK2N5VXcxeDgwSXZZ
|
40
|
-
cWQzRytGRWxEaFRZT0Qxd1UzMzU2TlczUm1tcGxRQ1JCNXhJSzdHdGk2Uk93
|
41
|
-
bG0KbTFWcDZCSFR0WnFTU3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0t
|
42
|
-
Cg==
|
43
|
-
date: 2013-12-30 00:00:00.000000000 Z
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-10-28 00:00:00.000000000 Z
|
44
13
|
dependencies:
|
45
14
|
- !ruby/object:Gem::Dependency
|
46
15
|
name: bundler
|
@@ -117,9 +86,14 @@ files:
|
|
117
86
|
- LICENSE.txt
|
118
87
|
- README.md
|
119
88
|
- Rakefile
|
120
|
-
- certs/jsonrpc.pem
|
121
89
|
- lib/jsonrpc.rb
|
90
|
+
- lib/jsonrpc/abstract_request.rb
|
122
91
|
- lib/jsonrpc/client.rb
|
92
|
+
- lib/jsonrpc/client/proxy.rb
|
93
|
+
- lib/jsonrpc/content_type_parser.rb
|
94
|
+
- lib/jsonrpc/notification.rb
|
95
|
+
- lib/jsonrpc/request.rb
|
96
|
+
- lib/jsonrpc/response.rb
|
123
97
|
- lib/jsonrpc/version.rb
|
124
98
|
- lib/rpc4json.rb
|
125
99
|
- rpc4json.gemspec
|
@@ -144,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
118
|
version: 1.3.1
|
145
119
|
requirements: []
|
146
120
|
rubyforge_project:
|
147
|
-
rubygems_version: 1.8.23
|
121
|
+
rubygems_version: 1.8.23.2
|
148
122
|
signing_key:
|
149
123
|
specification_version: 3
|
150
124
|
summary: An Ruby implementation of the JSON-RPC 2.0 specification.
|
data/certs/jsonrpc.pem
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
2
|
-
MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRowGAYDVQQDDBFnZW9m
|
3
|
-
ZnJleS5yb2d1ZWxvbjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
|
4
|
-
LGQBGRYDY29tMB4XDTEzMTIzMDA5NTkwNFoXDTE0MTIzMDA5NTkwNFowSDEaMBgG
|
5
|
-
A1UEAwwRZ2VvZmZyZXkucm9ndWVsb24xFTATBgoJkiaJk/IsZAEZFgVnbWFpbDET
|
6
|
-
MBEGCgmSJomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
|
7
|
-
ggEBAK0QVh/CMYfyrZYsUVXu6exazFQSAb7vRFVZ8UKRCpvPxqS1b1BmL+2sivGw
|
8
|
-
IifcPOQ3OPgV24TWyb/c1b6aNJb3YDcy3VJ2Q+mAO/ZVNbku4+Qt+WgOkYsXM/q4
|
9
|
-
dCbQhsi5b2DZnJ2hO1pB5dKzB/8qmH5/7AY+m+HeOJfDCVbdyU9+uDwFROQzyzzh
|
10
|
-
+nkgW3/9VAotyGUK5qgbAZItQx/xo+gn2RW5oJ/VA9Uu6DT2qmHQxdeG7Dzf1ebg
|
11
|
-
o8kOYllGz64q8NqrZ7IwsqjO4LNOJbSxghWD9kNRzljg/4UL4Lau8fedKIRMuNzH
|
12
|
-
u81clg7riAlh7Wnp3Ax74noEw7cCAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
|
13
|
-
DwQEAwIEsDAdBgNVHQ4EFgQUuoK2d1nNp0AodWxp/5pNq61/RLIwJgYDVR0RBB8w
|
14
|
-
HYEbZ2VvZmZyZXkucm9ndWVsb25AZ21haWwuY29tMCYGA1UdEgQfMB2BG2dlb2Zm
|
15
|
-
cmV5LnJvZ3VlbG9uQGdtYWlsLmNvbTANBgkqhkiG9w0BAQUFAAOCAQEAkHb5bDOR
|
16
|
-
JSWI6Zf8+JFAEtaTNcyMbZa+MC1oLX5ghUitMXWF6ZEteMxfsjxzV5ZqBnHEGRUy
|
17
|
-
A7epSKa+RcotfqSPAsx0vkxmYt4z42mh+9EQzG+2yphDfR5d7oiM4P4cV3yeSOTO
|
18
|
-
4iUpjrkbc5dUVUruYSMAATRvZA7aZvBm3pbDSMsc5oNGVuNQLKPStGyDjid1duVK
|
19
|
-
DvaEck6SQdcadyVuVnlMVhzO/I6ivB+92JmuaMixdmNq53ZSs5/Gn+aXy/jFAqxN
|
20
|
-
7rG3f+cyUw1x80IvYqd3G+FElDhTYOD1wU3356NW3RmmplQCRB5xIK7Gti6ROwlm
|
21
|
-
m1Vp6BHTtZqSSw==
|
22
|
-
-----END CERTIFICATE-----
|
data.tar.gz.sig
DELETED
Binary file
|
metadata.gz.sig
DELETED