initialize project

This commit is contained in:
idk
2022-12-06 20:20:27 +00:00
parent afb0a90fe8
commit 7e49c84735
3 changed files with 121 additions and 0 deletions

73
server/serve.go Normal file
View File

@ -0,0 +1,73 @@
package newsserver
import (
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
)
type NewsServer struct {
NewsDir string
}
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)
}
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
}

43
server/stats/stats.go Normal file
View File

@ -0,0 +1,43 @@
package newsstats
import (
"encoding/json"
"io/ioutil"
"net/http"
)
type NewsStats struct {
DownloadLangs map[string]int
StateFile string
}
func (n *NewsStats) Increment(rq http.Request) {
q := rq.URL.Query()
lang := q.Get("lang")
if lang != "" {
n.DownloadLangs[lang]++
} else {
n.DownloadLangs["en_US"]++
}
}
func (n *NewsStats) Save() error {
bytes, err := json.Marshal(n.DownloadLangs)
if err != nil {
return err
}
if err := ioutil.WriteFile(n.StateFile, bytes, 0644); err != nil {
return err
}
return nil
}
func (n *NewsStats) Load() {
bytes, err := ioutil.ReadFile(n.StateFile)
if err != nil {
n.DownloadLangs = make(map[string]int)
}
if err := json.Unmarshal(bytes, &n.DownloadLangs); err != nil {
n.DownloadLangs = make(map[string]int)
}
}