func (s *RovingServerClient) FetchFuzzerConfig() (*types.FuzzerConfig, error) {
	resp, err := s.makeRequest("GET", "config", nil)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	config := &types.FuzzerConfig{}
	encoder := json.NewDecoder(resp.Body)
	encoder.Decode(config)
	return config, nil
}
FetchFuzzerConfig fetches the target's metadata, including
whether the client should download the target and what command
it should use to run it.
package client
import (
	"bytes"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"net"
	"net/http"
	"os"
	"time"
	"github.com/richo/roving/types"
)
var dialerTimeout time.Duration = 5 * time.Second
var tlsHandshakeTimeout time.Duration = 5 * time.Second
var httpRequestTimeout time.Duration = 10 * time.Second
var retryDelay time.Duration = 5 * time.Second
var maxRetries int = 3
type RovingServerClient struct {
	hostport   string
	httpClient *http.Client
	retryDelay time.Duration
	maxRetries int
}
func NewRovingServerClient(hostport string) *RovingServerClient {
	httpTransport := &http.Transport{
		Dial: (&net.Dialer{
			Timeout: dialerTimeout,
		}).Dial,
		TLSHandshakeTimeout: tlsHandshakeTimeout,
	}
	httpClient := &http.Client{
		Timeout:   httpRequestTimeout,
		Transport: httpTransport,
	}
	return &RovingServerClient{
		hostport:   hostport,
		httpClient: httpClient,
		retryDelay: retryDelay,
		maxRetries: maxRetries,
	}
}