view go/server.go @ 10:36811fd22bd2

v1.4
author pyon@macmini
date Thu, 08 Nov 2018 19:15:43 +0900
parents 82f9af6aa7e4
children 240752cbe11b
line wrap: on
line source

/*
 server.go  : server-program.
 Version    : 1.1
 Last Change: 2018-10-29 月 14:58:19.

 install to: server_root/

 server_root/server
            + db/
            + release/
            + images/
*/
package main

import(
    "path/filepath"
	"fmt"
	"io"
	"log"
	"net"
    "net/http"
	"os"
	"time"
)

var (
	version string
	server string
	port   string
	server_root string
	logfile string
)

func init() {
	version = "1.2"	// log version
	port = ":3910"
    server_root = filepath.Dir( os.Args[0] )
	logfile = filepath.Join( server_root, "rsearcher.log" )
}

func main() {

	// setting IP-Address & Port
	addrs, err := net.InterfaceAddrs()
	if err != nil {
		log.Fatal( err )
	}
	for _, a := range addrs {
		if ipnet, ok := a.( *net.IPNet ); ok && !ipnet.IP.IsLoopback() {
			if ipnet.IP.To4() != nil {
				server = ipnet.IP.String() + port
			}
		}
	}

	// start Web-server
	fmt.Println( "server start [", server, "] ( program version", version, ")" )
	http.HandleFunc( "/",       handler        )
	http.HandleFunc( "/upload", upload_handler )
	log.Fatal( http.ListenAndServe( server, nil ) )
}

func handler( w http.ResponseWriter, r *http.Request ) {
	file := filepath.Join( server_root, filepath.FromSlash( r.URL.Path ) )

	fmt.Println( "[access]", r.RemoteAddr, "|", time.Now().Format( "2006-01-02 15:04" ), "|", file )
	write_log( "[access] " + r.RemoteAddr + " " + file )

	f, err := os.Open( file )
	if err != nil {
		http.NotFound( w, r )
		return
	}
	defer f.Close()

	fi, _ := f.Stat()

	w.Header().Set( "Content-Type",   "rsearcher/octet-stream" )
	w.Header().Set( "Content-Length", fmt.Sprintf( "%d", fi.Size() ) )
	io.Copy( w, f )
}

func upload_handler( w http.ResponseWriter, r *http.Request ) {
	fmt.Println( "[access]", r.RemoteAddr, "|", time.Now().Format( "2006-01-02 15:04" ), "|", "/upload" )
	now := time.Now().Format( "20060102_150405" )
	file := filepath.Join( server_root, "upload", now )
	f, err := os.Create( file )
	if err != nil {
		http.NotFound( w, r )
		return
	}
	n, err := io.Copy( f, r.Body )
	if err != nil {
		http.NotFound( w, r )
		return
	}
	f.Close()
	w.Write( []byte( fmt.Sprintf( "%d bytes are recieved.\n", n ) ) )
}

func write_log( msg string ) {
	f, err := os.OpenFile( logfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644 )
	if err != nil {
		log.Fatal( err )
	}
	defer f.Close()

	logger := log.New( f, "", log.LstdFlags )
	logger.Println( msg )
}