Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-pages.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Trzcinski <ayufan@ayufan.eu>2016-01-07 19:37:59 +0300
committerKamil Trzcinski <ayufan@ayufan.eu>2016-01-07 19:37:59 +0300
commitd7dc7ed7201437a3f450bd783800386e01d62661 (patch)
tree8053829c7ba64208917aaf599a912483a4509b95 /main.go
parent61debe70052f5da9e32acdb4d695ccf56991df9f (diff)
Add simple GitLab Pages daemon with custom CNAME and TLS support
Diffstat (limited to 'main.go')
-rw-r--r--main.go105
1 files changed, 105 insertions, 0 deletions
diff --git a/main.go b/main.go
index e69de29b..5e5c6a90 100644
--- a/main.go
+++ b/main.go
@@ -0,0 +1,105 @@
+package main
+
+import (
+ "crypto/tls"
+ "flag"
+ "fmt"
+ "log"
+ "net/http"
+ "strings"
+ "sync"
+)
+
+var listenHTTP = flag.String("listen-http", ":80", "The address to listen for HTTP requests")
+var listenHTTPS = flag.String("listen-https", "", "The address to listen for HTTPS requests")
+var pagesDomain = flag.String("pages-domain", "gitlab-example.com", "The domain to serve static pages")
+var pagesRootCert = flag.String("root-cert", "", "The default certificate to serve static pages")
+var pagesRootKey = flag.String("root-key", "", "The default certificate to serve static pages")
+var serverHTTP = flag.Bool("serve-http", true, "Serve the pages under HTTP")
+var http2proto = flag.Bool("http2", true, "Enable HTTP2 support")
+var pagesRoot = flag.String("pages-root", "shared/pages", "The directory where pages are stored")
+
+type theApp struct {
+ domains domains
+}
+
+func (a *theApp) ServeTLS(ch *tls.ClientHelloInfo) (*tls.Certificate, error) {
+ if ch.ServerName == "" {
+ return nil, nil
+ }
+
+ host := strings.ToLower(ch.ServerName)
+ if domain, ok := a.domains[host]; ok {
+ tls, _ := domain.ensureCertificate()
+ return tls, nil
+ }
+
+ return nil, nil
+}
+
+func (a *theApp) ServeHTTP(ww http.ResponseWriter, r *http.Request) {
+ w := newLoggingResponseWriter(ww)
+ defer w.Log(r)
+
+ // Add auto redirect
+ if r.TLS == nil && !*serverHTTP {
+ u := *r.URL
+ u.Scheme = "https"
+ u.Host = r.Host
+ u.User = nil
+
+ http.Redirect(&w, r, u.String(), 307)
+ return
+ }
+
+ host := strings.ToLower(r.Host)
+ domain, ok := a.domains[host]
+
+ if !ok {
+ http.NotFound(&w, r)
+ return
+ }
+
+ // Serve static file
+ domain.ServeHTTP(&w, r)
+}
+
+func (a *theApp) UpdateDomains(domains domains) {
+ fmt.Printf("Domains: %v", domains)
+ a.domains = domains
+}
+
+func main() {
+ var wg sync.WaitGroup
+ var app theApp
+
+ flag.Parse()
+
+ // Listen for HTTP
+ if *listenHTTP != "" {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ err := ListenAndServe(*listenHTTP, &app)
+ if err != nil {
+ log.Fatal(err)
+ }
+ }()
+ }
+
+ // Listen for HTTPS
+ if *listenHTTPS != "" {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ err := ListenAndServeTLS(*listenHTTPS, *pagesRootCert, *pagesRootKey, &app)
+ if err != nil {
+ log.Fatal(err)
+ }
+ }()
+ }
+
+ go watchDomains(app.UpdateDomains)
+
+ wg.Wait()
+}