summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Pointner <equinox@helsinki.at>2015-12-04 04:46:53 (GMT)
committerChristian Pointner <equinox@helsinki.at>2015-12-04 04:46:53 (GMT)
commitebb3f5828c9ac684f18135b17152d714939578f8 (patch)
tree76a1b3e7c23058db5ec7895fb0ad8b454dc0bbb4
parentef640c5a4b1dbd52ff2b125cb9abd33a2d562b62 (diff)
further improved simple web interface
-rw-r--r--src/helsinki.at/rhimport/importer.go19
-rw-r--r--src/helsinki.at/rhimportd/ctrlWeb.go32
-rw-r--r--src/helsinki.at/rhimportd/ctrlWebSimple.go105
-rw-r--r--test/simple-empty.json2
-rw-r--r--test/simple1.json2
-rwxr-xr-xtest/test-simple.sh10
6 files changed, 136 insertions, 34 deletions
diff --git a/src/helsinki.at/rhimport/importer.go b/src/helsinki.at/rhimport/importer.go
index 8c7e66e..e47bc05 100644
--- a/src/helsinki.at/rhimport/importer.go
+++ b/src/helsinki.at/rhimport/importer.go
@@ -26,7 +26,7 @@ package rhimport
import (
// "bytes"
- "fmt"
+ // "fmt"
// "io"
// "mime/multipart"
// "net/http"
@@ -36,7 +36,8 @@ import (
type ImportContext struct {
Conf *Config
UserName string
- password string
+ Password string
+ Trusted bool
GroupName string
Cart int
Channels int
@@ -51,6 +52,8 @@ func NewImportContext(conf *Config, user string, group string, cart int) *Import
ctx := new(ImportContext)
ctx.Conf = conf
ctx.UserName = user
+ ctx.Password = ""
+ ctx.Trusted = false
ctx.GroupName = group
ctx.Cart = cart
ctx.Channels = 2
@@ -75,7 +78,7 @@ func (ctx *ImportContext) getPassword(cached bool) (err error) {
err = res.err
return
}
- ctx.password = res.password
+ ctx.Password = res.password
return
}
@@ -129,12 +132,14 @@ func (ctx *ImportContext) getPassword(cached bool) (err error) {
func ImportFile(ctx *ImportContext) (err error) {
rhl.Println("ImportFile called for", ctx.SourceFile)
- if err = ctx.getPassword(true); err != nil {
- return
+ if ctx.Trusted {
+ if err = ctx.getPassword(true); err != nil {
+ return
+ }
}
- rhdl.Println("credentials:", ctx.UserName, "/", ctx.password)
+ rhdl.Printf("credentials: '%s':'%s'", ctx.UserName, ctx.Password)
- err = fmt.Errorf("%+v", ctx)
+// err = fmt.Errorf("%+v", ctx)
return
}
diff --git a/src/helsinki.at/rhimportd/ctrlWeb.go b/src/helsinki.at/rhimportd/ctrlWeb.go
index 275f095..5a76f15 100644
--- a/src/helsinki.at/rhimportd/ctrlWeb.go
+++ b/src/helsinki.at/rhimportd/ctrlWeb.go
@@ -25,46 +25,24 @@
package main
import (
- "fmt"
"helsinki.at/rhimport"
- "html"
"net/http"
_ "net/http/pprof"
)
type webHandler struct {
*rhimport.Config
- H func(*rhimport.Config, http.ResponseWriter, *http.Request) (int, error)
+ trusted bool
+ H func(*rhimport.Config, bool, http.ResponseWriter, *http.Request)
}
func (self webHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- status, err := self.H(self.Config, w, r)
- if err != nil {
- switch status {
- case http.StatusNotFound:
- http.NotFound(w, r)
- default:
- http.Error(w, fmt.Sprintf("%s: %s", http.StatusText(status), err), status)
- }
- }
-}
-
-func IndexHandler(conf *rhimport.Config, w http.ResponseWriter, r *http.Request) (status int, err error) {
-
- ctx := rhimport.NewImportContext(conf, "hugo", "test", 17324)
- ctx.SourceFile = html.EscapeString(r.URL.Path)
- ctx.DeleteSourceFile = true
-
- if err = rhimport.ImportFile(ctx); err != nil {
- status = http.StatusInternalServerError
- } else {
- status = http.StatusOK
- }
- return
+ self.H(self.Config, self.trusted, w, r)
}
func StartControlWeb(addr_s string, conf *rhimport.Config) {
- http.Handle("/", webHandler{conf, IndexHandler})
+ http.Handle("/public/simple", webHandler{conf, false, webSimpleHandler})
+ http.Handle("/trusted/simple", webHandler{conf, true, webSimpleHandler})
rhl.Println("listening on", addr_s)
http.ListenAndServe(addr_s, nil)
diff --git a/src/helsinki.at/rhimportd/ctrlWebSimple.go b/src/helsinki.at/rhimportd/ctrlWebSimple.go
new file mode 100644
index 0000000..eb781dd
--- /dev/null
+++ b/src/helsinki.at/rhimportd/ctrlWebSimple.go
@@ -0,0 +1,105 @@
+//
+// rhimportd
+//
+// The Radio Helsinki Rivendell Import Daemon
+//
+//
+// Copyright (C) 2015 Christian Pointner <equinox@helsinki.at>
+//
+// This file is part of rhimportd.
+//
+// rhimportd is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// any later version.
+//
+// rhimportd is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with rhimportd. If not, see <http://www.gnu.org/licenses/>.
+//
+
+package main
+
+import (
+ "encoding/json"
+ "helsinki.at/rhimport"
+ "html"
+ "net/http"
+ _ "net/http/pprof"
+ "fmt"
+)
+
+type webSimpleRequestData struct {
+ UserName string `json:"LOGIN_NAME"`
+ Password string `json:"PASSWORD"`
+ GroupName string `json:"GROUP_NAME"`
+ Cart int `json:"CART_NUMBER"`
+ Channels int `json:"CHANNELS"`
+ NormalizationLevel int `json:"NORMALIZATION_LEVEL"`
+ AutotrimLevel int `json:"AUTOTRIM_LEVEL"`
+ UseMetaData bool `json:"USE_METADATA"`
+ SourceUri string `json:"SOURCE_URI"`
+}
+
+type webSimpleResponseData struct {
+ ResponseCode int `json:"REPONSE_CODE"`
+ ErrorString string `json:"ERROR_STRING"`
+ AudioConvertError int `json:"AudioConvertError"`
+}
+
+func webSimpleErrorResponse(w http.ResponseWriter, code int, error_str string, audio_err int) {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(http.StatusInternalServerError)
+ encoder := json.NewEncoder(w)
+ respdata := webSimpleResponseData{code, error_str, audio_err}
+ encoder.Encode(respdata)
+}
+
+func webSimpleResponse(w http.ResponseWriter) {
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(http.StatusInternalServerError)
+ encoder := json.NewEncoder(w)
+ respdata := webSimpleResponseData{200, "SUCCESS", 0}
+ encoder.Encode(respdata)
+}
+
+func webSimpleHandler(conf *rhimport.Config, trusted bool, w http.ResponseWriter, r *http.Request) {
+ rhdl.Printf("SimpleHandler: request for '%s'", html.EscapeString(r.URL.Path))
+
+ decoder := json.NewDecoder(r.Body)
+ var reqdata webSimpleRequestData
+ if err := decoder.Decode(&reqdata); err != nil {
+ webSimpleErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("Error parsing JSON response: %s", err), 0)
+ return
+ }
+
+ username := reqdata.UserName
+ if trusted {
+ username = r.Header.Get("X-Forwarded-User")
+ }
+ ctx := rhimport.NewImportContext(conf, username, reqdata.GroupName, reqdata.Cart)
+ ctx.Password = reqdata.Password
+ ctx.Trusted = trusted
+ ctx.Channels = reqdata.Channels
+ ctx.NormalizationLevel = reqdata.NormalizationLevel
+ ctx.AutotrimLevel = reqdata.AutotrimLevel
+ ctx.UseMetaData = reqdata.UseMetaData
+
+ // TODO: call the fetcher
+
+ // TODO: the following should be returned by the fetcher
+ ctx.SourceFile = "<undefined>"
+ ctx.DeleteSourceFile = true
+
+ if err := rhimport.ImportFile(ctx); err != nil {
+ webSimpleErrorResponse(w, http.StatusInternalServerError, err.Error(), 0)
+ return
+ }
+
+ webSimpleResponse(w)
+ return
+}
diff --git a/test/simple-empty.json b/test/simple-empty.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/test/simple-empty.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/test/simple1.json b/test/simple1.json
new file mode 100644
index 0000000..2c63c08
--- /dev/null
+++ b/test/simple1.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/test/test-simple.sh b/test/test-simple.sh
new file mode 100755
index 0000000..e797dd1
--- /dev/null
+++ b/test/test-simple.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+if [ -z "$1" ]; then
+ echo "Usage: $0 <json-file>"
+ exit 1
+fi
+
+curl -XPOST 'http://localhost:4000/public/simple' -d @$1
+
+exit 0