Files
newsgo/server/serve.go

79 lines
1.6 KiB
Go
Raw Normal View History

2022-12-06 20:20:27 +00:00
package newsserver
import (
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
2022-12-06 20:22:14 +00:00
stats "i2pgit.org/idk/newsgo/server/stats"
2022-12-06 20:20:27 +00:00
)
type NewsServer struct {
NewsDir string
2022-12-06 20:22:14 +00:00
stats.Stats NewsStats
2022-12-06 20:20:27 +00:00
}
var serveTest http.Handler = &NewsServer{}
func (n *NewsServer) ServeHTTP(rw http.ResponseWriter, rq *http.Request) {
path := rq.URL.Path
file := filepath.Join(n.NewsDir, path)
if err := fileCheck(file); err != nil {
rw.WriteHeader(404)
return
}
if err := ServeFile(file, rw); err != nil {
rw.WriteHeader(404)
}
}
func fileCheck(file string) error {
if _, err := os.Stat(file); err != nil {
return fmt.Errorf("fileCheck: %s", err)
}
return nil
}
func fileType(file string) (string, error) {
base := filepath.Base(file)
if base == "" {
return "", fmt.Errorf("fileType: Invalid file path passed to type determinator")
}
extension := filepath.Ext(base)
switch extension {
case ".su3":
return "application/x-i2p-su3-news", nil
case ".html":
return "text/html", nil
case ".xml":
return "application/rss+xml", nil
case ".atom.xml":
return "application/rss+xml", nil
case ".svg":
return "image/svg+xml", nil
default:
return "", fmt.Errorf("fileType: Attempted to serve invalid file type")
}
}
func ServeFile(file string, rw http.ResponseWriter) error {
if err := fileCheck(file); err != nil {
return fmt.Errorf("ServeFile: %s", err)
}
ftype, err := fileType(file)
if err != nil {
return fmt.Errorf("ServeFile: %s", err)
2022-12-06 20:22:14 +00:00
}
if ftype == "application/x-i2p-su3-news" {
2022-12-06 20:20:27 +00:00
}
bytes, err := ioutil.ReadFile(file)
if err != nil {
return fmt.Errorf("ServeFile: %s", err)
}
rw.Header().Add("Content-Type", ftype)
rw.Write(bytes)
return nil
}