From 5b0ea1044ab7c14e11489bc6c612bb7f2e5a023e Mon Sep 17 00:00:00 2001 From: zelig Date: Tue, 31 Mar 2015 16:02:35 +0100 Subject: add docserver using net/http Transport/Roundtrip --- common/docserver/docserver.go | 93 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 common/docserver/docserver.go (limited to 'common/docserver/docserver.go') diff --git a/common/docserver/docserver.go b/common/docserver/docserver.go new file mode 100644 index 000000000..5d37ac97c --- /dev/null +++ b/common/docserver/docserver.go @@ -0,0 +1,93 @@ +package docserver + +import ( + "fmt" + "io/ioutil" + "net/http" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +// http://golang.org/pkg/net/http/#RoundTripper +var ( + schemes = map[string]func(*DocServer) http.RoundTripper{ + // Simple File server from local disk file:///etc/passwd :) + "file": fileServerOnDocRoot, + + // Swarm RoundTripper for bzz scheme bzz://mydomain/contact/twitter.json + // "bzz": &bzz.FileServer{}, + + // swarm remote file system call bzzfs:///etc/passwd + // "bzzfs": &bzzfs.FileServer{}, + + // restful peer protocol RoundTripper for enode scheme: + // POST suggestPeer DELETE removePeer PUT switch protocols + // RPC - standard protocol provides arc API for self enode (very safe remote server only connects to registered enode) + // POST enode://ae234dfgc56b..@128.56.68.5:3456/eth/getBlock/356eac67890fe + // and remote peer protocol + // POST enode://ae234dfgc56b..@128.56.68.5:3456/eth/getBlock/356eac67890fe + // proxy protoocol + + } +) + +func fileServerOnDocRoot(ds *DocServer) http.RoundTripper { + return http.NewFileTransport(http.Dir(ds.DocRoot)) +} + +type DocServer struct { + *http.Transport + DocRoot string +} + +func New(docRoot string) (self *DocServer, err error) { + self = &DocServer{ + Transport: &http.Transport{}, + DocRoot: docRoot, + } + err = self.RegisterProtocols(schemes) + 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 *DocServer) Client() *http.Client { + return &http.Client{ + Transport: self, + } +} + +func (self *DocServer) RegisterProtocols(schemes map[string]func(*DocServer) http.RoundTripper) (err error) { + for scheme, rtf := range schemes { + self.RegisterProtocol(scheme, rtf(self)) + } + return +} + +func (self *DocServer) GetAuthContent(uri string, hash common.Hash) (content []byte, err error) { + // retrieve content + resp, err := self.Client().Get(uri) + defer resp.Body.Close() + if err != nil { + return + } + content, err = ioutil.ReadAll(resp.Body) + if err != nil { + return + } + + // check hash to authenticate content + hashbytes := crypto.Sha3(content) + var chash common.Hash + copy(chash[:], hashbytes) + if chash != hash { + content = nil + err = fmt.Errorf("content hash mismatch") + } + + return + +} -- cgit v1.2.3 From 3a540425a3d7fc29233b5cd3e7b79b4866f35d57 Mon Sep 17 00:00:00 2001 From: zelig Date: Tue, 31 Mar 2015 16:02:55 +0100 Subject: reorg: - statereg methods move to natspec/resolver/docserver - fix failing test on invalid js input --- common/docserver/docserver.go | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'common/docserver/docserver.go') diff --git a/common/docserver/docserver.go b/common/docserver/docserver.go index 5d37ac97c..8e943c186 100644 --- a/common/docserver/docserver.go +++ b/common/docserver/docserver.go @@ -14,21 +14,6 @@ var ( schemes = map[string]func(*DocServer) http.RoundTripper{ // Simple File server from local disk file:///etc/passwd :) "file": fileServerOnDocRoot, - - // Swarm RoundTripper for bzz scheme bzz://mydomain/contact/twitter.json - // "bzz": &bzz.FileServer{}, - - // swarm remote file system call bzzfs:///etc/passwd - // "bzzfs": &bzzfs.FileServer{}, - - // restful peer protocol RoundTripper for enode scheme: - // POST suggestPeer DELETE removePeer PUT switch protocols - // RPC - standard protocol provides arc API for self enode (very safe remote server only connects to registered enode) - // POST enode://ae234dfgc56b..@128.56.68.5:3456/eth/getBlock/356eac67890fe - // and remote peer protocol - // POST enode://ae234dfgc56b..@128.56.68.5:3456/eth/getBlock/356eac67890fe - // proxy protoocol - } ) -- cgit v1.2.3 From 94489b2269133c545aa3e9580737b2bd93f3ead0 Mon Sep 17 00:00:00 2001 From: zsfelfoldi Date: Mon, 6 Apr 2015 08:01:36 +0200 Subject: s --- common/docserver/docserver.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'common/docserver/docserver.go') diff --git a/common/docserver/docserver.go b/common/docserver/docserver.go index 8e943c186..5e076aa7e 100644 --- a/common/docserver/docserver.go +++ b/common/docserver/docserver.go @@ -55,7 +55,11 @@ func (self *DocServer) RegisterProtocols(schemes map[string]func(*DocServer) htt func (self *DocServer) GetAuthContent(uri string, hash common.Hash) (content []byte, err error) { // retrieve content resp, err := self.Client().Get(uri) - defer resp.Body.Close() + defer func() { + if resp != nil { + resp.Body.Close() + } + }() if err != nil { return } -- cgit v1.2.3