client-hello-mirror/response.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
}