github.com/vicanso/pike@v1.0.1-0.20210630235453-9099e041f6ec/server/responder.go (about)

     1  // MIT License
     2  
     3  // Copyright (c) 2020 Tree Xie
     4  
     5  // Permission is hereby granted, free of charge, to any person obtaining a copy
     6  // of this software and associated documentation files (the "Software"), to deal
     7  // in the Software without restriction, including without limitation the rights
     8  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     9  // copies of the Software, and to permit persons to whom the Software is
    10  // furnished to do so, subject to the following conditions:
    11  
    12  // The above copyright notice and this permission notice shall be included in all
    13  // copies or substantial portions of the Software.
    14  
    15  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    16  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    17  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    18  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    19  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    20  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    21  // SOFTWARE.
    22  
    23  package server
    24  
    25  import (
    26  	"strconv"
    27  
    28  	"github.com/vicanso/elton"
    29  )
    30  
    31  // NewResponder create a responder middleware
    32  func NewResponder() elton.Handler {
    33  	return func(c *elton.Context) (err error) {
    34  		err = c.Next()
    35  		if err != nil {
    36  			return
    37  		}
    38  		// 从context中读取http response,该数据由cache中间件设置或proxy中间件设置
    39  		httpResp := getHTTPResp(c)
    40  		if httpResp == nil {
    41  			err = ErrInvalidResponse
    42  			return
    43  		}
    44  		err = httpResp.Fill(c)
    45  		if err != nil {
    46  			return
    47  		}
    48  
    49  		// http 响应头放在最后可以覆盖proxy的设置的相同响应头
    50  		// 获取该响应的age,只有从缓存中读取的数据才有age,由cache中间件设置
    51  		age := getHTTPRespAge(c)
    52  		if age > 0 {
    53  			c.SetHeader(headerAge, strconv.Itoa(age))
    54  		}
    55  
    56  		c.SetHeader(headerCacheStatus, getCacheStatus(c).String())
    57  		return
    58  	}
    59  }