1
0
forked from x/ContextOS

tce add web.get 添加了web客户端

This commit is contained in:
shaoying 2018-04-15 21:39:15 +08:00
parent 347dbd5de1
commit b515ac2471

View File

@ -5,15 +5,19 @@ import ( // {{{
"encoding/json" "encoding/json"
"html/template" "html/template"
"io/ioutil"
"net/http" "net/http"
"net/url" "net/url"
"path"
"bufio" "bufio"
"fmt" "fmt"
"io"
"log" "log"
"os" "os"
"path" "os/exec"
"strings" "strings"
"time"
) )
// }}} // }}}
@ -28,10 +32,62 @@ type WEB struct {
*http.ServeMux *http.ServeMux
*http.Server *http.Server
list map[string]string
*ctx.Message *ctx.Message
*ctx.Context *ctx.Context
} }
func (web *WEB) generate(m *ctx.Message, arg string) string { // {{{
add, e := url.Parse(arg)
m.Assert(e)
adds := []string{}
if add.Scheme != "" {
adds = append(adds, add.Scheme)
} else if m.Confs("protocol") {
adds = append(adds, m.Conf("protocol"))
}
adds = append(adds, "://")
if add.Host != "" {
adds = append(adds, add.Host)
} else if m.Confs("hostname") {
adds = append(adds, m.Conf("hostname"))
if m.Confs("port") {
adds = append(adds, ":")
adds = append(adds, m.Conf("port"))
}
}
dir, file := path.Split(add.EscapedPath())
if path.IsAbs(dir) {
adds = append(adds, dir)
adds = append(adds, file)
} else {
adds = append(adds, m.Conf("dir"))
if dir == "" && file == "" {
adds = append(adds, m.Conf("file"))
} else {
adds = append(adds, dir)
adds = append(adds, file)
}
}
if add.RawQuery != "" {
adds = append(adds, "?")
adds = append(adds, add.RawQuery)
} else if m.Confs("query") {
adds = append(adds, "?")
adds = append(adds, m.Conf("query"))
}
return strings.Join(adds, "")
}
// }}}
func (web *WEB) AppendJson(msg *ctx.Message) string { // {{{ func (web *WEB) AppendJson(msg *ctx.Message) string { // {{{
meta := map[string][]string{} meta := map[string][]string{}
meta["result"] = msg.Meta["result"] meta["result"] = msg.Meta["result"]
@ -150,6 +206,8 @@ func (web *WEB) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{
} }
} }
web.list = map[string]string{}
return web return web
} }
@ -228,8 +286,19 @@ func (web *WEB) Close(m *ctx.Message, arg ...string) bool { // {{{
// }}} // }}}
var Index = &ctx.Context{Name: "web", Help: "应用中心", var Index = &ctx.Context{Name: "web", Help: "应用中心",
Caches: map[string]*ctx.Cache{}, Caches: map[string]*ctx.Cache{
Configs: map[string]*ctx.Config{}, "count": &ctx.Cache{Name: "count", Value: "0", Help: "主机协议"},
},
Configs: map[string]*ctx.Config{
"protocol": &ctx.Config{Name: "protocol", Value: "", Help: "主机协议"},
"hostname": &ctx.Config{Name: "hostname", Value: "", Help: "主机地址"},
"port": &ctx.Config{Name: "port", Value: "", Help: "主机端口"},
"dir": &ctx.Config{Name: "dir", Value: "/", Help: "主机路由"},
"file": &ctx.Config{Name: "file", Value: "", Help: "主机文件"},
"query": &ctx.Config{Name: "query", Value: "", Help: "主机参数"},
"output": &ctx.Config{Name: "output", Value: "", Help: "响应输出"},
"editor": &ctx.Config{Name: "editor", Value: "", Help: "响应编辑器"},
},
Commands: map[string]*ctx.Command{ Commands: map[string]*ctx.Command{
"serve": &ctx.Command{Name: "serve [directory [address [protocol]]]", Help: "开启应用服务", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "serve": &ctx.Command{Name: "serve [directory [address [protocol]]]", Help: "开启应用服务", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
m.Set("detail", arg...).Target().Start(m) m.Set("detail", arg...).Target().Start(m)
@ -278,6 +347,68 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
}) })
} // }}} } // }}}
}}, }},
"get": &ctx.Command{Name: "get url", Help: "访问URL", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
web, ok := m.Target().Server.(*WEB) // {{{
m.Assert(ok)
uri := web.generate(m, arg[0])
m.Log("info", nil, "GET %s", uri)
res, e := http.Get(uri)
m.Assert(e)
for k, v := range res.Header {
m.Log("info", nil, "%s: %v", k, v)
}
if m.Confs("output") {
if _, e := os.Stat(m.Conf("output")); e == nil {
name := path.Join(m.Conf("output"), fmt.Sprintf("%d", time.Now().Unix()))
f, e := os.Create(name)
m.Assert(e)
io.Copy(f, res.Body)
if m.Confs("editor") {
cmd := exec.Command(m.Conf("editor"), name)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()
} else {
m.Echo("write to %s", name)
}
return
}
}
buf, e := ioutil.ReadAll(res.Body)
m.Assert(e)
m.Echo(string(buf))
// }}}
}},
"list": &ctx.Command{Name: "list [index|add|del [url]]", Help: "查看、访问、添加url", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
web, ok := m.Target().Server.(*WEB) // {{{
m.Assert(ok)
switch len(arg) {
case 0:
for k, v := range web.list {
m.Echo("%s: %s\n", k, v)
}
case 1:
msg := m.Spawn(m.Target()).Cmd("get", web.list[arg[0]])
m.Copy(msg, "result")
case 2:
switch arg[0] {
case "add":
m.Capi("count", 1)
web.list[m.Cap("count")] = arg[1]
case "del":
delete(web.list, arg[1])
default:
web.list[arg[0]] = arg[1]
}
} // }}}
}},
"/demo": &ctx.Command{Name: "/demo", Help: "应用示例", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { "/demo": &ctx.Command{Name: "/demo", Help: "应用示例", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
m.Add("append", "hi", "hello") m.Add("append", "hi", "hello")
}}, }},