package main import ( "bytes" "flag" "fmt" "image/png" "io" "log" "net/http" "net/http/httptest" "net/url" "os" "strings" "github.com/davecgh/go-spew/spew" "github.com/mattn/go-isatty" "github.com/stapelberg/qrbill" _ "net/http/pprof" ) func ifEmpty(s, alternative string) string { if s == "" { return alternative } return s } func qrchFromRequest(r *http.Request) *qrbill.QRCH { return &qrbill.QRCH{ CdtrInf: qrbill.QRCHCdtrInf{ IBAN: ifEmpty(r.FormValue("criban"), "CH0209000000870913543"), Cdtr: qrbill.Address{ AdrTp: qrbill.AddressTypeCombined, Name: ifEmpty(r.FormValue("crname"), "Legalize it!"), StrtNmOrAdrLine1: ifEmpty(r.FormValue("craddr1"), "Quellenstrasse 25"), BldgNbOrAdrLine2: ifEmpty(r.FormValue("craddr2"), "8005 Zürich"), PstCd: ifEmpty(r.FormValue("crpost"), ""), TwnNm: ifEmpty(r.FormValue("crcity"), ""), Ctry: ifEmpty(r.FormValue("crcountry"), "CH"), }, }, CcyAmt: qrbill.QRCHCcyAmt{ Amt: "", Ccy: "CHF", }, UltmtDbtr: qrbill.Address{ AdrTp: qrbill.AddressTypeCombined, Name: ifEmpty(r.FormValue("udname"), "Michael Stapelberg"), StrtNmOrAdrLine1: ifEmpty(r.FormValue("udaddr1"), "Stauffacherstr 42"), BldgNbOrAdrLine2: ifEmpty(r.FormValue("udaddr2"), "8004 Zürich"), PstCd: ifEmpty(r.FormValue("udpost"), ""), TwnNm: ifEmpty(r.FormValue("udcity"), ""), Ctry: ifEmpty(r.FormValue("udcountry"), "CH"), }, RmtInf: qrbill.QRCHRmtInf{ Tp: "NON", // Reference type Ref: "", // Reference AddInf: qrbill.QRCHRmtInfAddInf{ Ustrd: ifEmpty(r.FormValue("message"), "Spende 420"), }, }, } } // Overridden in api_gokrazy.go var defaultListenAddress = "localhost:9933" func logic() error { var listen = flag.String("listen", defaultListenAddress, "[host]:port to listen on") flag.Parse() mux := http.NewServeMux() mux.HandleFunc("/qr", func(w http.ResponseWriter, r *http.Request) { prefix := "[" + r.RemoteAddr + "]" format := r.FormValue("format") log.Printf("%s handling request for %s, format=%s", prefix, r.URL.Path, format) defer log.Printf("%s request completed (%s)", prefix, r.URL.Path) if format == "" { msg := fmt.Sprintf("no ?format= parameter specified. Try %s", "http://"+*listen+"/qr?format=html") log.Printf("%s %s", prefix, msg) http.Error(w, msg, http.StatusBadRequest) return } if format != "png" && format != "svg" && format != "txt" && format != "html" && format != "wv" { msg := fmt.Sprintf("format (%q) must be one of png, svg, txt or html", format) log.Printf("%s %s", prefix, msg) http.Error(w, msg, http.StatusBadRequest) return } qrch := qrchFromRequest(r) bill, err := qrch.Encode() if err != nil { log.Printf("%s %s", prefix, err) http.Error(w, err.Error(), http.StatusInternalServerError) return } var b []byte switch format { case "png": code, err := bill.EncodeToImage() if err != nil { log.Printf("%s %s", prefix, err) http.Error(w, err.Error(), http.StatusInternalServerError) return } var buf bytes.Buffer if err := png.Encode(&buf, code); err != nil { log.Printf("%s %s", prefix, err) http.Error(w, err.Error(), http.StatusInternalServerError) return } b = buf.Bytes() w.Header().Add("Content-Type", "image/png") case "svg": var err error b, err = bill.EncodeToSVG() if err != nil { log.Printf("%s %s", prefix, err) http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Add("Content-Type", "image/svg+xml") case "txt": w.Header().Add("Content-Type", "text/plain; charset=utf-8") spew.Fdump(w, qrch.Validate()) case "html": debugHTML(w, r, prefix, qrch) case "wv": w.Header().Add("Content-Type", "text/html; charset=utf-8") r.URL.Path = "/qr" v := r.URL.Query() v.Set("format", "png") r.URL.RawQuery = v.Encode() fmt.Fprintf(w, `