diff --git a/cmd/web.go b/cmd/web.go
index ecaf74daa..7ba7a7ded 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -5,7 +5,6 @@
 package cmd
 
 import (
-	"crypto/tls"
 	"fmt"
 	"net"
 	"net/http"
@@ -31,7 +30,6 @@ import (
 	"code.gitea.io/gitea/routers/repo"
 	"code.gitea.io/gitea/routers/user"
 
-	"github.com/facebookgo/grace/gracehttp"
 	"github.com/go-macaron/binding"
 	"github.com/go-macaron/cache"
 	"github.com/go-macaron/captcha"
@@ -616,29 +614,9 @@ func runWeb(ctx *cli.Context) error {
 	var err error
 	switch setting.Protocol {
 	case setting.HTTP:
-		err = gracehttp.Serve(&http.Server{
-			Addr:    listenAddr,
-			Handler: m,
-		})
+		err = runHTTP(listenAddr, m)
 	case setting.HTTPS:
-		config := &tls.Config{
-			MinVersion: tls.VersionTLS10,
-		}
-		if config.NextProtos == nil {
-			config.NextProtos = []string{"http/1.1"}
-		}
-
-		config.Certificates = make([]tls.Certificate, 1)
-		config.Certificates[0], err = tls.LoadX509KeyPair(setting.CertFile, setting.KeyFile)
-		if err != nil {
-			log.Fatal(4, "Failed to load https cert file %s: %v", listenAddr, err)
-		}
-
-		err = gracehttp.Serve(&http.Server{
-			Addr:      listenAddr,
-			Handler:   m,
-			TLSConfig: config,
-		})
+		err = runHTTPS(listenAddr, setting.CertFile, setting.KeyFile, m)
 	case setting.FCGI:
 		err = fcgi.Serve(nil, m)
 	case setting.UnixSocket:
diff --git a/cmd/web_graceful.go b/cmd/web_graceful.go
new file mode 100644
index 000000000..488cd4036
--- /dev/null
+++ b/cmd/web_graceful.go
@@ -0,0 +1,44 @@
+// +build !windows
+
+// Copyright 2016 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package cmd
+
+import (
+	"crypto/tls"
+	"log"
+	"net/http"
+
+	"github.com/facebookgo/grace/gracehttp"
+)
+
+func runHTTP(listenAddr string, m http.Handler) error {
+	return gracehttp.Serve(&http.Server{
+		Addr:    listenAddr,
+		Handler: m,
+	})
+}
+
+func runHTTPS(listenAddr, certFile, keyFile string, m http.Handler) error {
+	config := &tls.Config{
+		MinVersion: tls.VersionTLS10,
+	}
+	if config.NextProtos == nil {
+		config.NextProtos = []string{"http/1.1"}
+	}
+
+	config.Certificates = make([]tls.Certificate, 1)
+	var err error
+	config.Certificates[0], err = tls.LoadX509KeyPair(certFile, keyFile)
+	if err != nil {
+		log.Fatal(4, "Failed to load https cert file %s: %v", listenAddr, err)
+	}
+
+	return gracehttp.Serve(&http.Server{
+		Addr:      listenAddr,
+		Handler:   m,
+		TLSConfig: config,
+	})
+}
diff --git a/cmd/web_windows.go b/cmd/web_windows.go
new file mode 100644
index 000000000..0fc6cbea0
--- /dev/null
+++ b/cmd/web_windows.go
@@ -0,0 +1,19 @@
+// +build windows
+
+// Copyright 2016 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package cmd
+
+import (
+	"net/http"
+)
+
+func runHTTP(listenAddr string, m http.Handler) error {
+	return http.ListenAndServe(listenAddr, m)
+}
+
+func runHTTPS(listenAddr, certFile, keyFile string, m http.Handler) error {
+	return http.ListenAndServeTLS(listenAddr, certFile, keyFile, m)
+}