From b515ac2471079a7487bdbd93680cd2fefcd9e58c Mon Sep 17 00:00:00 2001 From: shaoying Date: Sun, 15 Apr 2018 21:39:15 +0800 Subject: [PATCH] =?UTF-8?q?tce=20add=20web.get=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86web=E5=AE=A2=E6=88=B7=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/contexts/web/web.go | 137 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 3 deletions(-) diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index 1a6a7081..936cf16c 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -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") }},