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