github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/api/uri.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 // 10 // 11 // 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 25 package api 26 27 import ( 28 "fmt" 29 "net/url" 30 "regexp" 31 "strings" 32 33 "github.com/ethereum/go-ethereum/common" 34 "github.com/ethereum/go-ethereum/swarm/storage" 35 ) 36 37 // 38 // 39 var hashMatcher = regexp.MustCompile("^([0-9A-Fa-f]{64})([0-9A-Fa-f]{64})?$") 40 41 // 42 type URI struct { 43 // 44 // 45 // 46 // 47 // 48 // 49 // 50 // 51 Scheme string 52 53 // 54 // 55 Addr string 56 57 // 58 addr storage.Address 59 60 // 61 Path string 62 } 63 64 func (u *URI) MarshalJSON() (out []byte, err error) { 65 return []byte(`"` + u.String() + `"`), nil 66 } 67 68 func (u *URI) UnmarshalJSON(value []byte) error { 69 uri, err := Parse(string(value)) 70 if err != nil { 71 return err 72 } 73 *u = *uri 74 return nil 75 } 76 77 // 78 // 79 // 80 // 81 // 82 // 83 // 84 // 85 // 86 // 87 // 88 func Parse(rawuri string) (*URI, error) { 89 u, err := url.Parse(rawuri) 90 if err != nil { 91 return nil, err 92 } 93 uri := &URI{Scheme: u.Scheme} 94 95 // 96 switch uri.Scheme { 97 case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzz-resource": 98 default: 99 return nil, fmt.Errorf("unknown scheme %q", u.Scheme) 100 } 101 102 // 103 // 104 if u.Host != "" { 105 uri.Addr = u.Host 106 uri.Path = strings.TrimLeft(u.Path, "/") 107 return uri, nil 108 } 109 110 // 111 // 112 parts := strings.SplitN(strings.TrimLeft(u.Path, "/"), "/", 2) 113 uri.Addr = parts[0] 114 if len(parts) == 2 { 115 uri.Path = parts[1] 116 } 117 return uri, nil 118 } 119 func (u *URI) Resource() bool { 120 return u.Scheme == "bzz-resource" 121 } 122 123 func (u *URI) Raw() bool { 124 return u.Scheme == "bzz-raw" 125 } 126 127 func (u *URI) Immutable() bool { 128 return u.Scheme == "bzz-immutable" 129 } 130 131 func (u *URI) List() bool { 132 return u.Scheme == "bzz-list" 133 } 134 135 func (u *URI) Hash() bool { 136 return u.Scheme == "bzz-hash" 137 } 138 139 func (u *URI) String() string { 140 return u.Scheme + ":/" + u.Addr + "/" + u.Path 141 } 142 143 func (u *URI) Address() storage.Address { 144 if u.addr != nil { 145 return u.addr 146 } 147 if hashMatcher.MatchString(u.Addr) { 148 u.addr = common.Hex2Bytes(u.Addr) 149 return u.addr 150 } 151 return nil 152 }