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

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPablo Carranza <pcarranza@gmail.com>2016-11-28 02:20:26 +0300
committerAhmad Sherif <me@ahmadsherif.com>2016-11-29 21:31:34 +0300
commitfb331b2d7b70cdea1f91bcae2ae9f854b34bc0ec (patch)
treef654e5f152df24cfdcdae5fc36456a7d509a5f88
parent87b75b53efca33021afca905b13a2725a18a195b (diff)
Initial server working and replying to an echo
-rw-r--r--cmd/server/main.go2
-rw-r--r--server/server.go98
-rw-r--r--server/server_test.go29
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))
+}