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,
|
||
}
|
||
}
|