diff --git a/src/main.go b/src/main.go index 6937fad..672fcc1 100644 --- a/src/main.go +++ b/src/main.go @@ -18,7 +18,6 @@ package main import ( "flag" - "fmt" "io" "os" "path/filepath" @@ -27,7 +26,13 @@ import ( "unbewohnte/gochat/server" ) -const version string = "0.1.0" +const version string = "0.1.1" + +var ( + port *uint = flag.Uint("port", 8080, "Set working port") + tlsKeyFile *string = flag.String("tlsKeyFile", "", "Specify tls key file") + tlsCertFile *string = flag.String("tlsCertFile", "", "Specify tls cert file") +) func main() { // set up logging @@ -55,18 +60,13 @@ func main() { log.SetOutput(os.Stdout) } - // work out launch flags - var port uint - flag.UintVar(&port, "port", 8080, "Set working port") - flag.Usage = func() { - fmt.Printf("gochat v%s\n\nFlags\nport [uint] -> specify a port number (default: 8080)\n\n(c) Unbewohnte (Kasyanov Nikolay Alexeyevich)\n", version) - } + // parse flags flag.Parse() const dbFilename string = "gochat.db" dbPath := filepath.Join(exeDirPath, dbFilename) - server, err := server.New(exeDirPath, dbPath, port) + server, err := server.New(exeDirPath, dbPath, *port, *tlsKeyFile, *tlsCertFile) if err != nil { log.Error("could not create a new server instance: %s", err) } diff --git a/src/server/attachmentHandler.go b/src/server/attachmentHandler.go index b9954ef..cee24a9 100644 --- a/src/server/attachmentHandler.go +++ b/src/server/attachmentHandler.go @@ -102,7 +102,7 @@ func manageAttachmentsStorage(attachmentsDirPath string, sizeLimit uint64, check } if dirSize > sizeLimit { - // A cleanup ! + // cleanup ! os.Remove(oldestAttachmentPath) log.Info( "removed %s during attachments storage management. Cleared %d bytes", diff --git a/src/page/page.go b/src/server/page.go similarity index 90% rename from src/page/page.go rename to src/server/page.go index 1a45d8f..ea33d38 100644 --- a/src/page/page.go +++ b/src/server/page.go @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -package page +package server import ( "html/template" @@ -22,7 +22,7 @@ import ( ) // Parse files in pagesDir and return a ready-to-render template -func Get(pagesDir string, base string, pagename string) (*template.Template, error) { +func GetPage(pagesDir string, base string, pagename string) (*template.Template, error) { page, err := template.ParseFiles(filepath.Join(pagesDir, base), filepath.Join(pagesDir, pagename)) if err != nil { return nil, err diff --git a/src/server/server.go b/src/server/server.go index f8d3ce7..bc6fef7 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -26,12 +26,13 @@ import ( "unbewohnte/gochat/api" "unbewohnte/gochat/log" - "unbewohnte/gochat/page" ) // Server structure that glues api logic and http/websocket server together type Server struct { workingDir string + keyFile string + certFile string http *http.Server db *api.DB websockets *api.WSHolder @@ -46,8 +47,10 @@ const ( ) // Create a new configured and ready-to-launch server -func New(workingDir string, dbPath string, port uint) (*Server, error) { +func New(workingDir string, dbPath string, port uint, keyFile string, certFile string) (*Server, error) { var server = Server{ + keyFile: keyFile, + certFile: certFile, workingDir: workingDir, websockets: &api.WSHolder{}, incomingMessages: make(chan api.Message), @@ -85,7 +88,7 @@ func New(workingDir string, dbPath string, port uint) (*Server, error) { serveMux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { switch req.URL.Path { case "/": - requestedPage, err := page.Get(pagesDirPath, "base.html", "index.html") + requestedPage, err := GetPage(pagesDirPath, "base.html", "index.html") if err != nil { log.Error("error getting page on route %s: %s", req.URL.Path, err) http.Error(w, "internal server error", http.StatusInternalServerError) @@ -100,7 +103,7 @@ func New(workingDir string, dbPath string, port uint) (*Server, error) { return } - requestedPage, err := page.Get(pagesDirPath, "base.html", req.URL.Path[1:]+".html") + requestedPage, err := GetPage(pagesDirPath, "base.html", req.URL.Path[1:]+".html") if err != nil { log.Error("error getting page on route %s: %s", req.URL.Path, err) http.Error(w, "internal server error", http.StatusInternalServerError) @@ -124,6 +127,8 @@ func New(workingDir string, dbPath string, port uint) (*Server, error) { } server.http = &httpServer + log.Info("Created server instance") + return &server, nil } @@ -135,9 +140,23 @@ func (s *Server) Start() { // clean attachments storage from time to time // max attachment filesize * 50 is the limit, check every 5 sec go manageAttachmentsStorage(filepath.Join(s.workingDir, attachmentsDirName), api.MaxAttachmentSize*50, time.Second*5) - // fire up a server - err := s.http.ListenAndServe() - if err != nil { - log.Error("FATAL server error: %s", err) + + // fire up either a TLS or non-TLS server + if s.keyFile != "" && s.certFile != "" { + log.Info("Using TLS") + log.Info("Working on %s", s.http.Addr) + + err := s.http.ListenAndServeTLS(s.certFile, s.keyFile) + if err != nil { + log.Error("Fatal server error: %s", err) + } + } else { + log.Info("Not using TLS") + log.Info("Working on %s", s.http.Addr) + + err := s.http.ListenAndServe() + if err != nil { + log.Error("Fatal server error: %s", err) + } } }