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/common" | ||||
| 	"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/types" | ||||
| 	"github.com/ethereum/go-ethereum/eth" | ||||
| @@ -62,7 +61,6 @@ type LightEthereum struct { | ||||
|  | ||||
| 	eventMux       *event.TypeMux | ||||
| 	pow            *ethash.Ethash | ||||
| 	httpclient     *httpclient.HTTPClient | ||||
| 	accountManager *accounts.Manager | ||||
| 	solcPath       string | ||||
| 	solc           *compiler.Solidity | ||||
| @@ -96,7 +94,6 @@ func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { | ||||
| 		accountManager: ctx.AccountManager, | ||||
| 		pow:            pow, | ||||
| 		shutdownChan:   make(chan bool), | ||||
| 		httpclient:     httpclient.New(config.DocRoot), | ||||
| 		netVersionId:   config.NetworkId, | ||||
| 		NatSpec:        config.NatSpec, | ||||
| 		PowTest:        config.PowTest, | ||||
|   | ||||
| @@ -22,8 +22,6 @@ import ( | ||||
| 	"strings" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/ethereum/go-ethereum/common/httpclient" | ||||
| ) | ||||
|  | ||||
| const port = "3222" | ||||
| @@ -41,10 +39,10 @@ func TestRoundTripper(t *testing.T) { | ||||
| 	go http.ListenAndServe(":"+port, serveMux) | ||||
|  | ||||
| 	rt := &RoundTripper{Port: port} | ||||
| 	client := httpclient.New("/") | ||||
| 	client.RegisterProtocol("bzz", rt) | ||||
|  | ||||
| 	resp, err := client.Client().Get("bzz://test.com/path") | ||||
| 	trans := &http.Transport{} | ||||
| 	trans.RegisterProtocol("bzz", rt) | ||||
| 	client := &http.Client{Transport: trans} | ||||
| 	resp, err := client.Get("bzz://test.com/path") | ||||
| 	if err != nil { | ||||
| 		t.Errorf("expected no error, got %v", err) | ||||
| 		return | ||||
|   | ||||
		Reference in New Issue
	
	Block a user