|  |  | @ -282,7 +282,7 @@ func cmdRun(fl Flags) (int, error) { | 
			
		
	
		
			
				
					|  |  |  | func cmdStop(fl Flags) (int, error) { | 
			
		
	
		
			
				
					|  |  |  | 	stopCmdAddrFlag := fl.String("address") | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 	err := apiRequest(stopCmdAddrFlag, http.MethodPost, "/stop", nil) | 
			
		
	
		
			
				
					|  |  |  | 	err := apiRequest(stopCmdAddrFlag, http.MethodPost, "/stop", nil, nil) | 
			
		
	
		
			
				
					|  |  |  | 	if err != nil { | 
			
		
	
		
			
				
					|  |  |  | 		caddy.Log().Warn("failed using API to stop instance", zap.Error(err)) | 
			
		
	
		
			
				
					|  |  |  | 		return caddy.ExitCodeFailedStartup, err | 
			
		
	
	
		
			
				
					|  |  | @ -295,6 +295,7 @@ func cmdReload(fl Flags) (int, error) { | 
			
		
	
		
			
				
					|  |  |  | 	reloadCmdConfigFlag := fl.String("config") | 
			
		
	
		
			
				
					|  |  |  | 	reloadCmdConfigAdapterFlag := fl.String("adapter") | 
			
		
	
		
			
				
					|  |  |  | 	reloadCmdAddrFlag := fl.String("address") | 
			
		
	
		
			
				
					|  |  |  | 	reloadCmdForceFlag := fl.Bool("force") | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 	if err := NotifyReloading(); err != nil { | 
			
		
	
		
			
				
					|  |  |  | 		caddy.Log().Error("unable to notify reloading to service manager", zap.Error(err)) | 
			
		
	
	
		
			
				
					|  |  | @ -328,7 +329,13 @@ func cmdReload(fl Flags) (int, error) { | 
			
		
	
		
			
				
					|  |  |  | 		adminAddr = tmpStruct.Admin.Listen | 
			
		
	
		
			
				
					|  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 	err = apiRequest(adminAddr, http.MethodPost, "/load", bytes.NewReader(config)) | 
			
		
	
		
			
				
					|  |  |  | 	// optionally force a config reload
 | 
			
		
	
		
			
				
					|  |  |  | 	headers := make(http.Header) | 
			
		
	
		
			
				
					|  |  |  | 	if reloadCmdForceFlag { | 
			
		
	
		
			
				
					|  |  |  | 		headers.Set("Cache-Control", "must-revalidate") | 
			
		
	
		
			
				
					|  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 	err = apiRequest(adminAddr, http.MethodPost, "/load", headers, bytes.NewReader(config)) | 
			
		
	
		
			
				
					|  |  |  | 	if err != nil { | 
			
		
	
		
			
				
					|  |  |  | 		return caddy.ExitCodeFailedStartup, fmt.Errorf("sending configuration to instance: %v", err) | 
			
		
	
		
			
				
					|  |  |  | 	} | 
			
		
	
	
		
			
				
					|  |  | @ -827,7 +834,7 @@ func getModules() (standard, nonstandard, unknown []moduleInfo, err error) { | 
			
		
	
		
			
				
					|  |  |  | // apiRequest makes an API request to the endpoint adminAddr with the
 | 
			
		
	
		
			
				
					|  |  |  | // given HTTP method and request URI. If body is non-nil, it will be
 | 
			
		
	
		
			
				
					|  |  |  | // assumed to be Content-Type application/json.
 | 
			
		
	
		
			
				
					|  |  |  | func apiRequest(adminAddr, method, uri string, body io.Reader) error { | 
			
		
	
		
			
				
					|  |  |  | func apiRequest(adminAddr, method, uri string, headers http.Header, body io.Reader) error { | 
			
		
	
		
			
				
					|  |  |  | 	// parse the admin address
 | 
			
		
	
		
			
				
					|  |  |  | 	if adminAddr == "" { | 
			
		
	
		
			
				
					|  |  |  | 		adminAddr = caddy.DefaultAdminListen | 
			
		
	
	
		
			
				
					|  |  | @ -867,6 +874,9 @@ func apiRequest(adminAddr, method, uri string, body io.Reader) error { | 
			
		
	
		
			
				
					|  |  |  | 	if body != nil { | 
			
		
	
		
			
				
					|  |  |  | 		req.Header.Set("Content-Type", "application/json") | 
			
		
	
		
			
				
					|  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  | 	for k, v := range headers { | 
			
		
	
		
			
				
					|  |  |  | 		req.Header[k] = v | 
			
		
	
		
			
				
					|  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | 	// make an HTTP client that dials our network type, since admin
 | 
			
		
	
		
			
				
					|  |  |  | 	// endpoints aren't always TCP, which is what the default transport
 | 
			
		
	
	
		
			
				
					|  |  | 
 |