56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
// SPDX-FileCopyrightText: 2022-2023 nervuri <https://nervuri.net/contact>
|
|
//
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type response struct {
|
|
req *request
|
|
StatusLine string
|
|
Headers map[string]string
|
|
Body string
|
|
}
|
|
|
|
func NewResponse(req *request) response {
|
|
var r = response{
|
|
req: req,
|
|
Headers: make(map[string]string),
|
|
}
|
|
if r.req.Protocol == httpProtocol {
|
|
r.StatusLine = "HTTP/1.1 200 OK"
|
|
r.Headers["Content-Type"] = "text/html; charset=utf-8"
|
|
} else if r.req.Protocol == geminiProtocol {
|
|
r.StatusLine = "20 text/gemini"
|
|
}
|
|
return r
|
|
}
|
|
|
|
func (r *response) DisableCaching() {
|
|
r.Headers["Cache-Control"] = "no-store"
|
|
r.Headers["Vary"] = "*"
|
|
}
|
|
|
|
func (r *response) Prepare() []byte {
|
|
var responseBytes = []byte(r.StatusLine + "\r\n")
|
|
if r.req.Protocol == httpProtocol {
|
|
t := time.Now().UTC()
|
|
r.Headers["Date"] = strings.Replace(t.Format(time.RFC1123), "UTC", "GMT", 1)
|
|
r.Headers["Content-Length"] = fmt.Sprint(len(r.Body))
|
|
r.Headers["Connection"] = "close"
|
|
for name, value := range r.Headers {
|
|
responseBytes = append(responseBytes, []byte(name+": "+value+"\r\n")...)
|
|
}
|
|
responseBytes = append(responseBytes, []byte("\r\n")...) // end of headers
|
|
}
|
|
if r.req.HTTPMethod != headMethod {
|
|
responseBytes = append(responseBytes, []byte(r.Body)...)
|
|
}
|
|
return responseBytes
|
|
}
|