Skip to content

Commit

Permalink
Replace /net/http with fasthttp
Browse files Browse the repository at this point in the history
  • Loading branch information
lucas7788 committed Oct 27, 2017
1 parent ee479b2 commit c3cd88a
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 83 deletions.
31 changes: 13 additions & 18 deletions adhandler/click_handler.go
Original file line number Diff line number Diff line change
@@ -1,30 +1,25 @@
package adhandler

import (
"net/http"
"github.com/valyala/fasthttp"
"strconv"
"github.com/wenweihu86/ad-server/adserver"
"ad-server/adserver"
"encoding/base64"
"fmt"
"net/url"
)

func ClickHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
if len(r.Form["i"]) == 0 {
w.Write([]byte("{\"status\": 1}"))
func ClickHandler(ctx *fasthttp.RequestCtx) {
args := ctx.QueryArgs()
if len(args.Peek("i")) == 0 {
ctx.SetBody([]byte("{\"status\": 1}"))
return
}
i := r.Form["i"][0]
queryStringBytes, err := base64.StdEncoding.DecodeString(i)
if err != nil {
w.Write([]byte("{\"status\": 1}"))
return
}
queryString := string(queryStringBytes)
paramMap, err := url.ParseQuery(queryString)
}
argsVlueBytes := args.Peek("i")
queryStringBytes, err := base64.StdEncoding.DecodeString(string(argsVlueBytes))
paramMap, err := url.ParseQuery(string(queryStringBytes))
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}

