Skip to content

Commit e34a7d6

Browse files
author
Shugo Kawamura
authored
Merge pull request #2 from FlowingSPDG/hidden-flag
Supported hidden flag "F" (playcast "http://YOUR_GOTV_PLUS" f200)
2 parents fb2aa91 + ec544be commit e34a7d6

File tree

2 files changed

+105
-30
lines changed

2 files changed

+105
-30
lines changed

server/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
grpc "github.com/FlowingSPDG/gotv-plus-go/server/src/grpc"
66
"github.com/FlowingSPDG/gotv-plus-go/server/src/handlers"
77
"github.com/gin-gonic/gin"
8+
"io/ioutil"
89
"log"
910
"net/http"
1011
)
@@ -23,6 +24,8 @@ func init() {
2324
log.Printf("DEBUG MODE : %v\n", *debug)
2425
if *debug == true {
2526
gin.SetMode(gin.ReleaseMode)
27+
} else {
28+
gin.DefaultWriter = ioutil.Discard
2629
}
2730
handlers.InitMatchEngine(*auth, uint32(*delay))
2831
go grpc.StartGRPC(*grpcaddr)

server/src/handlers/handlers.go

Lines changed: 102 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,54 @@ func SyncHandler(c *gin.Context) {
1818
c.String(http.StatusBadRequest, "Unknown Request")
1919
return
2020
}
21+
2122
t := c.Params.ByName("token")
2223
m, err := Matches.GetMatchByToken(t)
2324
if err != nil {
2425
log.Printf("ERR : %v\n", err)
2526
c.String(http.StatusNotFound, "NotFound")
2627
return
2728
}
28-
full, err := m.GetFullFrame(m.Fragment)
29-
delayedfull, err := m.GetFullFrame(m.Fragment - Matches.Delay)
30-
if err != nil {
31-
log.Printf("ERR : %v\n", err)
32-
c.String(http.StatusNotFound, "NotFound")
33-
return
29+
if c.Query("fragment") != "" {
30+
frag, err := strconv.Atoi(c.Query("fragment"))
31+
if err != nil {
32+
c.String(http.StatusBadRequest, "fragment should be int")
33+
return
34+
}
35+
full, err := m.GetFullFrame(m.Fragment)
36+
specifiedfull, err := m.GetFullFrame(uint32(frag))
37+
if err != nil {
38+
log.Printf("ERR : %v\n", err)
39+
c.String(http.StatusNotFound, "NotFound")
40+
return
41+
}
42+
c.JSON(http.StatusOK, gin.H{
43+
"tick": specifiedfull.Tick,
44+
"rtdelay": time.Since(specifiedfull.At).Seconds(),
45+
"rcvage": time.Since(full.At).Seconds(),
46+
"fragment": frag,
47+
"signup_fragment": m.SignupFragment,
48+
"tps": m.Tps,
49+
"protocol": m.Protocol,
50+
})
51+
} else {
52+
full, err := m.GetFullFrame(m.Fragment)
53+
delayedfull, err := m.GetFullFrame(m.Fragment - Matches.Delay)
54+
if err != nil {
55+
log.Printf("ERR : %v\n", err)
56+
c.String(http.StatusNotFound, "NotFound")
57+
return
58+
}
59+
c.JSON(http.StatusOK, gin.H{
60+
"tick": full.Tick,
61+
"rtdelay": time.Since(delayedfull.At).Seconds(),
62+
"rcvage": time.Since(full.At).Seconds(),
63+
"fragment": m.Fragment - Matches.Delay,
64+
"signup_fragment": m.SignupFragment,
65+
"tps": m.Tps,
66+
"protocol": m.Protocol,
67+
})
3468
}
35-
c.JSON(http.StatusOK, gin.H{
36-
"tick": full.Tick,
37-
"rtdelay": time.Since(delayedfull.At).Seconds(),
38-
"rcvage": time.Since(full.At).Seconds(),
39-
"fragment": m.Fragment - Matches.Delay,
40-
"signup_fragment": m.SignupFragment,
41-
"tps": m.Tps,
42-
"protocol": m.Protocol,
43-
})
4469
}
4570

4671
// SyncByIDHandler handlers request against /match/:token/sync by ID
@@ -56,22 +81,46 @@ func SyncByIDHandler(c *gin.Context) {
5681
c.String(http.StatusNotFound, "NotFound")
5782
return
5883
}
59-
full, err := m.GetFullFrame(m.Fragment)
60-
delayedfull, err := m.GetFullFrame(m.Fragment - Matches.Delay)
61-
if err != nil {
62-
log.Printf("ERR : %v\n", err)
63-
c.String(http.StatusNotFound, "NotFound")
64-
return
84+
if c.Query("fragment") != "" {
85+
frag, err := strconv.Atoi(c.Query("fragment"))
86+
if err != nil {
87+
c.String(http.StatusBadRequest, "fragment should be int")
88+
return
89+
}
90+
full, err := m.GetFullFrame(m.Fragment)
91+
specifiedfull, err := m.GetFullFrame(uint32(frag))
92+
if err != nil {
93+
log.Printf("ERR : %v\n", err)
94+
c.String(http.StatusNotFound, "NotFound")
95+
return
96+
}
97+
c.JSON(http.StatusOK, gin.H{
98+
"tick": specifiedfull.Tick,
99+
"rtdelay": time.Since(specifiedfull.At).Seconds(),
100+
"rcvage": time.Since(full.At).Seconds(),
101+
"fragment": frag,
102+
"signup_fragment": m.SignupFragment,
103+
"tps": m.Tps,
104+
"protocol": m.Protocol,
105+
})
106+
} else {
107+
full, err := m.GetFullFrame(m.Fragment)
108+
delayedfull, err := m.GetFullFrame(m.Fragment - Matches.Delay)
109+
if err != nil {
110+
log.Printf("ERR : %v\n", err)
111+
c.String(http.StatusNotFound, "NotFound")
112+
return
113+
}
114+
c.JSON(http.StatusOK, gin.H{
115+
"tick": full.Tick,
116+
"rtdelay": time.Since(delayedfull.At).Seconds(),
117+
"rcvage": time.Since(full.At).Seconds(),
118+
"fragment": m.Fragment - Matches.Delay,
119+
"signup_fragment": m.SignupFragment,
120+
"tps": m.Tps,
121+
"protocol": m.Protocol,
122+
})
65123
}
66-
c.JSON(http.StatusOK, gin.H{
67-
"tick": full.Tick,
68-
"rtdelay": time.Since(delayedfull.At).Seconds(),
69-
"rcvage": time.Since(full.At).Seconds(),
70-
"fragment": m.Fragment - Matches.Delay,
71-
"signup_fragment": m.SignupFragment,
72-
"tps": m.Tps,
73-
"protocol": m.Protocol,
74-
})
75124
}
76125

77126
// GetBodyHandler handles fragment request from CS:GO client
@@ -158,6 +207,7 @@ func PostBodyByIDHandler(c *gin.Context) {
158207
c.String(http.StatusBadRequest, "fragment,tps,protocol should be float or int")
159208
return
160209
}
210+
log.Printf("Received START Fragment. Register match... Token[%s] Tps[%f] Protocol[%d]\n", t, tps, protocol)
161211
Matches.Register(&Match{
162212
ID: id,
163213
Token: t,
@@ -175,6 +225,13 @@ func PostBodyByIDHandler(c *gin.Context) {
175225
// Fragment: uint32(fragment),
176226
})
177227
m, err := Matches.GetMatchByToken(t)
228+
if err != nil {
229+
log.Printf("ERR : %v\n", err)
230+
c.String(http.StatusNotFound, "")
231+
return
232+
}
233+
m.Lock()
234+
defer m.Unlock()
178235
m.Startframe[uint32(fragment)] = &Startframe{
179236
At: time.Now(),
180237
Body: reqBody,
@@ -187,6 +244,8 @@ func PostBodyByIDHandler(c *gin.Context) {
187244
c.String(http.StatusResetContent, "")
188245
return
189246
}
247+
m.Lock()
248+
defer m.Unlock()
190249
tick, err := strconv.Atoi(c.Query("tick"))
191250
if err != nil {
192251
c.String(http.StatusBadRequest, "tick should be float or int")
@@ -209,6 +268,8 @@ func PostBodyByIDHandler(c *gin.Context) {
209268
c.String(http.StatusResetContent, "")
210269
return
211270
}
271+
m.Lock()
272+
defer m.Unlock()
212273
endtick, err := strconv.Atoi(c.Query("endtick"))
213274
if err != nil {
214275
c.String(http.StatusBadRequest, "endtick should be float or int")
@@ -281,6 +342,13 @@ func PostBodyHandler(c *gin.Context) {
281342
// Fragment: uint32(fragment),
282343
})
283344
m, err := Matches.GetMatchByToken(t)
345+
if err != nil {
346+
log.Printf("ERR : %v\n", err)
347+
c.String(http.StatusNotFound, "")
348+
return
349+
}
350+
m.Lock()
351+
defer m.Unlock()
284352
m.Startframe[uint32(fragment)] = &Startframe{
285353
At: time.Now(),
286354
Body: reqBody,
@@ -293,6 +361,8 @@ func PostBodyHandler(c *gin.Context) {
293361
c.String(http.StatusResetContent, "")
294362
return
295363
}
364+
m.Lock()
365+
defer m.Unlock()
296366
tick, err := strconv.Atoi(c.Query("tick"))
297367
if err != nil {
298368
c.String(http.StatusBadRequest, "tick should be float or int")
@@ -315,6 +385,8 @@ func PostBodyHandler(c *gin.Context) {
315385
c.String(http.StatusResetContent, "")
316386
return
317387
}
388+
m.Lock()
389+
defer m.Unlock()
318390
endtick, err := strconv.Atoi(c.Query("endtick"))
319391
if err != nil {
320392
c.String(http.StatusBadRequest, "endtick should be float or int")

0 commit comments

Comments
 (0)