mirror of
https://github.com/go-i2p/newsgo.git
synced 2025-07-12 02:49:24 -04:00
initialize project
This commit is contained in:
73
server/serve.go
Normal file
73
server/serve.go
Normal 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
43
server/stats/stats.go
Normal 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)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user