From 2c364f3d2fdd83f463cbafa163edc8aab3887f6a Mon Sep 17 00:00:00 2001 From: Tobias Knipping Date: Sun, 24 Jul 2016 16:21:11 +0200 Subject: [PATCH] add support for specifying http-headers and really use Method spezified --- cli/main.go | 7 +++++- example.config.json | 6 +++++ monitor.go | 57 +++++++++++++++++++++++++++------------------ readme.md | 5 ++++ 4 files changed, 51 insertions(+), 24 deletions(-) diff --git a/cli/main.go b/cli/main.go index 35a4c0d..77bcf28 100644 --- a/cli/main.go +++ b/cli/main.go @@ -53,9 +53,14 @@ func main() { wg := &sync.WaitGroup{} for _, mon := range cfg.Monitors { - cfg.Logger.Printf(" Starting %s: %d seconds check interval\n - %v %s (%d second/s timeout)", mon.Name, mon.CheckInterval, mon.Method, mon.URL, mon.HttpTimeout) + cfg.Logger.Printf(" Starting %s: %d seconds check interval - %v %s (%d second/s timeout)", mon.Name, mon.CheckInterval, mon.Method, mon.URL, mon.HttpTimeout) // print features + if len(mon.HttpHeaders) > 0 { + for _, h := range mon.HttpHeaders { + cfg.Logger.Printf(" - Add HTTP-Header '%s' '%s'", h.Name, h.Value) + } + } if mon.ExpectedStatusCode > 0 { cfg.Logger.Printf(" - Expect HTTP %d", mon.ExpectedStatusCode) } diff --git a/example.config.json b/example.config.json index 15d5882..6400991 100644 --- a/example.config.json +++ b/example.config.json @@ -10,6 +10,12 @@ "component_id": 1, "interval": 10, "timeout": 5, + "headers": [ + { + "header": "Authorization", + "value": "Basic " + } + ], "expected_status_code": 200, "strict_tls": true } diff --git a/monitor.go b/monitor.go index 593bf5d..e48006b 100644 --- a/monitor.go +++ b/monitor.go @@ -17,6 +17,11 @@ const DefaultInterval = 60 const DefaultTimeout = 1 const DefaultTimeFormat = "15:04:05 Jan 2 MST" +type HttpHeader struct { + Name string `json:"header"` + Value string `json:"value"` +} + // Monitor data model type Monitor struct { Name string `json:"name"` @@ -25,6 +30,7 @@ type Monitor struct { StrictTLS bool `json:"strict_tls"` CheckInterval time.Duration `json:"interval"` HttpTimeout time.Duration `json:"timeout"` + HttpHeaders []*HttpHeader `json:"headers"` MetricID int `json:"metric_id"` ComponentID int `json:"component_id"` @@ -109,37 +115,42 @@ func (monitor *Monitor) doRequest() bool { } } - resp, err := client.Get(monitor.URL) - if err != nil { - monitor.lastFailReason = err.Error() + req, err := http.NewRequest(monitor.Method, monitor.URL, nil) + for _, h := range monitor.HttpHeaders { + req.Header.Add(h.Name, h.Value) + } - return false - } + resp, err := client.Do(req) + if err != nil { + monitor.lastFailReason = err.Error() - defer resp.Body.Close() + return false + } - if monitor.ExpectedStatusCode > 0 && resp.StatusCode != monitor.ExpectedStatusCode { - monitor.lastFailReason = "Unexpected response code: " + strconv.Itoa(resp.StatusCode) + ". Expected " + strconv.Itoa(monitor.ExpectedStatusCode) + defer resp.Body.Close() - return false - } + if monitor.ExpectedStatusCode > 0 && resp.StatusCode != monitor.ExpectedStatusCode { + monitor.lastFailReason = "Unexpected response code: " + strconv.Itoa(resp.StatusCode) + ". Expected " + strconv.Itoa(monitor.ExpectedStatusCode) - if monitor.bodyRegexp != nil { - // check body - responseBody, err := ioutil.ReadAll(resp.Body) - if err != nil { - monitor.lastFailReason = err.Error() + return false + } - return false - } + if monitor.bodyRegexp != nil { + // check body + responseBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + monitor.lastFailReason = err.Error() - match := monitor.bodyRegexp.Match(responseBody) - if !match { - monitor.lastFailReason = "Unexpected body: " + string(responseBody) + ". Expected to match " + monitor.ExpectedBody - } + return false + } - return match - } + match := monitor.bodyRegexp.Match(responseBody) + if !match { + monitor.lastFailReason = "Unexpected body: " + string(responseBody) + ". Expected to match " + monitor.ExpectedBody + } + + return match + } return true } diff --git a/readme.md b/readme.md index b273079..1ccad03 100644 --- a/readme.md +++ b/readme.md @@ -28,6 +28,11 @@ Configuration "url": "Ping URL", // optional, http method (defaults GET) "method": "get", + // optional, http Headers to add (default none) + "headers": [ + // specify Name and Value of Http-Header, eg. Authorization + { "name": "Authorization", "value": "Basic " } + ], // self-signed ssl certificate "strict_tls": true, // seconds between checks