common/httpclient, les: removed httpclient
This commit is contained in:
		| @@ -1,124 +0,0 @@ | |||||||
| // Copyright 2015 The go-ethereum Authors |  | ||||||
| // This file is part of the go-ethereum library. |  | ||||||
| // |  | ||||||
| // The go-ethereum library is free software: you can redistribute it and/or modify |  | ||||||
| // it under the terms of the GNU Lesser General Public License as published by |  | ||||||
| // the Free Software Foundation, either version 3 of the License, or |  | ||||||
| // (at your option) any later version. |  | ||||||
| // |  | ||||||
| // The go-ethereum library is distributed in the hope that it will be useful, |  | ||||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |  | ||||||
| // GNU Lesser General Public License for more details. |  | ||||||
| // |  | ||||||
| // You should have received a copy of the GNU Lesser General Public License |  | ||||||
| // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. |  | ||||||
|  |  | ||||||
| package httpclient |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"net/http" |  | ||||||
| 	"path/filepath" |  | ||||||
|  |  | ||||||
| 	"github.com/ethereum/go-ethereum/common" |  | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| type HTTPClient struct { |  | ||||||
| 	*http.Transport |  | ||||||
| 	DocRoot string |  | ||||||
| 	schemes []string |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func New(docRoot string) (self *HTTPClient) { |  | ||||||
| 	self = &HTTPClient{ |  | ||||||
| 		Transport: &http.Transport{}, |  | ||||||
| 		DocRoot:   docRoot, |  | ||||||
| 		schemes:   []string{"file"}, |  | ||||||
| 	} |  | ||||||
| 	self.RegisterProtocol("file", http.NewFileTransport(http.Dir(self.DocRoot))) |  | ||||||
| 	return |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Clients should be reused instead of created as needed. Clients are safe for concurrent use by multiple goroutines. |  | ||||||
|  |  | ||||||
| // A Client is higher-level than a RoundTripper (such as Transport) and additionally handles HTTP details such as cookies and redirects. |  | ||||||
|  |  | ||||||
| func (self *HTTPClient) Client() *http.Client { |  | ||||||
| 	return &http.Client{ |  | ||||||
| 		Transport: self, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (self *HTTPClient) RegisterScheme(scheme string, rt http.RoundTripper) { |  | ||||||
| 	self.schemes = append(self.schemes, scheme) |  | ||||||
| 	self.RegisterProtocol(scheme, rt) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (self *HTTPClient) HasScheme(scheme string) bool { |  | ||||||
| 	for _, s := range self.schemes { |  | ||||||
| 		if s == scheme { |  | ||||||
| 			return true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (self *HTTPClient) GetAuthContent(uri string, hash common.Hash) ([]byte, error) { |  | ||||||
| 	// retrieve content |  | ||||||
| 	content, err := self.Get(uri, "") |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// check hash to authenticate content |  | ||||||
| 	chash := crypto.Keccak256Hash(content) |  | ||||||
| 	if chash != hash { |  | ||||||
| 		return nil, fmt.Errorf("content hash mismatch %x != %x (exp)", hash[:], chash[:]) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return content, nil |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Get(uri, path) downloads the document at uri, if path is non-empty it |  | ||||||
| // is interpreted as a filepath to which the contents are saved |  | ||||||
| func (self *HTTPClient) Get(uri, path string) ([]byte, error) { |  | ||||||
| 	// retrieve content |  | ||||||
| 	resp, err := self.Client().Get(uri) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	defer func() { |  | ||||||
| 		if resp != nil { |  | ||||||
| 			resp.Body.Close() |  | ||||||
| 		} |  | ||||||
| 	}() |  | ||||||
|  |  | ||||||
| 	var content []byte |  | ||||||
| 	content, err = ioutil.ReadAll(resp.Body) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if resp.StatusCode/100 != 2 { |  | ||||||
| 		return content, fmt.Errorf("HTTP error: %s", resp.Status) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if path != "" { |  | ||||||
| 		var abspath string |  | ||||||
| 		abspath, err = filepath.Abs(path) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 		err = ioutil.WriteFile(abspath, content, 0600) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return nil, err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return content, nil |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @@ -1,77 +0,0 @@ | |||||||
| // Copyright 2015 The go-ethereum Authors |  | ||||||
| // This file is part of the go-ethereum library. |  | ||||||
| // |  | ||||||
| // The go-ethereum library is free software: you can redistribute it and/or modify |  | ||||||
| // it under the terms of the GNU Lesser General Public License as published by |  | ||||||
| // the Free Software Foundation, either version 3 of the License, or |  | ||||||
| // (at your option) any later version. |  | ||||||
| // |  | ||||||
| // The go-ethereum library is distributed in the hope that it will be useful, |  | ||||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |  | ||||||
| // GNU Lesser General Public License for more details. |  | ||||||
| // |  | ||||||
| // You should have received a copy of the GNU Lesser General Public License |  | ||||||
| // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. |  | ||||||
|  |  | ||||||
| package httpclient |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"io/ioutil" |  | ||||||
| 	"net/http" |  | ||||||
| 	"os" |  | ||||||
| 	"path" |  | ||||||
| 	"testing" |  | ||||||
|  |  | ||||||
| 	"github.com/ethereum/go-ethereum/common" |  | ||||||
| 	"github.com/ethereum/go-ethereum/crypto" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func TestGetAuthContent(t *testing.T) { |  | ||||||
| 	dir, err := ioutil.TempDir("", "httpclient-test") |  | ||||||
| 	if err != nil { |  | ||||||
| 		t.Fatal("cannot create temporary directory:", err) |  | ||||||
| 	} |  | ||||||
| 	defer os.RemoveAll(dir) |  | ||||||
| 	client := New(dir) |  | ||||||
|  |  | ||||||
| 	text := "test" |  | ||||||
| 	hash := crypto.Keccak256Hash([]byte(text)) |  | ||||||
| 	if err := ioutil.WriteFile(path.Join(dir, "test.content"), []byte(text), os.ModePerm); err != nil { |  | ||||||
| 		t.Fatal("could not write test file", err) |  | ||||||
| 	} |  | ||||||
| 	content, err := client.GetAuthContent("file:///test.content", hash) |  | ||||||
| 	if err != nil { |  | ||||||
| 		t.Errorf("no error expected, got %v", err) |  | ||||||
| 	} |  | ||||||
| 	if string(content) != text { |  | ||||||
| 		t.Errorf("incorrect content. expected %v, got %v", text, string(content)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	hash = common.Hash{} |  | ||||||
| 	content, err = client.GetAuthContent("file:///test.content", hash) |  | ||||||
| 	expected := "content hash mismatch 0000000000000000000000000000000000000000000000000000000000000000 != 9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658 (exp)" |  | ||||||
| 	if err == nil { |  | ||||||
| 		t.Errorf("expected error, got nothing") |  | ||||||
| 	} else { |  | ||||||
| 		if err.Error() != expected { |  | ||||||
| 			t.Errorf("expected error '%s' got '%v'", expected, err) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type rt struct{} |  | ||||||
|  |  | ||||||
| func (rt) RoundTrip(req *http.Request) (resp *http.Response, err error) { return } |  | ||||||
|  |  | ||||||
| func TestRegisterScheme(t *testing.T) { |  | ||||||
| 	client := New("/tmp/") |  | ||||||
| 	if client.HasScheme("scheme") { |  | ||||||
| 		t.Errorf("expected scheme not to be registered") |  | ||||||
| 	} |  | ||||||
| 	client.RegisterScheme("scheme", rt{}) |  | ||||||
| 	if !client.HasScheme("scheme") { |  | ||||||
| 		t.Errorf("expected scheme to be registered") |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @@ -26,7 +26,6 @@ import ( | |||||||
| 	"github.com/ethereum/go-ethereum/accounts" | 	"github.com/ethereum/go-ethereum/accounts" | ||||||
| 	"github.com/ethereum/go-ethereum/common" | 	"github.com/ethereum/go-ethereum/common" | ||||||
| 	"github.com/ethereum/go-ethereum/common/compiler" | 	"github.com/ethereum/go-ethereum/common/compiler" | ||||||
| 	"github.com/ethereum/go-ethereum/common/httpclient" |  | ||||||
| 	"github.com/ethereum/go-ethereum/core" | 	"github.com/ethereum/go-ethereum/core" | ||||||
| 	"github.com/ethereum/go-ethereum/core/types" | 	"github.com/ethereum/go-ethereum/core/types" | ||||||
| 	"github.com/ethereum/go-ethereum/eth" | 	"github.com/ethereum/go-ethereum/eth" | ||||||
| @@ -62,7 +61,6 @@ type LightEthereum struct { | |||||||
|  |  | ||||||
| 	eventMux       *event.TypeMux | 	eventMux       *event.TypeMux | ||||||
| 	pow            *ethash.Ethash | 	pow            *ethash.Ethash | ||||||
| 	httpclient     *httpclient.HTTPClient |  | ||||||
| 	accountManager *accounts.Manager | 	accountManager *accounts.Manager | ||||||
| 	solcPath       string | 	solcPath       string | ||||||
| 	solc           *compiler.Solidity | 	solc           *compiler.Solidity | ||||||
| @@ -96,7 +94,6 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { | |||||||
| 		accountManager: ctx.AccountManager, | 		accountManager: ctx.AccountManager, | ||||||
| 		pow:            pow, | 		pow:            pow, | ||||||
| 		shutdownChan:   make(chan bool), | 		shutdownChan:   make(chan bool), | ||||||
| 		httpclient:     httpclient.New(config.DocRoot), |  | ||||||
| 		netVersionId:   config.NetworkId, | 		netVersionId:   config.NetworkId, | ||||||
| 		NatSpec:        config.NatSpec, | 		NatSpec:        config.NatSpec, | ||||||
| 		PowTest:        config.PowTest, | 		PowTest:        config.PowTest, | ||||||
|   | |||||||
| @@ -22,8 +22,6 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/ethereum/go-ethereum/common/httpclient" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const port = "3222" | const port = "3222" | ||||||
| @@ -41,10 +39,10 @@ func TestRoundTripper(t *testing.T) { | |||||||
| 	go http.ListenAndServe(":"+port, serveMux) | 	go http.ListenAndServe(":"+port, serveMux) | ||||||
|  |  | ||||||
| 	rt := &RoundTripper{Port: port} | 	rt := &RoundTripper{Port: port} | ||||||
| 	client := httpclient.New("/") | 	trans := &http.Transport{} | ||||||
| 	client.RegisterProtocol("bzz", rt) | 	trans.RegisterProtocol("bzz", rt) | ||||||
|  | 	client := &http.Client{Transport: trans} | ||||||
| 	resp, err := client.Client().Get("bzz://test.com/path") | 	resp, err := client.Get("bzz://test.com/path") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("expected no error, got %v", err) | 		t.Errorf("expected no error, got %v", err) | ||||||
| 		return | 		return | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user