177 lines
3.5 KiB
Go
177 lines
3.5 KiB
Go
|
|
package server_http
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"encoding/json"
|
|||
|
|
"framework/ipMgr"
|
|||
|
|
"io/ioutil"
|
|||
|
|
"net/http"
|
|||
|
|
|
|||
|
|
. "common/model"
|
|||
|
|
"goutil/debugUtil"
|
|||
|
|
"goutil/logUtil"
|
|||
|
|
"goutil/webUtil"
|
|||
|
|
"goutil/zlibUtil"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 请求上下文对象
|
|||
|
|
type Context struct {
|
|||
|
|
// 请求对象
|
|||
|
|
*http.Request
|
|||
|
|
|
|||
|
|
// 应答写对象
|
|||
|
|
http.ResponseWriter
|
|||
|
|
|
|||
|
|
// 请求数据
|
|||
|
|
requestBytes []byte
|
|||
|
|
|
|||
|
|
// 数据是否已经解析数据
|
|||
|
|
ifDataParsed bool
|
|||
|
|
|
|||
|
|
// Form的数据是否已经解析
|
|||
|
|
ifFormParsed bool
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查IP是否合法
|
|||
|
|
func (this *Context) checkIP() *ResultStatus {
|
|||
|
|
if debugUtil.IsDebug() == false && ipMgr.IsIpValid(webUtil.GetRequestIP(this.Request)) == false {
|
|||
|
|
return InvalidIP
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return Success
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (this *Context) GetFormValue(key string) (value string, exists bool) {
|
|||
|
|
defer func() {
|
|||
|
|
this.ifFormParsed = true
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
if !this.ifFormParsed {
|
|||
|
|
this.Request.ParseForm()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
values := this.Form[key]
|
|||
|
|
if values != nil && len(values) > 0 {
|
|||
|
|
value = values[0]
|
|||
|
|
exists = true
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 转换内容
|
|||
|
|
func (this *Context) parseContent() error {
|
|||
|
|
defer func() {
|
|||
|
|
this.Body.Close()
|
|||
|
|
this.ifDataParsed = true
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
data, err := ioutil.ReadAll(this.Body)
|
|||
|
|
if err != nil {
|
|||
|
|
logUtil.ErrorLog("url:%s,读取数据出错,错误信息为:%s", this.RequestURI, err)
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.requestBytes = data
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取请求字节数据
|
|||
|
|
// 返回值:
|
|||
|
|
// []byte:请求字节数组
|
|||
|
|
// error:错误信息
|
|||
|
|
func (this *Context) GetRequestBytes(isCompressed bool) (result []byte, exists bool, err error) {
|
|||
|
|
if this.ifDataParsed == false {
|
|||
|
|
this.parseContent()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
data := this.requestBytes
|
|||
|
|
if data == nil || len(data) <= 0 {
|
|||
|
|
return
|
|||
|
|
} else {
|
|||
|
|
exists = true
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if isCompressed {
|
|||
|
|
result, err = zlibUtil.Decompress(data)
|
|||
|
|
if err != nil {
|
|||
|
|
logUtil.ErrorLog("解压缩请求数据失败:%s", err)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
result = data
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取请求字符串数据
|
|||
|
|
// 返回值:
|
|||
|
|
// 请求字符串数据
|
|||
|
|
func (this *Context) GetRequestString(isCompressed bool) (result string, exists bool, err error) {
|
|||
|
|
var data []byte
|
|||
|
|
data, exists, err = this.GetRequestBytes(isCompressed)
|
|||
|
|
if err != nil || !exists {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
result = string(data)
|
|||
|
|
exists = true
|
|||
|
|
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Unmarshal 反序列化
|
|||
|
|
// moduleName:模块名称
|
|||
|
|
// obj:反序列化结果数据
|
|||
|
|
// isCompressed:数据是否已经被压缩
|
|||
|
|
// 返回值:
|
|||
|
|
// 错误对象
|
|||
|
|
func (this *Context) Unmarshal(moduleName string, obj interface{}, isCompressed bool) (exists bool, err error) {
|
|||
|
|
var data []byte
|
|||
|
|
data, exists, err = this.GetRequestBytes(isCompressed)
|
|||
|
|
if err != nil || !exists {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 反序列化
|
|||
|
|
if err = json.Unmarshal(data, &obj); err != nil {
|
|||
|
|
logUtil.ErrorLog("Module:%s, 反序列化%s出错,错误信息为:%s", moduleName, string(data), err)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
debugUtil.Printf("接收到GM登录数据data:%v", string(data))
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 输出字符串
|
|||
|
|
func (this *Context) WriteString(result string) {
|
|||
|
|
this.ResponseWriter.Write([]byte(result))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 输出json数据
|
|||
|
|
func (this *Context) WriteJson(result interface{}) {
|
|||
|
|
if bytes, err := json.Marshal(result); err == nil {
|
|||
|
|
this.ResponseWriter.Write(bytes)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 跳转到其它页面
|
|||
|
|
func (this *Context) RedirectTo(url string) {
|
|||
|
|
this.ResponseWriter.Header().Set("Location", url)
|
|||
|
|
this.ResponseWriter.WriteHeader(301)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 新建API上下文对象
|
|||
|
|
// request:请求对象
|
|||
|
|
// responseWriter:应答写对象
|
|||
|
|
// 返回值:
|
|||
|
|
// *Context:上下文
|
|||
|
|
func newContext(request *http.Request, responseWriter http.ResponseWriter) *Context {
|
|||
|
|
return &Context{
|
|||
|
|
Request: request,
|
|||
|
|
ResponseWriter: responseWriter,
|
|||
|
|
}
|
|||
|
|
}
|