uri.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. package api
  17. import (
  18. "fmt"
  19. "net/url"
  20. "strings"
  21. )
  22. // URI is a reference to content stored in swarm.
  23. type URI struct {
  24. // Scheme has one of the following values:
  25. //
  26. // * bzz - an entry in a swarm manifest
  27. // * bzzr - raw swarm content
  28. // * bzzi - immutable URI of an entry in a swarm manifest
  29. // (address is not resolved)
  30. Scheme string
  31. // Addr is either a hexadecimal storage key or it an address which
  32. // resolves to a storage key
  33. Addr string
  34. // Path is the path to the content within a swarm manifest
  35. Path string
  36. }
  37. // Parse parses rawuri into a URI struct, where rawuri is expected to have one
  38. // of the following formats:
  39. //
  40. // * <scheme>:/
  41. // * <scheme>:/<addr>
  42. // * <scheme>:/<addr>/<path>
  43. // * <scheme>://
  44. // * <scheme>://<addr>
  45. // * <scheme>://<addr>/<path>
  46. //
  47. // with scheme one of bzz, bzzr or bzzi
  48. func Parse(rawuri string) (*URI, error) {
  49. u, err := url.Parse(rawuri)
  50. if err != nil {
  51. return nil, err
  52. }
  53. uri := &URI{Scheme: u.Scheme}
  54. // check the scheme is valid
  55. switch uri.Scheme {
  56. case "bzz", "bzzi", "bzzr":
  57. default:
  58. return nil, fmt.Errorf("unknown scheme %q", u.Scheme)
  59. }
  60. // handle URIs like bzz://<addr>/<path> where the addr and path
  61. // have already been split by url.Parse
  62. if u.Host != "" {
  63. uri.Addr = u.Host
  64. uri.Path = strings.TrimLeft(u.Path, "/")
  65. return uri, nil
  66. }
  67. // URI is like bzz:/<addr>/<path> so split the addr and path from
  68. // the raw path (which will be /<addr>/<path>)
  69. parts := strings.SplitN(strings.TrimLeft(u.Path, "/"), "/", 2)
  70. uri.Addr = parts[0]
  71. if len(parts) == 2 {
  72. uri.Path = parts[1]
  73. }
  74. return uri, nil
  75. }
  76. func (u *URI) Raw() bool {
  77. return u.Scheme == "bzzr"
  78. }
  79. func (u *URI) Immutable() bool {
  80. return u.Scheme == "bzzi"
  81. }
  82. func (u *URI) String() string {
  83. return u.Scheme + ":/" + u.Addr + "/" + u.Path
  84. }