1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-07-31 11:09:42 +02:00
documize/vendor/github.com/documize/glick/geturl.go
2016-07-07 18:54:16 -07:00

65 lines
1.7 KiB
Go

package glick
import (
"fmt"
"io/ioutil"
"net/http"
"golang.org/x/net/context"
"golang.org/x/net/context/ctxhttp"
)
// PluginGetURL fetches the content of a URL, which could be static or dynamic (passed in).
// It only works with an api with a simple Text/Text signature.
func PluginGetURL(static bool, uri string, model interface{}) Plugin {
if static {
if uri == "" {
return nil
}
}
return func(ctx context.Context, in interface{}) (out interface{}, err error) {
inb, err := TextBytes(in)
if err != nil {
return nil, err
}
ins := string(inb)
if static {
ins = uri
}
resp, err := ctxhttp.Get(ctx, http.DefaultClient, ins) // handles context.Done() correctly
if err != nil {
return nil, err
}
byts, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err // unable to create a simple test case for this error
}
err = resp.Body.Close()
if err != nil {
return nil, err // unable to create a simple test case for this error
}
return TextConvert(byts, model)
}
}
// ConfigGetURL provides the Configurator for the URL class of plugins that
// fetch the content of URLs.
func ConfigGetURL(lib *Library) error {
if lib == nil {
return ErrNilLib
}
return lib.AddConfigurator("URL", func(l *Library, line int, cfg *Config) error {
if !(IsText(l.apim[cfg.API].ppi) && IsText(l.apim[cfg.API].ppo())) {
return fmt.Errorf("entry %d API %s is not of simple type (string/*string) ",
line, cfg.API)
}
pi := PluginGetURL(cfg.Static, cfg.Path, l.apim[cfg.API].ppo())
for _, action := range cfg.Actions {
if err := l.RegPlugin(cfg.API, action, pi, cfg); err != nil {
return fmt.Errorf("entry %d URL register plugin error: %v",
line, err)
}
}
return nil
})
}