package httpservice import ( "fmt" "github.com/duanhf2012/origin/event" "github.com/duanhf2012/origin/network" "github.com/duanhf2012/origin/service" "github.com/duanhf2012/origin/util/uuid" jsoniter "github.com/json-iterator/go" "io" "io/ioutil" "net/http" "os" "strings" "time" ) var json = jsoniter.ConfigCompatibleWithStandardLibrary var DefaultReadTimeout time.Duration = time.Second*10 var DefaultWriteTimeout time.Duration = time.Second*10 var DefaultProcessTimeout time.Duration = time.Second*10 //http redirect type HttpRedirectData struct { Url string CookieList []*http.Cookie } type HTTP_METHOD int const ( METHOD_NONE HTTP_METHOD = iota METHOD_GET METHOD_POST METHOD_INVALID ) type HttpHandle func(session *HttpSession) type routerMatchData struct { matchURL string httpHandle HttpHandle } type routerServeFileData struct { matchUrl string localPath string method HTTP_METHOD } type IHttpRouter interface { GET(url string, handle HttpHandle) bool POST(url string, handle HttpHandle) bool Router(session *HttpSession) SetServeFile(method HTTP_METHOD, urlpath string, dirname string) error SetFormFileKey(formFileKey string) GetFormFileKey()string AddHttpFiltrate(FiltrateFun HttpFiltrate) bool } type HttpRouter struct { pathRouter map[HTTP_METHOD] map[string] routerMatchData //url地址,对应本service地址 serveFileData map[string] *routerServeFileData httpFiltrateList [] HttpFiltrate formFileKey string } type HttpSession struct { httpRouter IHttpRouter r *http.Request w http.ResponseWriter //parse result mapParam map[string]string body []byte //processor result statusCode int msg []byte fileData *routerServeFileData redirectData *HttpRedirectData sessionDone chan *HttpSession } type HttpService struct { service.Service httpServer network.HttpServer postAliasUrl map[HTTP_METHOD] map[string]routerMatchData //url地址,对应本service地址 httpRouter IHttpRouter listenAddr string corsHeader *CORSHeader processTimeout time.Duration } type HttpFiltrate func(session *HttpSession) bool //true is pass type CORSHeader struct { AllowCORSHeader map[string][]string } func (httpService *HttpService) AddFiltrate(FiltrateFun HttpFiltrate) bool { return httpService.httpRouter.AddHttpFiltrate(FiltrateFun) } func NewHttpHttpRouter() IHttpRouter { httpRouter := &HttpRouter{} httpRouter.pathRouter =map[HTTP_METHOD] map[string] routerMatchData{} httpRouter.serveFileData = map[string] *routerServeFileData{} httpRouter.formFileKey = "file" for i:=METHOD_NONE+1;i