forked from x/ContextOS
tce add web.get 添加了web客户端
This commit is contained in:
parent
347dbd5de1
commit
b515ac2471
@ -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")
|
||||||
}},
|
}},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user