64d10c0872
* swarm/storage/mock: implement listings methods for mem and rpc stores * swarm/storage/mock/rpc: add comments and newTestStore helper function * swarm/storage/mock/mem: add missing comments * swarm/storage/mock: add comments to new types and constants * swarm/storage/mock/db: implement listings for mock/db global store * swarm/storage/mock/test: add comments for MockStoreListings * swarm/storage/mock/explorer: initial implementation * cmd/swarm/global-store: add chunk explorer * cmd/swarm/global-store: add chunk explorer tests * swarm/storage/mock/explorer: add tests * swarm/storage/mock/explorer: add swagger api definition * swarm/storage/mock/explorer: not-zero test values for invalid addr and key * swarm/storage/mock/explorer: test wildcard cors origin * swarm/storage/mock/db: renames based on Fabio's suggestions * swarm/storage/mock/explorer: add more comments to testHandler function * cmd/swarm/global-store: terminate subprocess with Kill in tests
67 lines
2.1 KiB
Go
67 lines
2.1 KiB
Go
// Copyright 2019 The go-ethereum Authors
|
|
// This file is part of go-ethereum.
|
|
//
|
|
// go-ethereum is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// go-ethereum 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 General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
"github.com/ethereum/go-ethereum/swarm/storage/mock"
|
|
"github.com/ethereum/go-ethereum/swarm/storage/mock/explorer"
|
|
cli "gopkg.in/urfave/cli.v1"
|
|
)
|
|
|
|
// serveChunkExplorer starts an http server in background with chunk explorer handler
|
|
// using the provided global store. Server is started if the returned shutdown function
|
|
// is not nil.
|
|
func serveChunkExplorer(ctx *cli.Context, globalStore mock.GlobalStorer) (shutdown func(), err error) {
|
|
if !ctx.IsSet("explorer-address") {
|
|
return nil, nil
|
|
}
|
|
|
|
corsOrigins := ctx.StringSlice("explorer-cors-origin")
|
|
server := &http.Server{
|
|
Handler: explorer.NewHandler(globalStore, corsOrigins),
|
|
IdleTimeout: 30 * time.Minute,
|
|
ReadTimeout: 2 * time.Minute,
|
|
WriteTimeout: 2 * time.Minute,
|
|
}
|
|
listener, err := net.Listen("tcp", ctx.String("explorer-address"))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("explorer: %v", err)
|
|
}
|
|
log.Info("chunk explorer http", "address", listener.Addr().String(), "origins", corsOrigins)
|
|
|
|
go func() {
|
|
if err := server.Serve(listener); err != nil {
|
|
log.Error("chunk explorer", "err", err)
|
|
}
|
|
}()
|
|
|
|
return func() {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
if err := server.Shutdown(ctx); err != nil {
|
|
log.Error("chunk explorer: shutdown", "err", err)
|
|
}
|
|
}, nil
|
|
}
|