提交 2f541ca4 编写于 作者: yanghye's avatar yanghye

增加内置资源代理 支持HttpServer和本地与内置方式加载资源.

上级 d096eab3
......@@ -12,13 +12,13 @@ package cef
import (
"embed"
"fmt"
. "github.com/energye/energy/v2/consts"
"github.com/energye/energy/v2/logger"
"io/ioutil"
"net/url"
"os"
"path/filepath"
"strings"
"unsafe"
)
......@@ -147,7 +147,7 @@ func (m *LocalLoadResource) checkRequest(request *ICefRequest) (*source, bool) {
return nil, false
}
reqUrl, err := url.Parse(request.URL())
logger.Debug("LocalLoadResource URL:", reqUrl.String())
logger.Debug("LocalLoadResource URL:", reqUrl.String(), "RT:", rt)
if err != nil {
logger.Error("LocalLoadResource, scheme invalid should:", LocalCSFS, "or", LocalCSFile)
return nil, false
......@@ -165,10 +165,10 @@ func (m *LocalLoadResource) checkRequest(request *ICefRequest) (*source, bool) {
path = m.Home
}
ext := m.ext(path)
if ext == "" && rt != RT_XHR {
/*if ext == "" && rt != RT_XHR {
logger.Error("LocalLoadResource Incorrect resources should: file.[ext](MimeType)")
return nil, false
}
}*/
// 如果开启缓存,直接在缓存拿指定地址的source
if m.EnableCache {
if s, ok := m.sourceCache[path]; ok {
......@@ -183,27 +183,23 @@ func (m *LocalLoadResource) checkRequest(request *ICefRequest) (*source, bool) {
}
// 读取本地或内置资源
func (m *source) readFile() bool {
func (m *source) readFile() {
// 必须设置文件根目录, scheme是file时, fileRoot为本地文件目录, scheme是fs时, fileRoot为fs的目录名
if localLoadRes.FileRoot != "" {
if localLoadRes.Scheme == LocalCSFile {
m.bytes, m.err = ioutil.ReadFile(filepath.Join(localLoadRes.FileRoot, m.path))
// 在本地读取
if m.err == nil {
return true
}
if m.err != nil {
logger.Error("ReadFile:", m.err.Error())
}
} else if localLoadRes.Scheme == LocalCSFS && localLoadRes.FS != nil {
//在fs读取
m.bytes, m.err = localLoadRes.FS.ReadFile(localLoadRes.FileRoot + m.path)
if m.err == nil {
return true
}
if m.err != nil {
logger.Error("ReadFile:", m.err.Error())
}
}
//失败时,返回404,文件不存在
return false
}
}
// checkRequest = true, 打开资源
......@@ -220,7 +216,6 @@ func (m *source) open(request *ICefRequest, callback *ICefCallback) (handleReque
m.bytes, m.err = result.Data, err
m.status = result.StatusCode
m.header = result.Header
return true, true
}
} else {
// 如果开启缓存,直接在缓存取
......@@ -231,12 +226,27 @@ func (m *source) open(request *ICefRequest, callback *ICefCallback) (handleReque
} else {
m.readFile()
}
}
if m.err == nil {
m.status = 200
m.statusText = "OK"
} else {
m.statusText = m.err.Error()
// 尝试在代理服务请求资源
if result, err := localLoadRes.Proxy.Send(request); err == nil {
m.bytes, m.err = result.Data, err
m.status = result.StatusCode
m.header = result.Header
// TODO 需要验证 Content-Type 合法性
if ct, ok := result.Header["Content-Type"]; ok {
m.mimeType = ct[0]
} else {
m.mimeType = "text/html"
}
} else {
m.bytes = []byte("Invalid resource request")
m.mimeType = "application/json"
m.statusText = err.Error()
}
}
}
callback.Cont()
return true, true
......@@ -249,8 +259,15 @@ func (m *source) response(response *ICefResponse) (responseLength int64, redirec
response.SetMimeType(m.mimeType)
responseLength = int64(len(m.bytes))
if m.header != nil {
header := StringMultiMapRef.New()
if header.IsValid() {
for key, value := range m.header {
response.SetHeaderByName(key, strings.Join(value, ","), true)
for _, vs := range value {
header.Append(key, vs)
fmt.Println("source response header:", key, "=", vs)
}
}
response.SetHeaderMap(header)
}
}
return
......
......@@ -99,7 +99,7 @@ func (m *XHRProxy) sendHttp(request *ICefRequest) (*XHRProxyResponse, error) {
}
postData.Free()
}
logger.Debug("XHRProxy TargetURL:", targetUrl.String(), "dataLength:", len(requestData.Bytes()))
logger.Debug("XHRProxy TargetURL:", targetUrl.String(), "method:", request.Method(), "dataLength:", len(requestData.Bytes()))
httpRequest, err := http.NewRequest(request.Method(), targetUrl.String(), requestData)
if err != nil {
return nil, err
......@@ -116,7 +116,7 @@ func (m *XHRProxy) sendHttp(request *ICefRequest) (*XHRProxyResponse, error) {
for j := 0; j < int(c); j++ {
value := header.GetEnumerate(key, uint32(j))
httpRequest.Header.Add(key, value)
fmt.Println("XHRProxy header:", key, "=", value)
fmt.Println("XHRProxy Request header:", key, "=", value, "url:", targetUrl.String())
}
}
header.Free()
......@@ -132,13 +132,14 @@ func (m *XHRProxy) sendHttp(request *ICefRequest) (*XHRProxyResponse, error) {
defer httpResponse.Body.Close()
// 读取响应头
responseHeader := make(map[string][]string)
for k, v := range httpResponse.Header {
for _, vs := range v {
if header, ok := responseHeader[k]; ok {
responseHeader[k] = append(header, vs)
for key, value := range httpResponse.Header {
for _, vs := range value {
if header, ok := responseHeader[key]; ok {
responseHeader[key] = append(header, vs)
} else {
responseHeader[k] = []string{vs}
responseHeader[key] = []string{vs}
}
fmt.Println("XHRProxy response header:", key, "=", vs, "url:", targetUrl.String())
}
}
// 读取响应数据
......@@ -150,6 +151,7 @@ func (m *XHRProxy) sendHttp(request *ICefRequest) (*XHRProxyResponse, error) {
StatusCode: int32(httpResponse.StatusCode),
Header: responseHeader,
}
fmt.Println("XHRProxy response result:", result.DataSize, result.StatusCode, "url:", targetUrl.String())
return result, nil
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册