%PDF- %PDF-
| Direktori : /home/waritko/go/src/github.com/odeke-em/meddler/ |
| Current File : //home/waritko/go/src/github.com/odeke-em/meddler/meddler.go |
package meddler
import (
"fmt"
"io"
"net/http"
"net/url"
"path/filepath"
"strings"
)
type DownloadItem struct {
URI string `form:"uri" binding:"required"`
PublicKey string `form:"pubkey" binding:"-"`
Signature string `form:"signature" binding:"-"`
}
type UriInsert struct {
UriList []string
Source string
}
type Payload struct {
URI string `form:"uri" binding:"required"`
PublicKey string `form:"pubkey" binding:"-"`
Signature string `form:"signature" binding:"-"`
Payload string `form:"payload" binding:"-"`
RequestTime int64 `form:"requesttime" binding:"required"`
ExpiryTime int64 `form:"expirytime" binding:"required"`
}
func (pl *Payload) RawTextForSigning() string {
return fmt.Sprintf("%q%q%q%q%q", pl.URI, pl.RequestTime, pl.Payload, pl.PublicKey, pl.ExpiryTime)
}
func (pl *Payload) ToUrlValues(extras ...map[string]interface{}) url.Values {
uv := url.Values{}
uv.Set("payload", pl.Payload)
uv.Set("pubkey", pl.PublicKey)
uv.Set("signature", pl.Signature)
uv.Set("uri", pl.URI)
uv.Set("requesttime", fmt.Sprintf("%v", pl.RequestTime))
uv.Set("expirytime", fmt.Sprintf("%v", pl.ExpiryTime))
return uv
}
func headerShallowCopy(from, to http.Header) {
for k, v := range from {
to.Set(k, strings.Join(v, ","))
}
}
func HeadGet(di DownloadItem, res http.ResponseWriter, req *http.Request) error {
uri := di.URI
headResponse, err := http.Head(uri)
if err != nil {
return err
}
dlHeader := headResponse.Header
headerShallowCopy(dlHeader, res.Header())
return nil
}
func Download(di DownloadItem, res http.ResponseWriter, req *http.Request) {
uri := di.URI
downloadResult, err := http.Get(uri)
if err != nil {
fmt.Fprintf(res, "%v", err)
return
}
if downloadResult == nil || downloadResult.Body == nil {
fmt.Fprintf(res, "could not get %q", uri)
return
}
body := downloadResult.Body
dlHeader := downloadResult.Header
if downloadResult.Close {
defer body.Close()
}
headerShallowCopy(dlHeader, res.Header())
basename := filepath.Base(uri)
extraHeaders := map[string][]string{
"Content-Disposition": []string{
fmt.Sprintf("attachment;filename=%q", basename),
},
}
headerShallowCopy(extraHeaders, res.Header())
res.WriteHeader(200)
io.Copy(res, body)
}