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  }