github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/api/uri.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:47</date> 10 //</624342670319292416> 11 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 // 25 // 26 // 27 28 package api 29 30 import ( 31 "fmt" 32 "net/url" 33 "regexp" 34 "strings" 35 36 "github.com/ethereum/go-ethereum/common" 37 "github.com/ethereum/go-ethereum/swarm/storage" 38 ) 39 40 // 41 // 42 var hashMatcher = regexp.MustCompile("^([0-9A-Fa-f]{64})([0-9A-Fa-f]{64})?$") 43 44 // 45 type URI struct { 46 // 47 // 48 // 49 // 50 // 51 // 52 // 53 // 54 Scheme string 55 56 // 57 // 58 Addr string 59 60 // 61 addr storage.Address 62 63 // 64 Path string 65 } 66 67 func (u *URI) MarshalJSON() (out []byte, err error) { 68 return []byte(`"` + u.String() + `"`), nil 69 } 70 71 func (u *URI) UnmarshalJSON(value []byte) error { 72 uri, err := Parse(string(value)) 73 if err != nil { 74 return err 75 } 76 *u = *uri 77 return nil 78 } 79 80 // 81 // 82 // 83 // 84 // 85 // 86 // 87 // 88 // 89 // 90 // 91 func Parse(rawuri string) (*URI, error) { 92 u, err := url.Parse(rawuri) 93 if err != nil { 94 return nil, err 95 } 96 uri := &URI{Scheme: u.Scheme} 97 98 // 99 switch uri.Scheme { 100 case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzz-resource": 101 default: 102 return nil, fmt.Errorf("unknown scheme %q", u.Scheme) 103 } 104 105 // 106 // 107 if u.Host != "" { 108 uri.Addr = u.Host 109 uri.Path = strings.TrimLeft(u.Path, "/") 110 return uri, nil 111 } 112 113 // 114 // 115 parts := strings.SplitN(strings.TrimLeft(u.Path, "/"), "/", 2) 116 uri.Addr = parts[0] 117 if len(parts) == 2 { 118 uri.Path = parts[1] 119 } 120 return uri, nil 121 } 122 func (u *URI) Resource() bool { 123 return u.Scheme == "bzz-resource" 124 } 125 126 func (u *URI) Raw() bool { 127 return u.Scheme == "bzz-raw" 128 } 129 130 func (u *URI) Immutable() bool { 131 return u.Scheme == "bzz-immutable" 132 } 133 134 func (u *URI) List() bool { 135 return u.Scheme == "bzz-list" 136 } 137 138 func (u *URI) Hash() bool { 139 return u.Scheme == "bzz-hash" 140 } 141 142 func (u *URI) String() string { 143 return u.Scheme + ":/" + u.Addr + "/" + u.Path 144 } 145 146 func (u *URI) Address() storage.Address { 147 if u.addr != nil { 148 return u.addr 149 } 150 if hashMatcher.MatchString(u.Addr) { 151 u.addr = common.Hex2Bytes(u.Addr) 152 return u.addr 153 } 154 return nil 155 } 156