Expand All @@ -39,7 +34,7 @@ func ClickHandler(w http.ResponseWriter, r *http.Request) {
if slotIds, exist := paramMap["slot_id"]; exist {
tmpInt, err := strconv.ParseUint(slotIds[0], 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
slotId = uint32(tmpInt)
Expand Down Expand Up @@ -94,5 +89,5 @@ func ClickHandler(w http.ResponseWriter, r *http.Request) {
adserver.ClickLog.Info(fmt.Sprintf(
"click=1 searchId=%s slotId=%d ip=%s deviceId=%s os=%d osVersion=%s unit_id=%d creativeId=%d",
searchId, slotId, ip, deviceId, os, osVersion, unitId, creativeId))
http.Redirect(w, r, clickUrl, http.StatusFound)
ctx.Redirect(clickUrl, fasthttp.StatusFound)
}
32 changes: 16 additions & 16 deletions adhandler/conversion_handler.go
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
package adhandler

import (
"net/http"
"github.com/valyala/fasthttp"
"strconv"
"github.com/wenweihu86/ad-server/adserver"
"ad-server/adserver"
"encoding/base64"
"fmt"
"net/url"
)

// 转化监控handler
func ConversionHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
if len(r.Form["i"]) == 0 {
w.Write([]byte("{\"status\": 1}"))
func ConversionHandler(ctx *fasthttp.RequestCtx) {
args := ctx.QueryArgs()
if len(args.Peek("i")) == 0 {
ctx.SetBody([]byte("{\"status\": 1}"))
return
}
i := r.Form["i"][0]
queryStringBytes, err := base64.StdEncoding.DecodeString(i)
}
argsValueBytes := args.Peek("i")
queryStringBytes, err := base64.StdEncoding.DecodeString(string(argsValueBytes))
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
queryString := string(queryStringBytes)
paramMap, err := url.ParseQuery(queryString)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}

Expand All @@ -40,7 +40,7 @@ func ConversionHandler(w http.ResponseWriter, r *http.Request) {
if slotIds, exist := paramMap["slot_id"]; exist {
tmpInt, err := strconv.ParseUint(slotIds[0], 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
slotId = uint32(tmpInt)
Expand All @@ -63,7 +63,7 @@ func ConversionHandler(w http.ResponseWriter, r *http.Request) {
if osString, exist := paramMap["os"]; exist {
tmpInt, err := strconv.ParseUint(osString[0], 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
os = uint32(tmpInt)
Expand All @@ -80,7 +80,7 @@ func ConversionHandler(w http.ResponseWriter, r *http.Request) {
if unitIdString, exist := paramMap["unit_id"]; exist {
tmpInt, err := strconv.ParseUint(unitIdString[0], 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
unitId = uint32(tmpInt)
Expand All @@ -91,7 +91,7 @@ func ConversionHandler(w http.ResponseWriter, r *http.Request) {
if creativeIdString, exist := paramMap["creative_id"]; exist {
tmp, err := strconv.ParseUint(creativeIdString[0], 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
creativeId = uint32(tmp)
Expand All @@ -101,5 +101,5 @@ func ConversionHandler(w http.ResponseWriter, r *http.Request) {
"conversion=1 searchId=%s slotId=%d ip=%s deviceId=%s os=%d osVersion=%s unit_id=%d creativeId=%d",
searchId, slotId, ip, deviceId, os, osVersion, unitId, creativeId))
res := "{\"status\": 0}"
w.Write([]byte(res))
ctx.SetBody([]byte(res))
}
32 changes: 16 additions & 16 deletions adhandler/impression_handler.go
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
package adhandler

import (
"net/http"
"github.com/valyala/fasthttp"
"strconv"
"github.com/wenweihu86/ad-server/adserver"
"ad-server/adserver"
"encoding/base64"
"fmt"
"net/url"
)

// 展现监控handler
func ImpressionHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
if len(r.Form["i"]) == 0 {
w.Write([]byte("{\"status\": 1}"))
func ImpressionHandler(ctx *fasthttp.RequestCtx) {
args := ctx.QueryArgs()
if len(args.Peek("i")) == 0 {
ctx.SetBody([]byte("{\"status\": 1}"))
return
}
i := r.Form["i"][0]
queryStringBytes, err := base64.StdEncoding.DecodeString(i)
}
argsValueBytes := args.Peek("i")
queryStringBytes, err := base64.StdEncoding.DecodeString(string(argsValueBytes))
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
queryString := string(queryStringBytes)
paramMap, err := url.ParseQuery(queryString)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}

Expand All @@ -40,7 +40,7 @@ func ImpressionHandler(w http.ResponseWriter, r *http.Request) {
if slotIds, exist := paramMap["slot_id"]; exist {
tmpInt, err := strconv.ParseUint(slotIds[0], 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
slotId = uint32(tmpInt)
Expand All @@ -63,7 +63,7 @@ func ImpressionHandler(w http.ResponseWriter, r *http.Request) {
if osString, exist := paramMap["os"]; exist {
tmpInt, err := strconv.ParseUint(osString[0], 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
os = uint32(tmpInt)
Expand All @@ -80,7 +80,7 @@ func ImpressionHandler(w http.ResponseWriter, r *http.Request) {
if unitIdString, exist := paramMap["unit_id"]; exist {
tmpInt, err := strconv.ParseUint(unitIdString[0], 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
unitId = uint32(tmpInt)
Expand All @@ -91,7 +91,7 @@ func ImpressionHandler(w http.ResponseWriter, r *http.Request) {
if creativeIdString, exist := paramMap["creative_id"]; exist {
tmp, err := strconv.ParseUint(creativeIdString[0], 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
creativeId = uint32(tmp)
Expand All @@ -101,5 +101,5 @@ func ImpressionHandler(w http.ResponseWriter, r *http.Request) {
"impression=1 searchId=%s slotId=%d ip=%s deviceId=%s os=%d osVersion=%s unit_id=%d creativeId=%d",
searchId, slotId, ip, deviceId, os, osVersion, unitId, creativeId))
res := "{\"status\": 0}"
w.Write([]byte(res))
ctx.SetBody([]byte(res))
}
42 changes: 21 additions & 21 deletions adhandler/search_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,59 +2,59 @@ package adhandler

import (
"encoding/json"
"net/http"
"github.com/valyala/fasthttp"
"strconv"
"time"
"math/rand"
"github.com/wenweihu86/ad-server/adserver"
"ad-server/adserver"
"strings"
"fmt"
"bytes"
"encoding/base64"
"github.com/satori/go.uuid"
)

func SearchHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
func SearchHandler(ctx *fasthttp.RequestCtx) {
args := ctx.QueryArgs()
req := new(adserver.Request)
// slot_id
if len(r.Form["slot_id"]) > 0 {
slotId, err := strconv.ParseUint(r.Form["slot_id"][0], 10, 32)
if len(args.Peek("slot_id")) > 0 {
slotId, err := strconv.ParseUint(string(args.Peek("slot_id")), 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
req.SlotId = uint32(slotId)
}
// ad_num
if len(r.Form["ad_num"]) > 0 {
reqAdNum, err := strconv.ParseUint(r.Form["ad_num"][0], 10, 32)
if len(args.Peek("ad_num")) > 0 {
reqAdNum, err := strconv.ParseUint(string(args.Peek("ad_num")), 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
req.ReqAdNum = uint32(reqAdNum)
}
// ip
if len(r.Form["ip"]) > 0 {
req.Ip = r.Form["ip"][0]
if len(args.Peek("ip")) > 0 {
req.Ip = string(args.Peek("ip"))
}
// device_id
if len(r.Form["device_id"]) > 0 {
req.DeviceId = r.Form["device_id"][0]
if len(args.Peek("device_id")) > 0 {
req.DeviceId = string(args.Peek("device_id"))
}
// os
if len(r.Form["os"]) > 0 {
os, err := strconv.ParseUint(r.Form["os"][0], 10, 32)
if len(args.Peek("os")) > 0 {
os, err := strconv.ParseUint(string(args.Peek("os")), 10, 32)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
req.Os = uint32(os)
}
// os_version
if len(r.Form["os_version"]) > 0 {
req.OsVersion = r.Form["os_version"][0]
if len(args.Peek("os_version")) > 0 {
req.OsVersion = string(args.Peek("os_version"))
}

// searchId
Expand Down Expand Up @@ -149,10 +149,10 @@ func SearchHandler(w http.ResponseWriter, r *http.Request) {

resBytes, err := json.Marshal(res)
if err != nil {
w.Write([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
ctx.SetBody([]byte("{\"status\": 1," + "\"error\":" + err.Error() + "}"))
return
}
w.Write(resBytes)
ctx.SetBody(resBytes)
}

func buildImpressionTrackUrl(req *adserver.Request, adInfo adserver.AdInfo) string {
Expand Down
2 changes: 1 addition & 1 deletion adserver/location_dict.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"bufio"
"strconv"
"sort"
"github.com/wenweihu86/ad-server/utils"
"ad-server/utils"
"time"
)

Expand Down
31 changes: 20 additions & 11 deletions main/main.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package main

import (
"net/http"
"github.com/wenweihu86/ad-server/adserver"
"github.com/wenweihu86/ad-server/adhandler"
"strconv"
"ad-server/adserver"
"ad-server/adhandler"
"os"
"github.com/valyala/fasthttp"
"strconv"
)

func main() {
Expand All @@ -18,7 +18,6 @@ func main() {
}
adserver.LocationDict.StartReloadTimer()


// 初始化并加载广告信息
adserver.AdDictObject = adserver.NewAdDict(adserver.GlobalConfObject.AdFileName)
err = adserver.AdDictObject.Load()
Expand All @@ -27,10 +26,20 @@ func main() {
}
adserver.AdDictObject.StartReloadTimer()

http.HandleFunc("/ad/search", adhandler.SearchHandler)
http.HandleFunc("/ad/impression",adhandler.ImpressionHandler)
http.HandleFunc("/ad/click",adhandler.ClickHandler)
http.HandleFunc("/ad/conversion",adhandler.ConversionHandler)
listenPort := ":" + strconv.Itoa(adserver.GlobalConfObject.AdServerPort)
http.ListenAndServe(listenPort, nil)
requestHandler := func(ctx *fasthttp.RequestCtx) {
switch string(ctx.Path()) {
case "/ad/search":
adhandler.SearchHandler(ctx)
case "/ad/impression":
adhandler.ImpressionHandler(ctx)
case "/ad/click":
adhandler.ClickHandler(ctx)
case "/ad/conversion":
adhandler.ConversionHandler(ctx)
default:
ctx.Error("Unsupported path", fasthttp.StatusNotFound)
}
}
listenPort := ":" + strconv.Itoa(adserver.GlobalConfObject.AdServerPort)
fasthttp.ListenAndServe(listenPort, requestHandler)
}

0 comments on commit c3cd88a

Please sign in to comment.