]> Cypherpunks.ru repositories - govpn.git/blob - src/cypherpunks.ru/govpn/server/proxy.go
ad0f75da3f261c970263d0b26049ab3dfdb4f921
[govpn.git] / src / cypherpunks.ru / govpn / server / proxy.go
1 /*
2 GoVPN -- simple secure free software virtual private network daemon
3 Copyright (C) 2014-2016 Sergey Matveev <stargrave@stargrave.org>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 package server
20
21 import (
22         "net/http"
23
24         "github.com/Sirupsen/logrus"
25 )
26
27 type proxyHandler struct {
28         goVpnServer *Server
29 }
30
31 func (p proxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
32         conn, _, err := w.(http.Hijacker).Hijack()
33         if err != nil {
34                 p.goVpnServer.logger.WithError(err).WithFields(
35                         logrus.Fields{
36                                 "func":    logFuncPrefix + "proxyHandler.ServeHTTP",
37                                 "address": p.goVpnServer.configuration.BindAddress,
38                         },
39                 ).Error("Proxy hijack failed")
40                 return
41         }
42         conn.Write([]byte("HTTP/1.0 200 OK\n\n"))
43         go p.goVpnServer.handleTCP(conn)
44 }
45
46 func (s *Server) proxyStart() {
47         fields := logrus.Fields{
48                 "func":    logFuncPrefix + "Server.proxyStart",
49                 "address": s.configuration.BindAddress,
50                 "proxy":   s.configuration.ProxyAddress,
51         }
52         s.logger.WithFields(fields).Info("Proxy Listen")
53         httpServer := &http.Server{
54                 Addr: s.configuration.ProxyAddress,
55                 Handler: proxyHandler{
56                         goVpnServer: s,
57                 },
58         }
59         if err := httpServer.ListenAndServe(); err != nil {
60                 s.logger.WithFields(fields).WithError(err).Error("Proxy failed")
61                 return
62         }
63         s.logger.WithFields(fields).Info("Proxy finished")
64 }