forked from bg5sbk/Go-Flash-Socket-Policy-File-Server
/
main.go
73 lines (58 loc) · 1.29 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package main
import (
"flag"
"io"
"io/ioutil"
"log"
"net"
"time"
)
var (
addr = flag.String("addr", "0.0.0.0:843", "address")
file = flag.String("file", "", "the socket policy file")
request = []byte("<policy-file-request/>\x00")
response = []byte("<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\x00")
buf = make([]byte, len(request))
readWriteLimit = 5 * time.Second
)
func main() {
flag.Parse()
var err error
if *file != "" {
response, err = ioutil.ReadFile(*file)
if err != nil {
log.Fatal(err)
}
response = append(response, 0)
}
run(make(chan bool, 1))
}
func run(startedChan chan bool) {
tcpAddr, err := net.ResolveTCPAddr("tcp", *addr)
if err != nil {
log.Fatal(err)
}
listner, err := net.ListenTCP("tcp", tcpAddr)
if err != nil {
log.Fatal(err)
}
startedChan <- true
log.Print("=== Flash Socket Policy File Server ===")
for {
conn, err := listner.AcceptTCP()
if err == nil {
go loop(conn)
}
}
}
func loop(conn *net.TCPConn) {
defer conn.Close()
conn.SetLinger(5)
conn.SetKeepAlive(false)
conn.SetNoDelay(true)
now := time.Now()
conn.SetReadDeadline(now.Add(readWriteLimit))
if _, err := io.ReadFull(conn, buf); err == nil {
conn.Write(response)
}
}