Add headers parameter for HTTP checker
Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>master
							parent
							
								
									e8f088fea6
								
							
						
					
					
						commit
						b67aab2f60
					
				|  | @ -202,6 +202,8 @@ type HTTPChecker struct { | |||
| 	Interval time.Duration `yaml:"interval,omitempty"` | ||||
| 	// URI is the HTTP URI to check
 | ||||
| 	URI string `yaml:"uri,omitempty"` | ||||
| 	// Headers lists static headers that should be added to all requests
 | ||||
| 	Headers http.Header `yaml:"headers"` | ||||
| 	// Threshold is the number of times a check must fail to trigger an
 | ||||
| 	// unhealthy state
 | ||||
| 	Threshold int `yaml:"threshold,omitempty"` | ||||
|  |  | |||
|  | @ -205,6 +205,8 @@ information about each option that appears later in this page. | |||
|           interval: 10s | ||||
|       http: | ||||
|         - uri: http://server.to.check/must/return/200 | ||||
|           headers: | ||||
|             Authorization: [Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==] | ||||
|           statuscode: 200 | ||||
|           timeout: 3s | ||||
|           interval: 10s | ||||
|  | @ -1400,7 +1402,9 @@ The URL to which events should be published. | |||
|       yes | ||||
|     </td> | ||||
|     <td> | ||||
|       Static headers to add to each request. | ||||
|       Static headers to add to each request. Each header's name should be a key | ||||
|       underneath headers, and each value is a list of payloads for that | ||||
|       header name. Note that values must always be lists. | ||||
|     </td> | ||||
|   </tr> | ||||
|   <tr> | ||||
|  | @ -1619,6 +1623,8 @@ Configure the behavior of the Redis connection pool. | |||
|           interval: 10s | ||||
|       http: | ||||
|         - uri: http://server.to.check/must/return/200 | ||||
|           headers: | ||||
|             Authorization: [Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==] | ||||
|           statuscode: 200 | ||||
|           timeout: 3s | ||||
|           interval: 10s | ||||
|  | @ -1766,6 +1772,19 @@ health check will fail. | |||
|     <td> | ||||
| The URI to check. | ||||
| </td> | ||||
|   </tr> | ||||
|    <tr> | ||||
|     <td> | ||||
|       <code>headers</code> | ||||
|     </td> | ||||
|     <td> | ||||
|       no | ||||
|     </td> | ||||
|     <td> | ||||
|       Static headers to add to each request. Each header's name should be a key | ||||
|       underneath headers, and each value is a list of payloads for that | ||||
|       header name. Note that values must always be lists. | ||||
|     </td> | ||||
|   </tr> | ||||
|   <tr> | ||||
|     <td> | ||||
|  |  | |||
|  | @ -24,12 +24,21 @@ func FileChecker(f string) health.Checker { | |||
| 
 | ||||
| // HTTPChecker does a HEAD request and verifies that the HTTP status code
 | ||||
| // returned matches statusCode.
 | ||||
| func HTTPChecker(r string, statusCode int, timeout time.Duration) health.Checker { | ||||
| func HTTPChecker(r string, statusCode int, timeout time.Duration, headers http.Header) health.Checker { | ||||
| 	return health.CheckFunc(func() error { | ||||
| 		client := http.Client{ | ||||
| 			Timeout: timeout, | ||||
| 		} | ||||
| 		response, err := client.Head(r) | ||||
| 		req, err := http.NewRequest("HEAD", r, nil) | ||||
| 		if err != nil { | ||||
| 			return errors.New("error creating request: " + r) | ||||
| 		} | ||||
| 		for headerName, headerValues := range headers { | ||||
| 			for _, headerValue := range headerValues { | ||||
| 				req.Header.Add(headerName, headerValue) | ||||
| 			} | ||||
| 		} | ||||
| 		response, err := client.Do(req) | ||||
| 		if err != nil { | ||||
| 			return errors.New("error while checking: " + r) | ||||
| 		} | ||||
|  |  | |||
|  | @ -15,11 +15,11 @@ func TestFileChecker(t *testing.T) { | |||
| } | ||||
| 
 | ||||
| func TestHTTPChecker(t *testing.T) { | ||||
| 	if err := HTTPChecker("https://www.google.cybertron", 200, 0).Check(); err == nil { | ||||
| 	if err := HTTPChecker("https://www.google.cybertron", 200, 0, nil).Check(); err == nil { | ||||
| 		t.Errorf("Google on Cybertron was expected as not exists") | ||||
| 	} | ||||
| 
 | ||||
| 	if err := HTTPChecker("https://www.google.pt", 200, 0).Check(); err != nil { | ||||
| 	if err := HTTPChecker("https://www.google.pt", 200, 0, nil).Check(); err != nil { | ||||
| 		t.Errorf("Google at Portugal was expected as exists, error:%v", err) | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -281,7 +281,7 @@ func (app *App) RegisterHealthChecks(healthRegistries ...*health.Registry) { | |||
| 			statusCode = 200 | ||||
| 		} | ||||
| 
 | ||||
| 		checker := checks.HTTPChecker(httpChecker.URI, statusCode, httpChecker.Timeout) | ||||
| 		checker := checks.HTTPChecker(httpChecker.URI, statusCode, httpChecker.Timeout, httpChecker.Headers) | ||||
| 
 | ||||
| 		if httpChecker.Threshold != 0 { | ||||
| 			ctxu.GetLogger(app).Infof("configuring HTTP health check uri=%s, interval=%d, threshold=%d", httpChecker.URI, interval/time.Second, httpChecker.Threshold) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue