package main
import (
"bytes"
"io"
"io/ioutil"
"log"
"net"
"net/http"
"net/url"
"os"
"os/signal"
"strconv"
"sync"
"syscall"
"time"
"github.com/gorilla/handlers"
"github.com/inconshreveable/log15"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/sourcegraph/sourcegraph/internal/debugserver"
"github.com/sourcegraph/sourcegraph/internal/env"
"github.com/sourcegraph/sourcegraph/internal/logging"
"github.com/sourcegraph/sourcegraph/internal/trace"
"github.com/sourcegraph/sourcegraph/internal/tracer"
)
var logRequests, _ = strconv.ParseBool(env.Get("LOG_REQUESTS", "", "log HTTP requests"))
const port = "3180"
// requestMu ensures we only do one request at a time to prevent tripping abuse detection.
var requestMu sync.Mutex
var metricWaitingRequestsGauge = promauto.NewGauge(prometheus.GaugeOpts{
Name: "github_proxy_waiting_requests",
Help: "Number of proxy requests waiting on the mutex",
})
// list obtained from httputil of headers not to forward.
var hopHeaders = map[string]struct{}{
"Connection": {},
"Proxy-Connection": {}, // non-standard but still sent by libcurl and rejected by e.g. google
"Keep-Alive": {},
"Proxy-Authenticate": {},
"Proxy-Authorization": {},
"Te": {}, // canonicalized version of "TE"
"Trailer": {}, // not Trailers per URL above; http://www.rfc-editor.org/errata_search.php?eid=4522
"Transfer-Encoding": {},
"Upgrade": {},
}
func main() {
env.Lock()
env.HandleHelpFlag()
logging.Init()
tracer.Init()
trace.Init(true)
go func() {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGHUP)