github.com/oskarth/go-ethereum@v1.6.8-0.20191013093314-dac24a9d3494/swarm/network/simulation/http.go (about)

     1  // Copyright 2018 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package simulation
    18  
    19  import (
    20  	"fmt"
    21  	"net/http"
    22  
    23  	"github.com/ethereum/go-ethereum/log"
    24  	"github.com/ethereum/go-ethereum/p2p/simulations"
    25  )
    26  
    27  // Package defaults.
    28  var (
    29  	DefaultHTTPSimAddr = ":8888"
    30  )
    31  
    32  //WithServer implements the builder pattern constructor for Simulation to
    33  //start with a HTTP server
    34  func (s *Simulation) WithServer(addr string) *Simulation {
    35  	//assign default addr if nothing provided
    36  	if addr == "" {
    37  		addr = DefaultHTTPSimAddr
    38  	}
    39  	log.Info(fmt.Sprintf("Initializing simulation server on %s...", addr))
    40  	//initialize the HTTP server
    41  	s.handler = simulations.NewServer(s.Net)
    42  	s.runC = make(chan struct{})
    43  	//add swarm specific routes to the HTTP server
    44  	s.addSimulationRoutes()
    45  	s.httpSrv = &http.Server{
    46  		Addr:    addr,
    47  		Handler: s.handler,
    48  	}
    49  	go func() {
    50  		err := s.httpSrv.ListenAndServe()
    51  		if err != nil {
    52  			log.Error("Error starting the HTTP server", "error", err)
    53  		}
    54  	}()
    55  	return s
    56  }
    57  
    58  //register additional HTTP routes
    59  func (s *Simulation) addSimulationRoutes() {
    60  	s.handler.POST("/runsim", s.RunSimulation)
    61  }
    62  
    63  // RunSimulation is the actual POST endpoint runner
    64  func (s *Simulation) RunSimulation(w http.ResponseWriter, req *http.Request) {
    65  	log.Debug("RunSimulation endpoint running")
    66  	s.runC <- struct{}{}
    67  	w.WriteHeader(http.StatusOK)
    68  }