mirror of
				https://github.com/caddyserver/caddy.git
				synced 2025-10-31 10:37:24 -04:00 
			
		
		
		
	I am not a lawyer, but according to the appendix of the license, these boilerplate notices should be included with every source file.
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2015 Light Code Labs, LLC
 | |
| //
 | |
| // Licensed under the Apache License, Version 2.0 (the "License");
 | |
| // you may not use this file except in compliance with the License.
 | |
| // You may obtain a copy of the License at
 | |
| //
 | |
| //     http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing, software
 | |
| // distributed under the License is distributed on an "AS IS" BASIS,
 | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| // See the License for the specific language governing permissions and
 | |
| // limitations under the License.
 | |
| 
 | |
| // Package status is middleware for returning status code for requests
 | |
| package status
 | |
| 
 | |
| import (
 | |
| 	"net/http"
 | |
| 
 | |
| 	"github.com/mholt/caddy/caddyhttp/httpserver"
 | |
| )
 | |
| 
 | |
| // Rule describes status rewriting rule
 | |
| type Rule struct {
 | |
| 	// Base path. Request to this path and sub-paths will be answered with StatusCode
 | |
| 	Base string
 | |
| 
 | |
| 	// Status code to return
 | |
| 	StatusCode int
 | |
| 
 | |
| 	// Request matcher
 | |
| 	httpserver.RequestMatcher
 | |
| }
 | |
| 
 | |
| // NewRule creates new Rule.
 | |
| func NewRule(basePath string, status int) *Rule {
 | |
| 	return &Rule{
 | |
| 		Base:           basePath,
 | |
| 		StatusCode:     status,
 | |
| 		RequestMatcher: httpserver.PathMatcher(basePath),
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // BasePath implements httpserver.HandlerConfig interface
 | |
| func (rule *Rule) BasePath() string {
 | |
| 	return rule.Base
 | |
| }
 | |
| 
 | |
| // Status is a middleware to return status code for request
 | |
| type Status struct {
 | |
| 	Rules []httpserver.HandlerConfig
 | |
| 	Next  httpserver.Handler
 | |
| }
 | |
| 
 | |
| // ServeHTTP implements the httpserver.Handler interface
 | |
| func (status Status) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
 | |
| 	if cfg := httpserver.ConfigSelector(status.Rules).Select(r); cfg != nil {
 | |
| 		rule := cfg.(*Rule)
 | |
| 
 | |
| 		if rule.StatusCode < 400 {
 | |
| 			// There's no ability to return response body --
 | |
| 			// write the response status code in header and signal
 | |
| 			// to other handlers that response is already handled
 | |
| 			w.WriteHeader(rule.StatusCode)
 | |
| 			return 0, nil
 | |
| 		}
 | |
| 
 | |
| 		return rule.StatusCode, nil
 | |
| 	}
 | |
| 
 | |
| 	return status.Next.ServeHTTP(w, r)
 | |
| }
 |