docker-remote 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/docker/remote/client.rb +68 -1
- data/lib/docker/remote/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa237c85cc84f1754b6cd4e22a62d8216a82ef07777d2b47d7b786769dc6e271
|
4
|
+
data.tar.gz: 0dc9ce6503cea3974e74783cfa612e11a094419e65c5dcbc7a202f2b51b10343
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb25048ceb8c1e7b1b567b7741fda86a7b8eebef80450b77f18d5b6ce32a4f2558d4c9ac36fbbde6ff7b6c4591a3ffd5e988859152906b65e96e82aaf17d1e1a
|
7
|
+
data.tar.gz: 48e4aa145fb981fbdf0a28719c476084f4d1028f90e663192c9ea663cc86fe6cb92d52fd6b2a5231a2c0d306670b30cf97af0559f1445ffec76bc32e326bf7d7
|
data/CHANGELOG.md
CHANGED
data/lib/docker/remote/client.rb
CHANGED
@@ -13,6 +13,10 @@ module Docker
|
|
13
13
|
|
14
14
|
attr_reader :registry_url, :repo, :username, :password
|
15
15
|
|
16
|
+
PORTMAP = { 'ghcr.io' => 443 }.freeze
|
17
|
+
DEFAULT_PORT = 443
|
18
|
+
STANDARD_PORTS = [DEFAULT_PORT, 80].freeze
|
19
|
+
|
16
20
|
def initialize(registry_url, repo, username = nil, password = nil)
|
17
21
|
@registry_url = registry_url
|
18
22
|
@repo = repo
|
@@ -113,7 +117,27 @@ module Docker
|
|
113
117
|
end
|
114
118
|
|
115
119
|
def registry_uri
|
116
|
-
@registry_uri ||=
|
120
|
+
@registry_uri ||= begin
|
121
|
+
host_port, *rest = registry_url.split('/')
|
122
|
+
host, port = host_port.split(':')
|
123
|
+
|
124
|
+
ports = if port
|
125
|
+
[port.to_i]
|
126
|
+
elsif prt = PORTMAP[host]
|
127
|
+
[prt]
|
128
|
+
else
|
129
|
+
STANDARD_PORTS
|
130
|
+
end
|
131
|
+
|
132
|
+
port = ports.find { |port| can_connect?(host, port) }
|
133
|
+
|
134
|
+
unless port
|
135
|
+
raise DockerRemoteError, "couldn't determine what port to connect to"
|
136
|
+
end
|
137
|
+
|
138
|
+
scheme = port == DEFAULT_PORT ? 'https' : 'http'
|
139
|
+
URI.parse("#{scheme}://#{host}:#{port}/#{rest.join('/')}")
|
140
|
+
end
|
117
141
|
end
|
118
142
|
|
119
143
|
def make_http(uri)
|
@@ -125,6 +149,49 @@ module Docker
|
|
125
149
|
def registry_http
|
126
150
|
@registry_http ||= make_http(registry_uri)
|
127
151
|
end
|
152
|
+
|
153
|
+
# Adapted from: https://spin.atomicobject.com/2013/09/30/socket-connection-timeout-ruby/
|
154
|
+
def can_connect?(host, port)
|
155
|
+
# Convert the passed host into structures the non-blocking calls
|
156
|
+
# can deal with
|
157
|
+
addr = Socket.getaddrinfo(host, nil)
|
158
|
+
sockaddr = Socket.pack_sockaddr_in(port, addr[0][3])
|
159
|
+
timeout = 3
|
160
|
+
|
161
|
+
Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0).tap do |socket|
|
162
|
+
socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
|
163
|
+
|
164
|
+
begin
|
165
|
+
# Initiate the socket connection in the background. If it doesn't fail
|
166
|
+
# immediately it will raise an IO::WaitWritable (Errno::EINPROGRESS)
|
167
|
+
# indicating the connection is in progress.
|
168
|
+
socket.connect_nonblock(sockaddr)
|
169
|
+
|
170
|
+
rescue IO::WaitWritable
|
171
|
+
# IO.select will block until the socket is writable or the timeout
|
172
|
+
# is exceeded - whichever comes first.
|
173
|
+
if IO.select(nil, [socket], nil, timeout)
|
174
|
+
begin
|
175
|
+
# Verify there is now a good connection
|
176
|
+
socket.connect_nonblock(sockaddr)
|
177
|
+
rescue Errno::EISCONN
|
178
|
+
# Good news everybody, the socket is connected!
|
179
|
+
socket.close
|
180
|
+
return true
|
181
|
+
rescue
|
182
|
+
# An unexpected exception was raised - the connection is no good.
|
183
|
+
socket.close
|
184
|
+
end
|
185
|
+
else
|
186
|
+
# IO.select returns nil when the socket is not ready before timeout
|
187
|
+
# seconds have elapsed
|
188
|
+
socket.close
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
false
|
194
|
+
end
|
128
195
|
end
|
129
196
|
end
|
130
197
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docker-remote
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Dutro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11-
|
11
|
+
date: 2020-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A Ruby client for communicating with the Docker registry API v2.
|
14
14
|
email:
|