@@ -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