mirror of
https://github.com/projectdiscovery/httpx
synced 2026-06-08 16:50:17 +00:00
d2742ae00c
* feat: add `*Server.Stop` method Signed-off-by: Dwi Siswanto <git@dw1.io> * feat: implement `*Server.Stop` Signed-off-by: Dwi Siswanto <git@dw1.io> --------- Signed-off-by: Dwi Siswanto <git@dw1.io>
94 lines
2.2 KiB
Go
94 lines
2.2 KiB
Go
// TODO: move this to internal package
|
|
package runner
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"encoding/json"
|
|
"net/http"
|
|
)
|
|
|
|
type Concurrency struct {
|
|
Threads int `json:"threads"`
|
|
}
|
|
|
|
// Server represents the HTTP server that handles the concurrency settings endpoints.
|
|
type Server struct {
|
|
addr string
|
|
config *Options
|
|
httpServer *http.Server
|
|
}
|
|
|
|
// New creates a new instance of Server.
|
|
func NewServer(addr string, config *Options) *Server {
|
|
return &Server{
|
|
addr: addr,
|
|
config: config,
|
|
}
|
|
}
|
|
|
|
// Start initializes the server and its routes, then starts listening on the specified address.
|
|
func (s *Server) Start() error {
|
|
mux := http.NewServeMux()
|
|
mux.HandleFunc("/api/concurrency", s.handleConcurrency)
|
|
|
|
s.httpServer = &http.Server{
|
|
Addr: s.addr,
|
|
Handler: mux,
|
|
}
|
|
|
|
if err := s.httpServer.ListenAndServe(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// handleConcurrency routes the request based on its method to the appropriate handler.
|
|
func (s *Server) handleConcurrency(w http.ResponseWriter, r *http.Request) {
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
s.getSettings(w, r)
|
|
case http.MethodPut:
|
|
s.updateSettings(w, r)
|
|
default:
|
|
http.Error(w, "Unsupported HTTP method", http.StatusMethodNotAllowed)
|
|
}
|
|
}
|
|
|
|
// GetSettings handles GET requests and returns the current concurrency settings
|
|
func (s *Server) getSettings(w http.ResponseWriter, _ *http.Request) {
|
|
concurrencySettings := Concurrency{
|
|
Threads: s.config.Threads,
|
|
}
|
|
w.Header().Set("Content-Type", "application/json")
|
|
if err := json.NewEncoder(w).Encode(concurrencySettings); err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
}
|
|
|
|
// UpdateSettings handles PUT requests to update the concurrency settings
|
|
func (s *Server) updateSettings(w http.ResponseWriter, r *http.Request) {
|
|
var newSettings Concurrency
|
|
if err := json.NewDecoder(r.Body).Decode(&newSettings); err != nil {
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
if newSettings.Threads > 0 {
|
|
s.config.Threads = newSettings.Threads
|
|
}
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
}
|
|
|
|
// Stop gracefully shuts down the server.
|
|
func (s *Server) Stop() error {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
return s.httpServer.Shutdown(ctx)
|
|
}
|