Дмитрий
2 years ago
8 changed files with 226 additions and 1 deletions
@ -0,0 +1,21 @@
|
||||
package clientserver |
||||
|
||||
import ( |
||||
"io" |
||||
"log" |
||||
"net/http" |
||||
"time" |
||||
) |
||||
|
||||
func sendRequest(url string, body *io.Reader) { |
||||
c := &http.Client{ |
||||
Timeout: 200 * time.Millisecond, |
||||
} |
||||
|
||||
resp, err := c.Post(url, "application/json", *body) |
||||
|
||||
if err != nil { |
||||
log.Println(err) |
||||
} |
||||
log.Println(resp) |
||||
} |
@ -0,0 +1,69 @@
|
||||
package clientserver |
||||
|
||||
import ( |
||||
"bytes" |
||||
"encoding/json" |
||||
"io" |
||||
"io/ioutil" |
||||
"log" |
||||
"math" |
||||
"net/http" |
||||
req_types "sample-choose-ad/src/requests_types" |
||||
) |
||||
|
||||
func handleRequest(w http.ResponseWriter, r *http.Request) { |
||||
body, _ := ioutil.ReadAll(r.Body) |
||||
|
||||
var inpReqBody req_types.IncomingRequest |
||||
|
||||
err := json.Unmarshal(body, &inpReqBody) |
||||
|
||||
if err != nil { |
||||
throwHTTPError("WRONG_SCHEMA", 400, &w) |
||||
return |
||||
} |
||||
|
||||
// Check if Id is empty
|
||||
if inpReqBody.Id == nil { |
||||
throwHTTPError("EMPTY_FIELD", 400, &w) |
||||
return |
||||
} |
||||
|
||||
// Check if tiles is empty
|
||||
if len(inpReqBody.Tiles) == 0 { |
||||
throwHTTPError("EMPTY_TILES", 400, &w) |
||||
return |
||||
} |
||||
|
||||
// ipv4 validation
|
||||
if wrongIPAddresFormat(inpReqBody.Context.Ip) { |
||||
throwHTTPError("WRONG_SCHEMA", 400, &w) |
||||
return |
||||
} |
||||
|
||||
// TODO: fix url
|
||||
// TODO: может что то получится сделать с p_body?
|
||||
p_body := constructPartnersRequestBody(&inpReqBody) |
||||
sendRequest("localhost:5059", &p_body) |
||||
|
||||
} |
||||
|
||||
func constructPartnersRequestBody(ir *req_types.IncomingRequest) io.Reader { |
||||
var outReqBody req_types.OutgoingRequest |
||||
|
||||
var imps []req_types.Imp |
||||
|
||||
for _, tile := range ir.Tiles { |
||||
imps = append(imps, req_types.Imp{ |
||||
Id: tile.Id, |
||||
Minwidth: tile.Width, |
||||
Minheight: uint(math.Floor(float64(tile.Width * uint(tile.Ratio))))}) |
||||
} |
||||
|
||||
outReqBody.Id = *ir.Id |
||||
outReqBody.Imp = imps |
||||
outReqBody.Context = ir.Context |
||||
|
||||
t, _ := json.Marshal(outReqBody) |
||||
return bytes.NewReader(t) |
||||
} |
@ -0,0 +1,15 @@
|
||||
package clientserver |
||||
|
||||
import ( |
||||
"fmt" |
||||
"net/http" |
||||
"sync" |
||||
) |
||||
|
||||
func StartServer(port string, wg *sync.WaitGroup) { |
||||
defer wg.Done() |
||||
|
||||
http.HandleFunc("/placements/request", handleRequest) |
||||
|
||||
http.ListenAndServe(fmt.Sprintf(":%v", port), nil) |
||||
} |
@ -0,0 +1,21 @@
|
||||
package clientserver |
||||
|
||||
import ( |
||||
"log" |
||||
"net/http" |
||||
"regexp" |
||||
) |
||||
|
||||
// Returns false if ipv4 `correct`.
|
||||
func wrongIPAddresFormat(ipv4 string) bool { |
||||
re, err := regexp.Compile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`) |
||||
if err != nil { |
||||
log.Println(err) |
||||
} |
||||
return !re.Match([]byte(ipv4)) |
||||
} |
||||
|
||||
func throwHTTPError(err_text string, code int, w *http.ResponseWriter) { |
||||
http.Error(*w, err_text, code) |
||||
log.Printf("Error %d %v\n", code, err_text) |
||||
} |
@ -0,0 +1,54 @@
|
||||
/* |
||||
Usage: |
||||
|
||||
sample-choose-ad [flags] |
||||
|
||||
The flags are: |
||||
-p |
||||
Listening port |
||||
-d |
||||
Adversment partners list in format ip_p1:port,ip_p2:port2...ip_p10:port |
||||
|
||||
|
||||
|
||||
*/ |
||||
package main |
||||
|
||||
import ( |
||||
"flag" |
||||
"log" |
||||
clientserver "sample-choose-ad/src/client_server" |
||||
"sync" |
||||
// req_types "sample-choose-ad/src/requests_types"
|
||||
) |
||||
|
||||
// ============
|
||||
|
||||
func main() { |
||||
var wg sync.WaitGroup |
||||
log.Println("Starting server") |
||||
|
||||
/* |
||||
file := flag.String("f", "", "path to file") |
||||
port := flag.String("p", "5050", "listening port") |
||||
|
||||
flag.Parse() |
||||
|
||||
if *file == "" { |
||||
fmt.Println("Please specify the path to the file!") |
||||
return |
||||
} |
||||
*/ |
||||
port := flag.String("p", "", "-p 5050") |
||||
|
||||
flag.Parse() |
||||
|
||||
if *port == "" { |
||||
log.Println("Port number is require!") |
||||
return |
||||
} |
||||
|
||||
wg.Add(1) |
||||
go clientserver.StartServer(*port, &wg) |
||||
wg.Wait() |
||||
} |
@ -0,0 +1,31 @@
|
||||
package req_types |
||||
|
||||
type Tile struct { |
||||
Id uint `json:"id"` |
||||
Width uint `json:"width"` |
||||
Ratio float64 `json:"ratio"` |
||||
} |
||||
|
||||
type AdContext struct { |
||||
Ip string `json:"ip"` |
||||
UserAgent string `json:"user_agent"` |
||||
} |
||||
|
||||
type IncomingRequest struct { |
||||
Id *string `json:"id"` |
||||
Tiles []Tile `json:"tiles"` |
||||
Context AdContext `json:"context"` |
||||
} |
||||
|
||||
// Based in Tile
|
||||
type Imp struct { |
||||
Id uint `json:"id"` // same as related `Tile.Id`
|
||||
Minwidth uint `json:"minwidth"` // `Tile.Width`
|
||||
Minheight uint `json:"minheight"` // math.Floor(Tile.Width * Tile.Ratio)
|
||||
} |
||||
|
||||
type OutgoingRequest struct { |
||||
Id string `json:"id"` |
||||
Imp []Imp `json:"imp"` |
||||
Context AdContext `json:"context"` |
||||
} |
Loading…
Reference in new issue