github.com/alanchchen/go-ethereum@v1.6.6-0.20170601190819-6171d01b1195/swarm/api/uri.go (about) 1 // Copyright 2017 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package api 18 19 import ( 20 "fmt" 21 "net/url" 22 "strings" 23 ) 24 25 // URI is a reference to content stored in swarm. 26 type URI struct { 27 // Scheme has one of the following values: 28 // 29 // * bzz - an entry in a swarm manifest 30 // * bzzr - raw swarm content 31 // * bzzi - immutable URI of an entry in a swarm manifest 32 // (address is not resolved) 33 Scheme string 34 35 // Addr is either a hexadecimal storage key or it an address which 36 // resolves to a storage key 37 Addr string 38 39 // Path is the path to the content within a swarm manifest 40 Path string 41 } 42 43 // Parse parses rawuri into a URI struct, where rawuri is expected to have one 44 // of the following formats: 45 // 46 // * <scheme>:/ 47 // * <scheme>:/<addr> 48 // * <scheme>:/<addr>/<path> 49 // * <scheme>:// 50 // * <scheme>://<addr> 51 // * <scheme>://<addr>/<path> 52 // 53 // with scheme one of bzz, bzzr or bzzi 54 func Parse(rawuri string) (*URI, error) { 55 u, err := url.Parse(rawuri) 56 if err != nil { 57 return nil, err 58 } 59 uri := &URI{Scheme: u.Scheme} 60 61 // check the scheme is valid 62 switch uri.Scheme { 63 case "bzz", "bzzi", "bzzr": 64 default: 65 return nil, fmt.Errorf("unknown scheme %q", u.Scheme) 66 } 67 68 // handle URIs like bzz://<addr>/<path> where the addr and path 69 // have already been split by url.Parse 70 if u.Host != "" { 71 uri.Addr = u.Host 72 uri.Path = strings.TrimLeft(u.Path, "/") 73 return uri, nil 74 } 75 76 // URI is like bzz:/<addr>/<path> so split the addr and path from 77 // the raw path (which will be /<addr>/<path>) 78 parts := strings.SplitN(strings.TrimLeft(u.Path, "/"), "/", 2) 79 uri.Addr = parts[0] 80 if len(parts) == 2 { 81 uri.Path = parts[1] 82 } 83 return uri, nil 84 } 85 86 func (u *URI) Raw() bool { 87 return u.Scheme == "bzzr" 88 } 89 90 func (u *URI) Immutable() bool { 91 return u.Scheme == "bzzi" 92 } 93 94 func (u *URI) String() string { 95 return u.Scheme + ":/" + u.Addr + "/" + u.Path 96 }