2 GoVPN -- simple secure free software virtual private network daemon
3 Copyright (C) 2014-2016 Sergey Matveev <stargrave@stargrave.org>
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.
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.
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/>.
24 "github.com/Sirupsen/logrus"
27 type proxyHandler struct {
31 func (p proxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
32 conn, _, err := w.(http.Hijacker).Hijack()
34 p.goVpnServer.logger.WithError(err).WithFields(
36 "func": logFuncPrefix + "proxyHandler.ServeHTTP",
37 "address": p.goVpnServer.configuration.BindAddress,
39 ).Error("Proxy hijack failed")
42 conn.Write([]byte("HTTP/1.0 200 OK\n\n"))
43 go p.goVpnServer.handleTCP(conn)
46 func (s *Server) proxyStart() {
47 fields := logrus.Fields{
48 "func": logFuncPrefix + "Server.proxyStart",
49 "address": s.configuration.BindAddress,
50 "proxy": s.configuration.ProxyAddress,
52 s.logger.WithFields(fields).Info("Proxy Listen")
53 httpServer := &http.Server{
54 Addr: s.configuration.ProxyAddress,
55 Handler: proxyHandler{
59 if err := httpServer.ListenAndServe(); err != nil {
60 s.logger.WithFields(fields).WithError(err).Error("Proxy failed")
63 s.logger.WithFields(fields).Info("Proxy finished")