From 435a05f2fc18e1ce313a93f44ce5ce7421181853 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Thu, 31 Jan 2019 12:27:29 -0200 Subject: [PATCH 01/13] add lint command --- Makefile | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index c8e29ed..13f0ef7 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,10 @@ -.PHONY: default client deps clean fmt glide +.PHONY: default client deps clean fmt lint glide export GOPATH:=$(shell pwd) export GOBIN=$(shell pwd)/bin +PLATFORMS := windows linux darwin +PKGS := $(shell go list ./src/docsdocs...) SHELL := /bin/bash default: all @@ -10,7 +12,7 @@ default: all deps: @echo "--> intalling deps" @glide install - $(shell ln -sr vendor/* src/) + # $(shell ln -sr vendor/* src/) @echo "" client: @@ -18,6 +20,11 @@ client: @go install docsdocs/main/docs @echo "" +lint: + @echo "--> linting" + @golint $(PKGS) + @echo "" + fmt: @echo "--> formating" @go fmt docsdocs/... @@ -34,4 +41,4 @@ glide: curl https://glide.sh/get | sh; \ fi -all: fmt client +all: fmt lint client From 937c6ef798c5297d62030595336a58016a80ed07 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Fri, 1 Feb 2019 00:33:55 -0200 Subject: [PATCH 02/13] opss fix copy vendor --- Makefile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Makefile b/Makefile index 7b1efd6..3e1c83f 100644 --- a/Makefile +++ b/Makefile @@ -12,11 +12,7 @@ default: all deps: @echo "--> intalling deps" @glide install -<<<<<<< HEAD - # $(shell ln -sr vendor/* src/) -======= @cp -R vendor/* src/ ->>>>>>> dev @echo "" client: From 4bd071e2acc951186a3e45f069ab2be11a87c6ec Mon Sep 17 00:00:00 2001 From: murilobsd Date: Fri, 1 Feb 2019 19:50:36 -0200 Subject: [PATCH 03/13] write file --- src/docsdocs/util/doc.go | 4 ++++ src/docsdocs/util/file.go | 15 +++++++++++++ src/docsdocs/util/file_test.go | 39 ++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/docsdocs/util/doc.go create mode 100644 src/docsdocs/util/file.go create mode 100644 src/docsdocs/util/file_test.go diff --git a/src/docsdocs/util/doc.go b/src/docsdocs/util/doc.go new file mode 100644 index 0000000..1132abd --- /dev/null +++ b/src/docsdocs/util/doc.go @@ -0,0 +1,4 @@ +/* +Package util some functions +*/ +package util diff --git a/src/docsdocs/util/file.go b/src/docsdocs/util/file.go new file mode 100644 index 0000000..f9b57b7 --- /dev/null +++ b/src/docsdocs/util/file.go @@ -0,0 +1,15 @@ +package util + +import ( + "io/ioutil" +) + +// SaveFile this function save content to file +func SaveFile(filename string, content []byte) error { + return ioutil.WriteFile(filename, content, 0644) +} + +// ReadFile this function read content +func ReadFile(filename string) ([]byte, error) { + return ioutil.ReadFile(filename) +} diff --git a/src/docsdocs/util/file_test.go b/src/docsdocs/util/file_test.go new file mode 100644 index 0000000..d9a1ebc --- /dev/null +++ b/src/docsdocs/util/file_test.go @@ -0,0 +1,39 @@ +package util + +import ( + "io/ioutil" + "os" + "testing" +) + +func setupTestCase(t *testing.T) func(t *testing.T) { + t.Log("setup test case") + return func(t *testing.T) { + t.Log("tear test case") + } +} + +func TestSaveFile(t *testing.T) { + f, err := ioutil.TempFile("", "docsfile") + if err != nil { + t.Fatal(err) + } + filename := f.Name() + data := "hi =]" + + if err := SaveFile(filename, []byte(data)); err != nil { + t.Fatalf("SaveFile %s: %v", filename, err) + } + contents, err := ReadFile(filename) + if err != nil { + t.Fatalf("Reafile %s: %v", filename, err) + } + + if string(contents) != data { + t.Fatalf("contents = %q\nexpected = %q", string(contents), data) + } + + f.Close() + os.Remove(filename) + +} From 38cdf7cf64e0f0327c8dd0a01c8483ebbf99c2e7 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Fri, 1 Feb 2019 19:56:56 -0200 Subject: [PATCH 04/13] add read testing --- src/docsdocs/util/file_test.go | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/docsdocs/util/file_test.go b/src/docsdocs/util/file_test.go index d9a1ebc..a8c20b3 100644 --- a/src/docsdocs/util/file_test.go +++ b/src/docsdocs/util/file_test.go @@ -6,13 +6,23 @@ import ( "testing" ) -func setupTestCase(t *testing.T) func(t *testing.T) { - t.Log("setup test case") - return func(t *testing.T) { - t.Log("tear test case") +func TestReadFile(t *testing.T) { + filename := "notexist" + contents, err := ReadFile(filename) + if err == nil { + t.Fatalf("Readfile %s: error expected, none found", filename) + } + filename = "file_test.go" + contents, err = ReadFile(filename) + if err != nil { + t.Fatalf("ReadFile %s: %v", filename, err) + } + dir, _ := os.Stat(filename) + if dir.Size() != int64(len(contents)) { + t.Errorf("Stat %q: size %d want %d", filename, dir.Size(), size) } -} +} func TestSaveFile(t *testing.T) { f, err := ioutil.TempFile("", "docsfile") if err != nil { From 5c89a828196352e7667f153ff4bcab7008e139c1 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Fri, 1 Feb 2019 19:57:30 -0200 Subject: [PATCH 05/13] remove duplicate lint --- Makefile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Makefile b/Makefile index 3e1c83f..1e9ebad 100644 --- a/Makefile +++ b/Makefile @@ -30,11 +30,6 @@ fmt: @go fmt docsdocs/... @echo "" -lint: - @echo "--> lint " - @golint src/docsdocs/... - @echo "" - clean: @echo "--> formating" go clean -i -r docsdocs/... From ea4381e4e1407115eb35a9aff1f186e0cf521ede Mon Sep 17 00:00:00 2001 From: murilobsd Date: Fri, 1 Feb 2019 19:59:26 -0200 Subject: [PATCH 06/13] fix ) on line 23 --- src/docsdocs/util/file_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/docsdocs/util/file_test.go b/src/docsdocs/util/file_test.go index a8c20b3..666454e 100644 --- a/src/docsdocs/util/file_test.go +++ b/src/docsdocs/util/file_test.go @@ -18,8 +18,9 @@ func TestReadFile(t *testing.T) { t.Fatalf("ReadFile %s: %v", filename, err) } dir, _ := os.Stat(filename) + if dir.Size() != int64(len(contents)) { - t.Errorf("Stat %q: size %d want %d", filename, dir.Size(), size) + t.Errorf("Stat %q: size %d want %d", filename, dir.Size(), int64(len(contents))) } } From 67025d5ade458bded48bf127f136a0f1100008c3 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Fri, 1 Feb 2019 23:21:41 -0200 Subject: [PATCH 07/13] badge support chat --- README.md | 3 ++- README.pt.md | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 01f1f93..a17144e 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,10 @@ ![DocsDocs Logo](assets/client/images/logo.png) -[![license](https://img.shields.io/badge/License-BSD-blue.svg?style=for-the-badge)](LICENSE) +[![License](https://img.shields.io/badge/License-BSD-blue.svg?style=for-the-badge)](LICENSE) [![Travis](https://img.shields.io/travis/murilobsd/docsdocs/master.svg?style=for-the-badge)](https://travis-ci.org/murilobsd/docsdocs) [![Codecov](https://img.shields.io/codecov/c/gh/murilobsd/docsdocs.svg?style=for-the-badge)](https://codecov.io/gh/murilobsd/docsdocs) +[![Telegram](https://img.shields.io/badge/telegram-chat-blue.svg?style=for-the-badge&logo=telegram)](https://t.me/joinchat/BEU4pxK-Ow8IXiKTQEJZxg) > The easiest and safest way for **accountants** to share documents to their clients. diff --git a/README.pt.md b/README.pt.md index 30bc84f..781f79b 100644 --- a/README.pt.md +++ b/README.pt.md @@ -4,6 +4,8 @@ [![license](https://img.shields.io/badge/License-BSD-blue.svg?style=for-the-badge)](LICENSE) [![Travis](https://img.shields.io/travis/murilobsd/docsdocs/master.svg?style=for-the-badge)](https://travis-ci.org/murilobsd/docsdocs) +[![Codecov](https://img.shields.io/codecov/c/gh/murilobsd/docsdocs.svg?style=for-the-badge)](https://codecov.io/gh/murilobsd/docsdocs) +[![Telegram](https://img.shields.io/badge/telegram-chat-blue.svg?style=for-the-badge&logo=telegram)](https://t.me/joinchat/BEU4pxK-Ow8IXiKTQEJZxg) > A maneira simples e segura para **Contadores** compartilharem documentos com seus clientes. From 8fe5ffa499f16f6edffca8c1598970a07e512e82 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Sat, 2 Feb 2019 12:42:37 -0200 Subject: [PATCH 08/13] fix: #3 --- README.md | 2 +- README.pt.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a17144e..e193f89 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Two main safety issues may occur and are being currently worked on: - File Cryptography - Node Cryptography -If you find a vulnerability please send your report and we kindly ask you not to file a public report, our GPG key is ... security@docsdocs.com +If you find a vulnerability please send your report and we kindly ask you not to file a public report, our GPG key is [076C2D5451A74153](https://murilo.net.br) murilo@lab804.com.br ## Install diff --git a/README.pt.md b/README.pt.md index 781f79b..defe60b 100644 --- a/README.pt.md +++ b/README.pt.md @@ -37,7 +37,7 @@ Duas questões de segurança precisam ser imediamente estruturada: - Criptografia na comunicação entre os nós Caso encontre alguma falha de segurança por favor entre em contato imediatamente conosco, -a nossa chave GPG security@docsdocs.com.br +a nossa chave GPG [076C2D5451A74153](https://murilo.net.br) murilo@lab804.com.br ## Instalação From 7a480e3e5514e183ed6a62664c8ab4d9f882b783 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Sat, 2 Feb 2019 12:45:15 -0200 Subject: [PATCH 09/13] add instal_server command to makefile --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1e9ebad..90c8a5a 100644 --- a/Makefile +++ b/Makefile @@ -15,11 +15,16 @@ deps: @cp -R vendor/* src/ @echo "" -client: +install_client: @echo "--> intall client" @go install docsdocs/main/docs @echo "" +install_server: + @echo "--> intall server" + @go install docsdocs/main/docsd + @echo "" + lint: @echo "--> linting" @golint $(PKGS) From b8c6c582a4a09e8b1c5244321f5f2329afb807b4 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Sat, 2 Feb 2019 13:02:43 -0200 Subject: [PATCH 10/13] update interface --- src/docsdocs/crypto/generate.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/docsdocs/crypto/generate.go b/src/docsdocs/crypto/generate.go index dbce201..d8bbad1 100644 --- a/src/docsdocs/crypto/generate.go +++ b/src/docsdocs/crypto/generate.go @@ -33,8 +33,8 @@ type Encrypter interface { ExportPublic(io.Writer) error GetPrivate() *rsa.PrivateKey GetPublic() *rsa.PublicKey - // ReadPrivate() (*rsa.PrivateKey, error) - // ReadPublic() (*rsa.PublicKey, error) + // ReadPrivateFile(r io.Reader) (*rsa.PrivateKey, error) + // ReadPublicFile(r io.Reader) (*rsa.PublicKey, error) } // DocsCrypto This is struct to manager crypto files From c0ea6270336153539f2ef90228d1c874dcf4d9ef Mon Sep 17 00:00:00 2001 From: murilobsd Date: Sat, 2 Feb 2019 13:03:25 -0200 Subject: [PATCH 11/13] start protocol --- src/docsdocs/main/docs/docs.go | 16 ++++++++++ src/docsdocs/main/docsd/docsd.go | 7 +++++ src/docsdocs/proto/doc.go | 4 +++ src/docsdocs/proto/method.go | 15 +++++++++ src/docsdocs/proto/request.go | 45 +++++++++++++++++++++++++++ src/docsdocs/proto/response.go | 41 +++++++++++++++++++++++++ src/docsdocs/proto/transport.go | 52 ++++++++++++++++++++++++++++++++ src/docsdocs/server/doc.go | 4 +++ src/docsdocs/server/main.go | 34 +++++++++++++++++++++ 9 files changed, 218 insertions(+) create mode 100644 src/docsdocs/main/docsd/docsd.go create mode 100644 src/docsdocs/proto/doc.go create mode 100644 src/docsdocs/proto/method.go create mode 100644 src/docsdocs/proto/request.go create mode 100644 src/docsdocs/proto/response.go create mode 100644 src/docsdocs/proto/transport.go create mode 100644 src/docsdocs/server/doc.go create mode 100644 src/docsdocs/server/main.go diff --git a/src/docsdocs/main/docs/docs.go b/src/docsdocs/main/docs/docs.go index 74cb530..d7ca9ca 100644 --- a/src/docsdocs/main/docs/docs.go +++ b/src/docsdocs/main/docs/docs.go @@ -2,8 +2,24 @@ package main import ( "docsdocs/log" + "docsdocs/proto" ) func main() { log.Settings("json", "stdout", "debug") + logger := log.NewDocsLogger() + logger.Info("Starting client") + t, err := proto.NewTransport("tcp", "localhost:5000") + if err != nil { + logger.Error(err) + } + resp, err := t.RoundTrip(&proto.Request{ + Header: proto.Header{}, + Method: proto.MethodGet, + BodyBytes: []byte("hello =]"), + }) + if err != nil { + logger.Error(err) + } + logger.Info("Response: %v\n\n", resp) } diff --git a/src/docsdocs/main/docsd/docsd.go b/src/docsdocs/main/docsd/docsd.go new file mode 100644 index 0000000..cbc1173 --- /dev/null +++ b/src/docsdocs/main/docsd/docsd.go @@ -0,0 +1,7 @@ +package main + +import "docsdocs/server" + +func main() { + server.NewServer() +} diff --git a/src/docsdocs/proto/doc.go b/src/docsdocs/proto/doc.go new file mode 100644 index 0000000..ee90f71 --- /dev/null +++ b/src/docsdocs/proto/doc.go @@ -0,0 +1,4 @@ +/* +Package proto .... +*/ +package proto diff --git a/src/docsdocs/proto/method.go b/src/docsdocs/proto/method.go new file mode 100644 index 0000000..d32c055 --- /dev/null +++ b/src/docsdocs/proto/method.go @@ -0,0 +1,15 @@ +package proto + +// Commom Protocol methods. + +// Method type +type Method uint64 + +const ( + // MethodGet ... + MethodGet Method = 1 << iota + // MethodPost ... + MethodPost + // MethodDelete ... + MethodDelete +) diff --git a/src/docsdocs/proto/request.go b/src/docsdocs/proto/request.go new file mode 100644 index 0000000..c7e51b6 --- /dev/null +++ b/src/docsdocs/proto/request.go @@ -0,0 +1,45 @@ +package proto + +import ( + "bytes" + "context" + "encoding/gob" +) + +func init() { + gob.Register(Request{}) +} + +// Request ... +type Request struct { + Header Header + Method Method + BodyBytes []byte + RemoteAddr string + ctx context.Context +} + +// Context returns the request context +func (r *Request) Context() context.Context { + if r.ctx != nil { + return r.ctx + } + return context.Background() +} + +// Serialize +func (r *Request) Serialize() ([]byte, error) { + b := bytes.Buffer{} + encoder := gob.NewEncoder(&b) + err := encoder.Encode(r) + return b.Bytes(), err +} + +func Deserialize(reqBytes []byte) (Request, error) { + b := bytes.Buffer{} + b.Write(reqBytes) + decoder := gob.NewDecoder(&b) + req := &Request{} + err := decoder.Decode(req) + return *req, err +} diff --git a/src/docsdocs/proto/response.go b/src/docsdocs/proto/response.go new file mode 100644 index 0000000..255fd3e --- /dev/null +++ b/src/docsdocs/proto/response.go @@ -0,0 +1,41 @@ +package proto + +import ( + "bytes" + "encoding/gob" +) + +// Status ... +type Status int64 + +const ( + // Sucesss ... + Sucesss Status = 1 << iota + // Error ... + Error +) + +// Response ... +type Response struct { + Header Header + Status Status + BodyBytes []byte +} + +// Serialize - convert the response to the wire format +func (r *Response) Serialize() ([]byte, error) { + b := bytes.Buffer{} + encoder := gob.NewEncoder(&b) + err := encoder.Encode(r) + return b.Bytes(), err +} + +// DeserializeResponse - convert the response from the wire format +func DeserializeResponse(responseBytes []byte) (Response, error) { + b := bytes.Buffer{} + b.Write(responseBytes) + decoder := gob.NewDecoder(&b) + resp := &Response{} + err := decoder.Decode(resp) + return *resp, err +} diff --git a/src/docsdocs/proto/transport.go b/src/docsdocs/proto/transport.go new file mode 100644 index 0000000..15caed4 --- /dev/null +++ b/src/docsdocs/proto/transport.go @@ -0,0 +1,52 @@ +package proto + +import ( + "encoding/gob" + "net" +) + +// Header ... +type Header struct{} + +type Encoder interface { + Encode(interface{}) error +} + +type Decoder interface { + Decode(interface{}) error +} + +// Transport ... +type Transport struct { + conn net.Conn + enc Encoder + dec Decoder +} + +// NewTransport - create a new transport structure +func NewTransport(proto, remote string) (*Transport, error) { + conn, err := net.Dial(proto, remote) + enc := gob.NewEncoder(conn) + dec := gob.NewDecoder(conn) + return &Transport{ + conn: conn, + enc: enc, + dec: dec, + }, err +} + +// RoundTrip - Implementation of a round tripper interface, +// effectively this is how the request will be serialized, +// and put on the wire, and how the response will be deserialized +func (t *Transport) RoundTrip(request *Request) (Response, error) { + var response Response + // serialize request + if err := t.enc.Encode(request); err != nil { + return response, err + } + // unserialize response + if err := t.dec.Decode(&response); err != nil { + return response, err + } + return response, nil +} diff --git a/src/docsdocs/server/doc.go b/src/docsdocs/server/doc.go new file mode 100644 index 0000000..0b16ffa --- /dev/null +++ b/src/docsdocs/server/doc.go @@ -0,0 +1,4 @@ +/* +package server ... +*/ +package server diff --git a/src/docsdocs/server/main.go b/src/docsdocs/server/main.go new file mode 100644 index 0000000..01c5078 --- /dev/null +++ b/src/docsdocs/server/main.go @@ -0,0 +1,34 @@ +package server + +import ( + "docsdocs/log" + "docsdocs/proto" + "encoding/gob" + "io" + "net" +) + +func NewServer() { + log.Settings("json", "stdout", "debug") + logger := log.NewDocsLogger() + listener, _ := net.Listen("tcp", ":5000") + for { + conn, _ := listener.Accept() + logger.Info("Remote Ip: ", conn.RemoteAddr().String()) + decoder := gob.NewDecoder(conn) + var req proto.Request + err := decoder.Decode(&req) + if err != nil { + logger.Error(err) + if err == io.EOF { + continue + } + } else { + logger.Info("Got request: %v\n", req) + encoder := gob.NewEncoder(conn) + encoder.Encode(proto.Response{ + BodyBytes: []byte("i'm here"), + }) + } + } +} From 3b371b55db8495932c61bdf31e45786ceedffd19 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Sat, 2 Feb 2019 18:35:34 -0200 Subject: [PATCH 12/13] update documents --- src/docsdocs/proto/request.go | 22 ++++++---------------- src/docsdocs/proto/transport.go | 2 ++ 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/docsdocs/proto/request.go b/src/docsdocs/proto/request.go index c7e51b6..0678141 100644 --- a/src/docsdocs/proto/request.go +++ b/src/docsdocs/proto/request.go @@ -2,7 +2,6 @@ package proto import ( "bytes" - "context" "encoding/gob" ) @@ -12,22 +11,12 @@ func init() { // Request ... type Request struct { - Header Header - Method Method - BodyBytes []byte - RemoteAddr string - ctx context.Context + Header Header + Method Method + BodyBytes []byte } -// Context returns the request context -func (r *Request) Context() context.Context { - if r.ctx != nil { - return r.ctx - } - return context.Background() -} - -// Serialize +// Serialize ... func (r *Request) Serialize() ([]byte, error) { b := bytes.Buffer{} encoder := gob.NewEncoder(&b) @@ -35,7 +24,8 @@ func (r *Request) Serialize() ([]byte, error) { return b.Bytes(), err } -func Deserialize(reqBytes []byte) (Request, error) { +// DeserualizeRequest ... +func DeserualizeRequest(reqBytes []byte) (Request, error) { b := bytes.Buffer{} b.Write(reqBytes) decoder := gob.NewDecoder(&b) diff --git a/src/docsdocs/proto/transport.go b/src/docsdocs/proto/transport.go index 15caed4..4f0bc8d 100644 --- a/src/docsdocs/proto/transport.go +++ b/src/docsdocs/proto/transport.go @@ -8,10 +8,12 @@ import ( // Header ... type Header struct{} +// Encoder ... type Encoder interface { Encode(interface{}) error } +// Decoder ... type Decoder interface { Decode(interface{}) error } From e1fc199747ea90a57f6839c64e5cc7a3e8e009e9 Mon Sep 17 00:00:00 2001 From: murilobsd Date: Sat, 2 Feb 2019 19:03:04 -0200 Subject: [PATCH 13/13] fix server and change commands --- src/docsdocs/main/docs/docs.go | 32 ++++++++------ src/docsdocs/main/docsd/docsd.go | 13 +++++- src/docsdocs/proto/response.go | 4 +- src/docsdocs/server/main.go | 72 ++++++++++++++++++++++++-------- 4 files changed, 87 insertions(+), 34 deletions(-) diff --git a/src/docsdocs/main/docs/docs.go b/src/docsdocs/main/docs/docs.go index d7ca9ca..8e784a0 100644 --- a/src/docsdocs/main/docs/docs.go +++ b/src/docsdocs/main/docs/docs.go @@ -3,23 +3,31 @@ package main import ( "docsdocs/log" "docsdocs/proto" + "fmt" ) func main() { log.Settings("json", "stdout", "debug") - logger := log.NewDocsLogger() - logger.Info("Starting client") - t, err := proto.NewTransport("tcp", "localhost:5000") + t, err := proto.NewTransport("tcp", "localhost:3000") if err != nil { - logger.Error(err) + panic(err) } - resp, err := t.RoundTrip(&proto.Request{ - Header: proto.Header{}, - Method: proto.MethodGet, - BodyBytes: []byte("hello =]"), - }) - if err != nil { - logger.Error(err) + for _, method := range []proto.Method{ + proto.MethodGet, + proto.MethodPost, + proto.MethodDelete, + 42, + } { + fmt.Println("starting request: ", method) + resp, err := t.RoundTrip(&proto.Request{ + Header: proto.Header{}, + Method: method, + BodyBytes: []byte("hello =]"), + }) + if err != nil { + fmt.Printf("Erro: %v\n", err) + } + fmt.Printf("Response: %v\n\n", resp) } - logger.Info("Response: %v\n\n", resp) + } diff --git a/src/docsdocs/main/docsd/docsd.go b/src/docsdocs/main/docsd/docsd.go index cbc1173..14dc294 100644 --- a/src/docsdocs/main/docsd/docsd.go +++ b/src/docsdocs/main/docsd/docsd.go @@ -1,7 +1,16 @@ package main -import "docsdocs/server" +import ( + "docsdocs/log" + "docsdocs/server" +) func main() { - server.NewServer() + log.Settings("json", "stdout", "debug") + serv, err := server.NewServer("tcp", "localhost:3000") + if err != nil { + panic(err) + } + quit := serv.Run() + defer func() { quit <- struct{}{} }() } diff --git a/src/docsdocs/proto/response.go b/src/docsdocs/proto/response.go index 255fd3e..90e2b10 100644 --- a/src/docsdocs/proto/response.go +++ b/src/docsdocs/proto/response.go @@ -9,8 +9,8 @@ import ( type Status int64 const ( - // Sucesss ... - Sucesss Status = 1 << iota + // Sucess ... + Sucess Status = 1 << iota // Error ... Error ) diff --git a/src/docsdocs/server/main.go b/src/docsdocs/server/main.go index 01c5078..e610ad0 100644 --- a/src/docsdocs/server/main.go +++ b/src/docsdocs/server/main.go @@ -4,31 +4,67 @@ import ( "docsdocs/log" "docsdocs/proto" "encoding/gob" - "io" "net" ) -func NewServer() { - log.Settings("json", "stdout", "debug") - logger := log.NewDocsLogger() - listener, _ := net.Listen("tcp", ":5000") +type Server struct { + log.Logger + listener net.Listener +} + +func NewServer(proto, address string) (*Server, error) { + listener, err := net.Listen(proto, address) + if err != nil { + return nil, err + } + return &Server{ + Logger: log.NewDocsLogger(), + listener: listener, + }, nil +} + +func (s *Server) Run() chan struct{} { + q := make(chan struct{}) + go func(quit chan struct{}) { + for { + conn, err := s.listener.Accept() + if err != nil { + s.Error(err) + return + } + go s.handlerConn(conn) + + } + }(q) + return q +} + +func (s *Server) handlerConn(conn net.Conn) { + decoder := gob.NewDecoder(conn) + encoder := gob.NewEncoder(conn) for { - conn, _ := listener.Accept() - logger.Info("Remote Ip: ", conn.RemoteAddr().String()) - decoder := gob.NewDecoder(conn) var req proto.Request err := decoder.Decode(&req) if err != nil { - logger.Error(err) - if err == io.EOF { - continue - } - } else { - logger.Info("Got request: %v\n", req) - encoder := gob.NewEncoder(conn) - encoder.Encode(proto.Response{ - BodyBytes: []byte("i'm here"), - }) + s.Error(err) + return + } + s.Info("Got request: %v\n", req) + var resp = new(proto.Response) + switch req.Method { + case proto.MethodGet: + s.Info("request is a get method.") + resp.Status = proto.Sucess + case proto.MethodPost: + s.Info("request is a post method.") + resp.Status = proto.Sucess + case proto.MethodDelete: + s.Info("request is a delete method.") + resp.Status = proto.Sucess + default: + s.Warn("unknow request method") + resp.Status = proto.Error } + encoder.Encode(*resp) } }