/
main.go
92 lines (70 loc) · 1.75 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main
import (
// "fmt"
// "os"
// "strconv"
"./memcache"
"runtime"
"http"
"log"
// "net"
"url"
"io/ioutil"
)
// build mem map
var Repos memcache.MemMap = memcache.MemMap{};
var Client http.Client = http.Client{};
func main() {
runtime.GOMAXPROCS(4);
Repos.InitMap();
http.Handle("/", http.HandlerFunc(handleHttp))
err := http.ListenAndServe("0.0.0.0:12345", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err.String())
}
}
func getNewUrl(url *url.URL) (*url.URL) {
urlBackend, _ := url.Parse("http://127.0.0.1");
url.Scheme = urlBackend.Scheme;
url.Host = urlBackend.Host;
return url;
}
func getContent(url *url.URL, req *http.Request) (*memcache.MemMapItem) {
cacheToken := url.String();
cached := Repos.GetByKey(cacheToken);
if(cached != nil) {
return cached;
}
backendUrl := getNewUrl(url);
newReq := http.Request {
Method : "GET",
RawURL : backendUrl.String(),
URL : backendUrl,
Proto : "HTTP/1.1",
ProtoMajor : 1,
ProtoMinor : 0,
RemoteAddr : "192.168.0.21",
}
newReq.Header = http.Header{};
newReq.Header.Add("Accept", "*/*");
newReq.Header.Add("Accept-Charset", "utf-8,ISO-8859-1;q=0.7,*;q=0.3");
newReq.Header.Add("Accept-Encoding", "utf-8");
newReq.Header.Add("Host", backendUrl.Host);
//newReq = ResponseWriter{};
response, err := Client.Do(&newReq);
if err != nil {
log.Fatal("error: ", err.String())
}
cacheItem := memcache.MemMapItem{Key: cacheToken};
cacheItem.Raw, _ = ioutil.ReadAll(response.Body);
cacheItem.Head = response.Header;
Repos.Add(&cacheItem);
return &cacheItem ;
}
func handleHttp(w http.ResponseWriter, req *http.Request) {
content := getContent(req.URL, req);
for index, it := range content.Head {
w.Header().Set(index, it[0]);
}
w.Write(content.Raw);
}