mirror of https://github.com/mindoc-org/mindoc.git
269 lines
13 KiB
Go
269 lines
13 KiB
Go
package routers
|
|
|
|
import (
|
|
// "crypto/tls"
|
|
// "log"
|
|
"net/http"
|
|
"net/http/httputil"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"github.com/beego/beego/v2/core/logs"
|
|
"github.com/beego/beego/v2/server/web"
|
|
"github.com/beego/beego/v2/server/web/context"
|
|
|
|
// "github.com/mindoc-org/mindoc/conf"
|
|
"github.com/mindoc-org/mindoc/controllers"
|
|
)
|
|
|
|
type CorsTransport struct {
|
|
http.RoundTripper
|
|
}
|
|
|
|
func (t *CorsTransport) RoundTrip(req *http.Request) (resp *http.Response, err error) {
|
|
// refer: https://stackoverflow.com/questions/31535569/golang-how-to-read-response-body-of-reverseproxy/31536962#31536962
|
|
resp, err = t.RoundTripper.RoundTrip(req)
|
|
// beego.Debug(resp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
/*
|
|
b, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
err = resp.Body.Close()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1)
|
|
body := ioutil.NopCloser(bytes.NewReader(b))
|
|
resp.Body = body
|
|
resp.ContentLength = int64(len(b))
|
|
resp.Header.Set("Content-Length", strconv.Itoa(len(b)))
|
|
*/
|
|
// resp.Body.Close()
|
|
// resp.Header.Del("Access-Control-Request-Method")
|
|
// resp.Header.Del("Access-Control-Request-Headers")
|
|
resp.Header.Set("Access-Control-Allow-Origin", "*")
|
|
resp.Header.Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
|
|
// resp.Header.Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, X-Requested-With")
|
|
hs := ""
|
|
for name, values := range resp.Header {
|
|
hs = hs + name + ", "
|
|
_ = values
|
|
}
|
|
hs = strings.TrimRight(hs, " ")
|
|
hs = strings.TrimRight(hs, ",")
|
|
// beego.Debug(hs)
|
|
resp.Header.Set("Access-Control-Allow-Headers", hs)
|
|
resp.Header.Del("Mindoc-Version")
|
|
resp.Header.Del("Mindoc-Site")
|
|
resp.Header.Del("Server")
|
|
resp.Header.Del("X-Xss-Protection")
|
|
return resp, nil
|
|
}
|
|
|
|
func singleJoiningSlash(a, b string) string {
|
|
aslash := strings.HasSuffix(a, "/")
|
|
bslash := strings.HasPrefix(b, "/")
|
|
switch {
|
|
case aslash && bslash:
|
|
return a + b[1:]
|
|
case !aslash && !bslash:
|
|
return a + "/" + b
|
|
}
|
|
return a + b
|
|
}
|
|
|
|
func init() {
|
|
web.Any("/hello-any", func(ctx *context.Context) {
|
|
ctx.Output.Body([]byte("hello any demo"))
|
|
})
|
|
|
|
web.Any("/cors-anywhere", func(ctx *context.Context) {
|
|
u, _ := url.PathUnescape(ctx.Input.Query("url"))
|
|
if len(u) > 0 && strings.HasPrefix(u, "http") {
|
|
target, _ := url.Parse(u)
|
|
if target.Path == ctx.Request.URL.Path {
|
|
ctx.Output.Body([]byte(""))
|
|
} else {
|
|
logs.Error("target: ", target)
|
|
|
|
reverseProxy := httputil.NewSingleHostReverseProxy(target)
|
|
|
|
reverseProxy.Director = func(req *http.Request) {
|
|
for name, values := range ctx.Request.Header {
|
|
for _, value := range values {
|
|
req.Header.Set(name, value)
|
|
}
|
|
}
|
|
req.Header.Add("X-Forwarded-Host", req.Host)
|
|
req.Header.Add("X-Origin-Host", target.Host)
|
|
req.URL.Scheme = target.Scheme
|
|
req.URL.Host = target.Host
|
|
|
|
// proxyPath := singleJoiningSlash(target.Path, req.URL.Path)
|
|
proxyPath := target.Path
|
|
if strings.HasSuffix(proxyPath, "/") && len(proxyPath) > 1 {
|
|
proxyPath = proxyPath[:len(proxyPath)-1]
|
|
}
|
|
req.URL.Path = proxyPath
|
|
}
|
|
reverseProxy.Transport = &CorsTransport{http.DefaultTransport}
|
|
reverseProxy.ServeHTTP(ctx.ResponseWriter, ctx.Request)
|
|
panic(web.ErrAbort)
|
|
}
|
|
} else {
|
|
ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
|
|
ctx.Output.Body([]byte("400 Bad Request"))
|
|
}
|
|
})
|
|
|
|
web.Router("/", &controllers.HomeController{}, "*:Index")
|
|
|
|
web.Router("/login", &controllers.AccountController{}, "*:Login")
|
|
web.Router("/dingtalk_login", &controllers.AccountController{}, "*:DingTalkLogin")
|
|
web.Router("/workweixin-login", &controllers.AccountController{}, "*:WorkWeixinLogin")
|
|
web.Router("/workweixin-callback", &controllers.AccountController{}, "*:WorkWeixinLoginCallback")
|
|
web.Router("/workweixin-bind", &controllers.AccountController{}, "*:WorkWeixinLoginBind")
|
|
web.Router("/workweixin-ignore", &controllers.AccountController{}, "*:WorkWeixinLoginIgnore")
|
|
web.Router("/qrlogin/:app", &controllers.AccountController{}, "*:QRLogin")
|
|
web.Router("/logout", &controllers.AccountController{}, "*:Logout")
|
|
web.Router("/register", &controllers.AccountController{}, "*:Register")
|
|
web.Router("/find_password", &controllers.AccountController{}, "*:FindPassword")
|
|
web.Router("/valid_email", &controllers.AccountController{}, "post:ValidEmail")
|
|
web.Router("/captcha", &controllers.AccountController{}, "*:Captcha")
|
|
|
|
web.Router("/manager", &controllers.ManagerController{}, "*:Index")
|
|
web.Router("/manager/users", &controllers.ManagerController{}, "*:Users")
|
|
web.Router("/manager/users/edit/:id", &controllers.ManagerController{}, "*:EditMember")
|
|
web.Router("/manager/member/create", &controllers.ManagerController{}, "post:CreateMember")
|
|
web.Router("/manager/member/delete", &controllers.ManagerController{}, "post:DeleteMember")
|
|
web.Router("/manager/member/update-member-status", &controllers.ManagerController{}, "post:UpdateMemberStatus")
|
|
web.Router("/manager/member/change-member-role", &controllers.ManagerController{}, "post:ChangeMemberRole")
|
|
web.Router("/manager/books", &controllers.ManagerController{}, "*:Books")
|
|
web.Router("/manager/books/edit/:key", &controllers.ManagerController{}, "*:EditBook")
|
|
web.Router("/manager/books/delete", &controllers.ManagerController{}, "*:DeleteBook")
|
|
|
|
web.Router("/manager/comments", &controllers.ManagerController{}, "*:Comments")
|
|
web.Router("/manager/setting", &controllers.ManagerController{}, "*:Setting")
|
|
web.Router("/manager/books/token", &controllers.ManagerController{}, "post:CreateToken")
|
|
web.Router("/manager/books/transfer", &controllers.ManagerController{}, "post:Transfer")
|
|
web.Router("/manager/books/open", &controllers.ManagerController{}, "post:PrivatelyOwned")
|
|
|
|
web.Router("/manager/attach/list", &controllers.ManagerController{}, "*:AttachList")
|
|
web.Router("/manager/attach/detailed/:id", &controllers.ManagerController{}, "*:AttachDetailed")
|
|
web.Router("/manager/attach/delete", &controllers.ManagerController{}, "post:AttachDelete")
|
|
web.Router("/manager/label/list", &controllers.ManagerController{}, "get:LabelList")
|
|
web.Router("/manager/label/delete/:id", &controllers.ManagerController{}, "post:LabelDelete")
|
|
|
|
//web.Router("/manager/config", &controllers.ManagerController{}, "*:Config")
|
|
|
|
web.Router("/manager/team", &controllers.ManagerController{}, "*:Team")
|
|
web.Router("/manager/team/create", &controllers.ManagerController{}, "POST:TeamCreate")
|
|
web.Router("/manager/team/edit", &controllers.ManagerController{}, "POST:TeamEdit")
|
|
web.Router("/manager/team/delete", &controllers.ManagerController{}, "POST:TeamDelete")
|
|
|
|
web.Router("/manager/team/member/list/:id", &controllers.ManagerController{}, "*:TeamMemberList")
|
|
web.Router("/manager/team/member/add", &controllers.ManagerController{}, "POST:TeamMemberAdd")
|
|
web.Router("/manager/team/member/delete", &controllers.ManagerController{}, "POST:TeamMemberDelete")
|
|
web.Router("/manager/team/member/change_role", &controllers.ManagerController{}, "POST:TeamChangeMemberRole")
|
|
web.Router("/manager/team/member/search", &controllers.ManagerController{}, "*:TeamSearchMember")
|
|
|
|
web.Router("/manager/team/book/list/:id", &controllers.ManagerController{}, "*:TeamBookList")
|
|
web.Router("/manager/team/book/add", &controllers.ManagerController{}, "POST:TeamBookAdd")
|
|
web.Router("/manager/team/book/delete", &controllers.ManagerController{}, "POST:TeamBookDelete")
|
|
web.Router("/manager/team/book/search", &controllers.ManagerController{}, "*:TeamSearchBook")
|
|
|
|
web.Router("/manager/itemsets", &controllers.ManagerController{}, "*:Itemsets")
|
|
web.Router("/manager/itemsets/edit", &controllers.ManagerController{}, "post:ItemsetsEdit")
|
|
web.Router("/manager/itemsets/delete", &controllers.ManagerController{}, "post:ItemsetsDelete")
|
|
|
|
web.Router("/setting", &controllers.SettingController{}, "*:Index")
|
|
web.Router("/setting/password", &controllers.SettingController{}, "*:Password")
|
|
web.Router("/setting/upload", &controllers.SettingController{}, "*:Upload")
|
|
|
|
web.Router("/book", &controllers.BookController{}, "*:Index")
|
|
web.Router("/book/:key/dashboard", &controllers.BookController{}, "*:Dashboard")
|
|
web.Router("/book/:key/setting", &controllers.BookController{}, "*:Setting")
|
|
web.Router("/book/:key/users", &controllers.BookController{}, "*:Users")
|
|
web.Router("/book/:key/release", &controllers.BookController{}, "post:Release")
|
|
web.Router("/book/:key/sort", &controllers.BookController{}, "post:SaveSort")
|
|
web.Router("/book/:key/teams", &controllers.BookController{}, "*:Team")
|
|
|
|
web.Router("/book/create", &controllers.BookController{}, "*:Create")
|
|
web.Router("/book/itemsets/search", &controllers.BookController{}, "*:ItemsetsSearch")
|
|
|
|
web.Router("/book/users/create", &controllers.BookMemberController{}, "post:AddMember")
|
|
web.Router("/book/users/change", &controllers.BookMemberController{}, "post:ChangeRole")
|
|
web.Router("/book/users/delete", &controllers.BookMemberController{}, "post:RemoveMember")
|
|
web.Router("/book/users/import", &controllers.BookController{}, "post:Import")
|
|
web.Router("/book/users/copy", &controllers.BookController{}, "post:Copy")
|
|
|
|
web.Router("/book/setting/save", &controllers.BookController{}, "post:SaveBook")
|
|
web.Router("/book/setting/open", &controllers.BookController{}, "post:PrivatelyOwned")
|
|
web.Router("/book/setting/transfer", &controllers.BookController{}, "post:Transfer")
|
|
web.Router("/book/setting/upload", &controllers.BookController{}, "post:UploadCover")
|
|
web.Router("/book/setting/delete", &controllers.BookController{}, "post:Delete")
|
|
|
|
web.Router("/book/team/add", &controllers.BookController{}, "POST:TeamAdd")
|
|
web.Router("/book/team/delete", &controllers.BookController{}, "POST:TeamDelete")
|
|
web.Router("/book/team/search", &controllers.BookController{}, "*:TeamSearch")
|
|
|
|
//管理文章的路由
|
|
web.Router("/manage/blogs", &controllers.BlogController{}, "*:ManageList")
|
|
web.Router("/manage/blogs/setting/?:id", &controllers.BlogController{}, "*:ManageSetting")
|
|
web.Router("/manage/blogs/edit/?:id", &controllers.BlogController{}, "*:ManageEdit")
|
|
web.Router("/manage/blogs/delete", &controllers.BlogController{}, "post:ManageDelete")
|
|
web.Router("/manage/blogs/upload", &controllers.BlogController{}, "post:Upload")
|
|
web.Router("/manage/blogs/attach/:id", &controllers.BlogController{}, "post:RemoveAttachment")
|
|
|
|
//读文章的路由
|
|
web.Router("/blogs", &controllers.BlogController{}, "*:List")
|
|
web.Router("/blog-attach/:id:int/:attach_id:int", &controllers.BlogController{}, "get:Download")
|
|
web.Router("/blog-:id([0-9]+).html", &controllers.BlogController{}, "*:Index")
|
|
|
|
//模板相关接口
|
|
web.Router("/api/template/get", &controllers.TemplateController{}, "get:Get")
|
|
web.Router("/api/template/list", &controllers.TemplateController{}, "post:List")
|
|
web.Router("/api/template/add", &controllers.TemplateController{}, "post:Add")
|
|
web.Router("/api/template/remove", &controllers.TemplateController{}, "post:Delete")
|
|
|
|
web.Router("/api/attach/remove/", &controllers.DocumentController{}, "post:RemoveAttachment")
|
|
web.Router("/api/:key/edit/?:id", &controllers.DocumentController{}, "*:Edit")
|
|
web.Router("/api/upload", &controllers.DocumentController{}, "post:Upload")
|
|
web.Router("/api/:key/create", &controllers.DocumentController{}, "post:Create")
|
|
web.Router("/api/:key/delete", &controllers.DocumentController{}, "post:Delete")
|
|
web.Router("/api/:key/content/?:id", &controllers.DocumentController{}, "*:Content")
|
|
web.Router("/api/:key/compare/:id", &controllers.DocumentController{}, "*:Compare")
|
|
web.Router("/api/search/user/:key", &controllers.SearchController{}, "*:User")
|
|
|
|
web.Router("/history/get", &controllers.DocumentController{}, "get:History")
|
|
web.Router("/history/delete", &controllers.DocumentController{}, "*:DeleteHistory")
|
|
web.Router("/history/restore", &controllers.DocumentController{}, "*:RestoreHistory")
|
|
|
|
web.Router("/docs/:key", &controllers.DocumentController{}, "*:Index")
|
|
web.Router("/docs/:key/check-password", &controllers.DocumentController{}, "post:CheckPassword")
|
|
web.Router("/docs/:key/:id", &controllers.DocumentController{}, "*:Read")
|
|
web.Router("/docs/:key/search", &controllers.DocumentController{}, "post:Search")
|
|
web.Router("/export/:key", &controllers.DocumentController{}, "*:Export")
|
|
web.Router("/qrcode/:key.png", &controllers.DocumentController{}, "get:QrCode")
|
|
|
|
web.Router("/attach_files/:key/:attach_id", &controllers.DocumentController{}, "get:DownloadAttachment")
|
|
|
|
web.Router("/comment/create", &controllers.CommentController{}, "post:Create")
|
|
web.Router("/comment/delete", &controllers.CommentController{}, "post:Delete")
|
|
web.Router("/comment/lists", &controllers.CommentController{}, "get:Lists")
|
|
web.Router("/comment/index", &controllers.CommentController{}, "*:Index")
|
|
|
|
web.Router("/search", &controllers.SearchController{}, "get:Index")
|
|
|
|
web.Router("/tag/:key", &controllers.LabelController{}, "get:Index")
|
|
web.Router("/tags", &controllers.LabelController{}, "get:List")
|
|
|
|
web.Router("/items", &controllers.ItemsetsController{}, "get:Index")
|
|
web.Router("/items/:key", &controllers.ItemsetsController{}, "get:List")
|
|
|
|
}
|