go-blog/middleware/xml_handler.go

60 lines
1.3 KiB
Go
Raw Normal View History

2018-07-14 18:02:33 +02:00
package middleware
import (
2018-07-18 23:50:53 +02:00
"bytes"
2018-07-14 18:02:33 +02:00
"encoding/xml"
"net/http"
2020-11-28 16:40:45 +01:00
"git.hoogi.eu/snafu/go-blog/logger"
2020-02-20 23:05:27 +01:00
"git.hoogi.eu/snafu/go-blog/models"
2018-07-14 18:02:33 +02:00
)
// XMLHandler marshals XML and writes to the http response
type XMLHandler struct {
AppCtx *AppContext
Handler XHandler
}
//XNLHandler enriches handler with the AppContext
2018-07-18 23:50:53 +02:00
type XHandler func(*AppContext, http.ResponseWriter, *http.Request) (*models.XMLData, error)
2018-07-14 18:02:33 +02:00
func (fn XMLHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
rw.Header().Set("Content-Type", "application/xml")
h, err := fn.Handler(fn.AppCtx, rw, r)
if err != nil {
logger.Log.Error(err)
2020-12-06 16:04:12 +01:00
xml, err := xml.Marshal(err)
2018-07-14 18:02:33 +02:00
2020-12-06 16:04:12 +01:00
if err != nil {
logger.Log.Error(err)
http.Error(rw, err.Error(), http.StatusInternalServerError)
2018-07-14 18:02:33 +02:00
return
}
2020-12-06 16:04:12 +01:00
rw.Write(xml)
2018-07-14 18:02:33 +02:00
return
}
2020-12-06 16:04:12 +01:00
x, err := xml.MarshalIndent(h.Data, "", "\t")
2018-07-14 18:02:33 +02:00
2020-12-06 16:04:12 +01:00
if err != nil {
http.Error(rw, err.Error(), http.StatusInternalServerError)
2018-07-14 18:02:33 +02:00
return
}
2018-07-18 23:50:53 +02:00
x = []byte(xml.Header + string(x))
if h.HexEncode {
x = bytes.Replace(x, []byte("&"), []byte("&"), -1) // &
x = bytes.Replace(x, []byte("'"), []byte("'"), -1) // '
x = bytes.Replace(x, []byte("""), []byte("""), -1) // "
x = bytes.Replace(x, []byte("&lt;"), []byte("&#x3c;"), -1) // <
x = bytes.Replace(x, []byte("&gt;"), []byte("&#x3e;"), -1) // >
}
2019-03-27 18:07:48 +01:00
2018-07-14 18:02:33 +02:00
rw.Write(x)
}