@@ -4,8 +4,11 @@ import (
44 "bytes"
55 "context"
66 "encoding/json"
7+ "errors"
78 "fmt"
89 "net"
10+ "net/url"
11+ "strings"
912 "time"
1013
1114 shell "github.com/ipfs/go-ipfs-api"
@@ -30,16 +33,16 @@ type IpfsClient struct {
3033func InitClient (settingsObj * settings.SettingsObj ) * IpfsClient {
3134 writeUrl := settingsObj .IpfsConfig .URL
3235
33- writeUrl , err := ParseMultiAddrURL (writeUrl )
36+ writeUrl , err := ParseURL (writeUrl )
3437 if err != nil {
35- log .WithError (err ).Fatal ("failed to parse IPFS write multiaddr URL: " , writeUrl )
38+ log .WithError (err ).Fatal ("failed to parse IPFS write URL: " , writeUrl )
3639 }
3740
3841 readUrl := settingsObj .IpfsConfig .ReaderURL
3942
40- readUrl , err = ParseMultiAddrURL (readUrl )
43+ readUrl , err = ParseURL (readUrl )
4144 if err != nil {
42- log .WithError (err ).Fatal ("failed to parse IPFS read multiaddr URL: " , readUrl )
45+ log .WithError (err ).Fatal ("failed to parse IPFS read URL: " , readUrl )
4346 }
4447
4548 ipfsReadHTTPClient := httpclient .GetIPFSReadHTTPClient (settingsObj )
@@ -127,27 +130,28 @@ func (e *UnsupportedMultiaddrError) Error() string {
127130 return fmt .Sprintf ("unsupported multiaddr url pattern: %s" , e .URL )
128131}
129132
130- func ParseMultiAddrURL (url string ) (string , error ) {
133+ // ParseURL tries to parse a multiaddr URL, if the url is not multiaddr it tries to parse http url.
134+ func ParseURL (ipfsUrl string ) (string , error ) {
131135 parts := make ([]string , 0 ) // [host,port,scheme]
132136
133- if multiaddr , err := ma .NewMultiaddr (url ); err == nil {
137+ if multiaddr , err := ma .NewMultiaddr (ipfsUrl ); err == nil {
134138 addrSplits := ma .Split (multiaddr )
135139
136140 // host and port are required
137141 if len (addrSplits ) < 2 {
138- return "" , & UnsupportedMultiaddrError {URL : url }
142+ return "" , & UnsupportedMultiaddrError {URL : ipfsUrl }
139143 }
140144
141145 for index , addr := range addrSplits {
142146 component , _ := ma .SplitFirst (addr )
143147 if index == 1 && component .Protocol ().Code != ma .P_TCP {
144- return "" , & UnsupportedMultiaddrError {URL : url }
148+ return "" , & UnsupportedMultiaddrError {URL : ipfsUrl }
145149 }
146150
147151 // check if scheme is present
148152 if index == 2 {
149153 if component .Protocol ().Code != ma .P_HTTP && component .Protocol ().Code != ma .P_HTTPS {
150- return "" , & UnsupportedMultiaddrError {URL : url }
154+ return "" , & UnsupportedMultiaddrError {URL : ipfsUrl }
151155 }
152156
153157 parts = append (parts , component .Protocol ().Name )
@@ -159,23 +163,37 @@ func ParseMultiAddrURL(url string) (string, error) {
159163 }
160164
161165 if len (parts ) < 2 {
162- return "" , & UnsupportedMultiaddrError {URL : url }
166+ return "" , & UnsupportedMultiaddrError {URL : ipfsUrl }
163167 }
164168
165169 // join host and port
166- url = net .JoinHostPort (parts [0 ], parts [1 ])
170+ ipfsUrl = net .JoinHostPort (parts [0 ], parts [1 ])
167171
168172 // add scheme if present
169173 if len (parts ) >= 3 {
170- url = fmt .Sprintf ("%s://%s" , parts [2 ], url )
174+ ipfsUrl = fmt .Sprintf ("%s://%s" , parts [2 ], ipfsUrl )
171175 } else {
172- url = fmt .Sprintf ("http://%s" , url ) // default to http if scheme is not present
176+ ipfsUrl = fmt .Sprintf ("http://%s" , ipfsUrl ) // default to http if scheme is not present
173177 }
174178 } else {
175- return "" , err
179+ // parse http url
180+ parsedURL , err := url .ParseRequestURI (ipfsUrl )
181+ if err != nil {
182+ return "" , err
183+ }
184+
185+ // check if scheme is http or https
186+ if ! strings .EqualFold (parsedURL .Scheme , "http" ) && ! strings .EqualFold (parsedURL .Scheme , "https" ) {
187+ return "" , fmt .Errorf ("unsupported scheme: %s" , parsedURL .Scheme )
188+ }
189+
190+ // check if host is present
191+ if parsedURL .Host == "" {
192+ return "" , errors .New ("host is required in url" )
193+ }
176194 }
177195
178- return url , nil
196+ return ipfsUrl , nil
179197}
180198
181199func (client * IpfsClient ) UploadSnapshotToIPFS (payloadCommit * datamodel.PayloadCommitMessage ) error {
0 commit comments