Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
mf
go-multiaddr
Commits
41d11170
Commit
41d11170
authored
Jan 19, 2016
by
Juan Benet
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #16 from whyrusleeping/feat/modular
Feat/modular
parents
dd8f16c4
ae64eb99
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
75 additions
and
0 deletions
+75
-0
interface.go
interface.go
+3
-0
multiaddr.go
multiaddr.go
+16
-0
multiaddr_test.go
multiaddr_test.go
+42
-0
protocols.go
protocols.go
+14
-0
No files found.
interface.go
View file @
41d11170
...
...
@@ -39,4 +39,7 @@ type Multiaddr interface {
// /ip4/1.2.3.4/tcp/80 decapsulate /ip4/1.2.3.4 = /tcp/80
//
Decapsulate
(
Multiaddr
)
Multiaddr
// ValueForProtocol returns the value (if any) following the specified protocol
ValueForProtocol
(
code
int
)
(
string
,
error
)
}
multiaddr.go
View file @
41d11170
...
...
@@ -113,3 +113,19 @@ func (m *multiaddr) Decapsulate(o Multiaddr) Multiaddr {
}
return
ma
}
var
ErrProtocolNotFound
=
fmt
.
Errorf
(
"protocol not found in multiaddr"
)
func
(
m
*
multiaddr
)
ValueForProtocol
(
code
int
)
(
string
,
error
)
{
for
_
,
sub
:=
range
Split
(
m
)
{
p
:=
sub
.
Protocols
()[
0
]
if
p
.
Code
==
code
{
if
p
.
Size
==
0
{
return
""
,
nil
}
return
strings
.
Split
(
sub
.
String
(),
"/"
)[
2
],
nil
}
}
return
""
,
ErrProtocolNotFound
}
multiaddr_test.go
View file @
41d11170
...
...
@@ -300,3 +300,45 @@ func TestEncapsulate(t *testing.T) {
t
.
Error
(
"decapsulate /ip4 failed."
,
"/"
,
s
)
}
}
func
assertValueForProto
(
t
*
testing
.
T
,
a
Multiaddr
,
p
int
,
exp
string
)
{
t
.
Logf
(
"checking for %s in %s"
,
ProtocolWithCode
(
p
)
.
Name
,
a
)
fv
,
err
:=
a
.
ValueForProtocol
(
p
)
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
if
fv
!=
exp
{
t
.
Fatalf
(
"expected %q for %d in %d, but got %q instead"
,
exp
,
p
,
a
,
fv
)
}
}
func
TestGetValue
(
t
*
testing
.
T
)
{
a
:=
newMultiaddr
(
t
,
"/ip4/127.0.0.1/utp/tcp/5555/udp/1234/utp/ipfs/QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP"
)
assertValueForProto
(
t
,
a
,
P_IP4
,
"127.0.0.1"
)
assertValueForProto
(
t
,
a
,
P_UTP
,
""
)
assertValueForProto
(
t
,
a
,
P_TCP
,
"5555"
)
assertValueForProto
(
t
,
a
,
P_UDP
,
"1234"
)
assertValueForProto
(
t
,
a
,
P_IPFS
,
"QmbHVEEepCi7rn7VL7Exxpd2Ci9NNB6ifvqwhsrbRMgQFP"
)
_
,
err
:=
a
.
ValueForProtocol
(
P_IP6
)
switch
err
{
case
ErrProtocolNotFound
:
break
case
nil
:
t
.
Fatal
(
"expected value lookup to fail"
)
default
:
t
.
Fatalf
(
"expected ErrProtocolNotFound but got: %s"
,
err
)
}
a
=
newMultiaddr
(
t
,
"/ip4/0.0.0.0"
)
// only one addr
assertValueForProto
(
t
,
a
,
P_IP4
,
"0.0.0.0"
)
a
=
newMultiaddr
(
t
,
"/ip4/0.0.0.0/ip4/0.0.0.0/ip4/0.0.0.0"
)
// same sub-addr
assertValueForProto
(
t
,
a
,
P_IP4
,
"0.0.0.0"
)
a
=
newMultiaddr
(
t
,
"/ip4/0.0.0.0/udp/12345/utp"
)
// ending in a no-value one.
assertValueForProto
(
t
,
a
,
P_IP4
,
"0.0.0.0"
)
assertValueForProto
(
t
,
a
,
P_UDP
,
"12345"
)
assertValueForProto
(
t
,
a
,
P_UTP
,
""
)
}
protocols.go
View file @
41d11170
...
...
@@ -55,6 +55,20 @@ var Protocols = []Protocol{
Protocol
{
P_IPFS
,
LengthPrefixedVarSize
,
"ipfs"
,
CodeToVarint
(
P_IPFS
)},
}
func
AddProtocol
(
p
Protocol
)
error
{
for
_
,
pt
:=
range
Protocols
{
if
pt
.
Code
==
p
.
Code
{
return
fmt
.
Errorf
(
"protocol code %d already taken by %q"
,
p
.
Code
,
pt
.
Name
)
}
if
pt
.
Name
==
p
.
Name
{
return
fmt
.
Errorf
(
"protocol by the name %q already exists"
,
p
.
Name
)
}
}
Protocols
=
append
(
Protocols
,
p
)
return
nil
}
// ProtocolWithName returns the Protocol description with given string name.
func
ProtocolWithName
(
s
string
)
Protocol
{
for
_
,
p
:=
range
Protocols
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment