mirror of
https://shylinux.com/x/ContextOS
synced 2025-04-26 01:04:06 +08:00
tce add web.get 添加了web客户端
This commit is contained in:
parent
347dbd5de1
commit
b515ac2471
@ -5,15 +5,19 @@ import ( // {{{
|
||||
|
||||
"encoding/json"
|
||||
"html/template"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"path"
|
||||
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"path"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// }}}
|
||||
@ -28,10 +32,62 @@ type WEB struct {
|
||||
*http.ServeMux
|
||||
*http.Server
|
||||
|
||||
list map[string]string
|
||||
|
||||
*ctx.Message
|
||||
*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 { // {{{
|
||||
meta := map[string][]string{}
|
||||
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
|
||||
}
|
||||
|
||||
@ -228,8 +286,19 @@ func (web *WEB) Close(m *ctx.Message, arg ...string) bool { // {{{
|
||||
// }}}
|
||||
|
||||
var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
||||
Caches: map[string]*ctx.Cache{},
|
||||
Configs: map[string]*ctx.Config{},
|
||||
Caches: map[string]*ctx.Cache{
|
||||
"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{
|
||||
"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)
|
||||
@ -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) {
|
||||
m.Add("append", "hi", "hello")
|
||||
}},
|
||||
|
Loading…
x
Reference in New Issue
Block a user