in images/custom-error-pages/rootfs/main.go [100:184]
func errorHandler(path, defaultFormat string) func(http.ResponseWriter, *http.Request) {
defaultExts, err := mime.ExtensionsByType(defaultFormat)
if err != nil || len(defaultExts) == 0 {
panic("couldn't get file extension for default format")
}
defaultExt := defaultExts[0]
return func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
ext := defaultExt
if os.Getenv("DEBUG") != "" {
w.Header().Set(FormatHeader, r.Header.Get(FormatHeader))
w.Header().Set(CodeHeader, r.Header.Get(CodeHeader))
w.Header().Set(ContentType, r.Header.Get(ContentType))
w.Header().Set(OriginalURI, r.Header.Get(OriginalURI))
w.Header().Set(Namespace, r.Header.Get(Namespace))
w.Header().Set(IngressName, r.Header.Get(IngressName))
w.Header().Set(ServiceName, r.Header.Get(ServiceName))
w.Header().Set(ServicePort, r.Header.Get(ServicePort))
w.Header().Set(RequestId, r.Header.Get(RequestId))
}
format := r.Header.Get(FormatHeader)
if format == "" {
format = defaultFormat
log.Printf("format not specified. Using %v", format)
}
cext, err := mime.ExtensionsByType(format)
if err != nil {
log.Printf("unexpected error reading media type extension: %v. Using %v", err, ext)
format = defaultFormat
} else if len(cext) == 0 {
log.Printf("couldn't get media type extension. Using %v", ext)
} else {
ext = cext[0]
}
w.Header().Set(ContentType, format)
errCode := r.Header.Get(CodeHeader)
code, err := strconv.Atoi(errCode)
if err != nil {
code = 404
log.Printf("unexpected error reading return code: %v. Using %v", err, code)
}
w.WriteHeader(code)
if !strings.HasPrefix(ext, ".") {
ext = "." + ext
}
// special case for compatibility
if ext == ".htm" {
ext = ".html"
}
file := fmt.Sprintf("%v/%v%v", path, code, ext)
f, err := os.Open(file)
if err != nil {
log.Printf("unexpected error opening file: %v", err)
scode := strconv.Itoa(code)
file := fmt.Sprintf("%v/%cxx%v", path, scode[0], ext)
f, err := os.Open(file)
if err != nil {
log.Printf("unexpected error opening file: %v", err)
http.NotFound(w, r)
return
}
defer f.Close()
log.Printf("serving custom error response for code %v and format %v from file %v", code, format, file)
io.Copy(w, f)
return
}
defer f.Close()
log.Printf("serving custom error response for code %v and format %v from file %v", code, format, file)
io.Copy(w, f)
duration := time.Now().Sub(start).Seconds()
proto := strconv.Itoa(r.ProtoMajor)
proto = fmt.Sprintf("%s.%s", proto, strconv.Itoa(r.ProtoMinor))
requestCount.WithLabelValues(proto).Inc()
requestDuration.WithLabelValues(proto).Observe(duration)
}
}