You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/logic/http_api.go

181 lines
4.2 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// Copyright 2020, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package logic
import (
"encoding/json"
"net"
"net/http"
"time"
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/bininfo"
"github.com/q191201771/naza/pkg/nazalog"
)
const httpAPIVersion = "v0.0.2"
const (
ErrorCodeSucc = 0
DespSucc = "succ"
ErrorCodeGroupNotFound = 1001
DespGroupNotFound = "group not found"
)
var startTime string
type HTTPAPIServerObserver interface {
OnStatAllGroup() []base.StatGroup
OnStatGroup(streamName string) *base.StatGroup
}
type HTTPAPIServer struct {
addr string
observer HTTPAPIServerObserver
ln net.Listener
}
type HTTPResponseBasic struct {
ErrorCode int `json:"error_code"`
Desp string `json:"desp"`
}
type APIStatLALInfo struct {
HTTPResponseBasic
Data struct {
BinInfo string `json:"bin_info"`
LalVersion string `json:"lal_version"`
APIVersion string `json:"api_version"`
StartTime string `json:"start_time"`
} `json:"data"`
}
type APIStatAllGroup struct {
HTTPResponseBasic
Data struct {
Groups []base.StatGroup `json:"groups"`
} `json:"data"`
}
type APIStatGroup struct {
HTTPResponseBasic
Data *base.StatGroup `json:"data"`
}
func NewHTTPAPIServer(addr string, observer HTTPAPIServerObserver) *HTTPAPIServer {
return &HTTPAPIServer{
addr: addr,
observer: observer,
}
}
func (h *HTTPAPIServer) Listen() (err error) {
if h.ln, err = net.Listen("tcp", h.addr); err != nil {
return
}
nazalog.Infof("start httpapi server listen. addr=%s", h.addr)
return
}
func (h *HTTPAPIServer) Runloop() error {
mux := http.NewServeMux()
mux.HandleFunc("/api/list", h.apiListHandler)
mux.HandleFunc("/api/stat/lal_info", h.statLALInfoHandler)
mux.HandleFunc("/api/stat/group", h.statGroupHandler)
mux.HandleFunc("/api/stat/all_group", h.statAllGroupHandler)
var srv http.Server
srv.Handler = mux
return srv.Serve(h.ln)
}
// TODO chef: dispose
func (h *HTTPAPIServer) apiListHandler(w http.ResponseWriter, req *http.Request) {
// TODO chef: 写完api list页面
b := []byte(`
<html>
<head><title>lal http api list</title></head>
<body>
<br>
<br>
<p>api接口列表</p>
<ul>
<li><a href="/api/stat/group?stream_name=test110">/api/stat/group?stream_name=test110</a></li>
<li><a href="/api/stat/all_group">/api/stat/all_group</a></li>
<li><a href="/api/stat/lal_info">/api/stat/lal_info</a></li>
<li><a href="/api/list">/api/list</a></li>
</ul>
<br>
<p>其他链接:</p>
<ul>
<li><a href="https://pengrl.com/p/20100/">lal http api接口说明文档</a></li>
<li><a href="https://github.com/q191201771/lal">lal github地址</a></li>
</ul>
</body>
</html>
`)
w.Header().Add("Server", base.LALHTTPAPIServer)
_, _ = w.Write(b)
}
func (h *HTTPAPIServer) statLALInfoHandler(w http.ResponseWriter, req *http.Request) {
var v APIStatLALInfo
v.ErrorCode = ErrorCodeSucc
v.Desp = DespSucc
v.Data.BinInfo = bininfo.StringifySingleLine()
v.Data.LalVersion = base.LALVersion
v.Data.APIVersion = httpAPIVersion
v.Data.StartTime = startTime
resp, _ := json.Marshal(v)
w.Header().Add("Server", base.LALHTTPAPIServer)
_, _ = w.Write(resp)
}
func (h *HTTPAPIServer) statAllGroupHandler(w http.ResponseWriter, req *http.Request) {
gs := h.observer.OnStatAllGroup()
var v APIStatAllGroup
v.ErrorCode = ErrorCodeSucc
v.Desp = DespSucc
v.Data.Groups = gs
resp, _ := json.Marshal(v)
w.Header().Add("Server", base.LALHTTPAPIServer)
_, _ = w.Write(resp)
}
func (h *HTTPAPIServer) statGroupHandler(w http.ResponseWriter, req *http.Request) {
var v APIStatGroup
q := req.URL.Query()
streamName := q.Get("stream_name")
if streamName == "" {
v.ErrorCode = ErrorCodeGroupNotFound
v.Desp = DespGroupNotFound
} else {
v.Data = h.observer.OnStatGroup(streamName)
if v.Data == nil {
v.ErrorCode = ErrorCodeGroupNotFound
v.Desp = DespGroupNotFound
} else {
v.ErrorCode = ErrorCodeSucc
v.Desp = DespSucc
}
}
resp, _ := json.Marshal(v)
w.Header().Add("Server", base.LALHTTPAPIServer)
_, _ = w.Write(resp)
}
func init() {
startTime = time.Now().Format("2006-01-02 15:04:05.999")
}