diff options
author | Pablo Carranza <pcarranza@gmail.com> | 2016-11-28 02:20:26 +0300 |
---|---|---|
committer | Ahmad Sherif <me@ahmadsherif.com> | 2016-11-29 21:31:34 +0300 |
commit | fb331b2d7b70cdea1f91bcae2ae9f854b34bc0ec (patch) | |
tree | f654e5f152df24cfdcdae5fc36456a7d509a5f88 | |
parent | 87b75b53efca33021afca905b13a2725a18a195b (diff) |
Initial server working and replying to an echo
-rw-r--r-- | cmd/server/main.go | 2 | ||||
-rw-r--r-- | server/server.go | 98 | ||||
-rw-r--r-- | server/server_test.go | 29 |
3 files changed, 108 insertions, 21 deletions
diff --git a/cmd/server/main.go b/cmd/server/main.go index 8690fae76..f8687c09b 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -1,7 +1,7 @@ package main import ( - "gitlab.com/pcarranza/git-access-daemon/server" + "gitlab.com/gitlab-org/git-access-daemon/server" ) func main() { diff --git a/server/server.go b/server/server.go index a51b114ef..1b130c02b 100644 --- a/server/server.go +++ b/server/server.go @@ -1,33 +1,91 @@ package server import ( - "bytes" - "fmt" + "bufio" "log" "net" + "sync" + "time" ) -func Listen(netw, address string) { - listener, error := net.Listen(netw, address) - if error != nil { - log.Fatal(error) +type Service struct { + ch chan bool + waitGroup *sync.WaitGroup +} + +func NewService() *Service { + service := &Service{ + ch: make(chan bool), + waitGroup: &sync.WaitGroup{}, + } + service.waitGroup.Add(1) + return service +} + +func (s *Service) Serve(address string) { + listener, err := newListener(address) + if err != nil { + log.Fatalln(err) } - defer listener.Close() - fmt.Printf("Listening on %v for incoming connecionts\n", address) + defer s.waitGroup.Done() + log.Println("Listening on address", address) for { - conn, error := listener.Accept() - if error != nil { - log.Printf("Failed to get a network connection %v\n", error) - continue + select { + case <-s.ch: + log.Println("Received shutdown message, stopping server on", listener.Addr()) + listener.Close() + return + default: + } + listener.SetDeadline(time.Now().Add(1e9)) + conn, err := listener.AcceptTCP() + if err != nil { + if opErr, ok := err.(*net.OpError); ok && opErr.Timeout() { + continue + } + log.Println(err) + } + log.Println("Client connected from ", conn.RemoteAddr()) + s.waitGroup.Add(1) + go s.serve(conn) + } +} + +func newListener(address string) (*net.TCPListener, error) { + tcpAddress, err := net.ResolveTCPAddr("tcp", address) + if err != nil { + return &net.TCPListener{}, err + } + return net.ListenTCP("tcp", tcpAddress) +} + +func (s *Service) Stop() { + close(s.ch) + s.waitGroup.Wait() +} + +func (s *Service) serve(conn *net.TCPConn) { + defer conn.Close() + defer s.waitGroup.Done() + for { + select { + case <-s.ch: + log.Println("Received shutdown message, disconnecting client from", conn.RemoteAddr()) + return + default: + } + conn.SetDeadline(time.Now().Add(1e9)) + reader := bufio.NewReader(conn) + buffer, err := reader.ReadBytes('\n') + if err != nil { + if opError, ok := err.(*net.OpError); ok && opError.Timeout() { + continue + } + log.Println(err) } - log.Printf("Established Connection from %v\n", conn.RemoteAddr()) - buffer := bytes.Buffer{} - read, error := buffer.ReadFrom(conn) - if error != nil { - log.Printf("Failed to read from connection %v\n", error) - continue + if _, err := conn.Write(buffer); nil != err { + log.Println(err) + return } - log.Printf("Received %v bytes from connection: %v", read, buffer.String()) - conn.Close() } } diff --git a/server/server_test.go b/server/server_test.go new file mode 100644 index 000000000..83d4d422b --- /dev/null +++ b/server/server_test.go @@ -0,0 +1,29 @@ +package server + +import ( + "bufio" + "fmt" + "net" + "testing" +) + +func TestServerStandingUp(t *testing.T) { + service := NewService() + address := "127.0.0.1:6666" + go service.Serve(address) + defer service.Stop() + + conn, err := net.Dial("tcp", address) + if err != nil { + t.Fatal(err) + } + if _, err := conn.Write([]byte("hola hola!\n")); err != nil { + t.Error(err) + } + reader := bufio.NewReader(conn) + buffer, err := reader.ReadBytes('\n') + if err != nil { + t.Error(err) + } + fmt.Println("Received from server:", string(buffer)) +} |