shlist

share and manage lists between multiple people
Log | Files | Refs

commit 466078bce20316c5878082398f4c3d69d49957e6
parent 631cf31e15452e4910cdaea490693bf4a168f40c
Author: kyle <kyle@0x30.net>
Date:   Wed,  3 Feb 2016 19:13:39 -0700

apnd: general maintenance fixes

- handle more errors
- close socket earlier, right after reading from it
  - this lets the client go free faster, which will speed up the main server
- handle signals and clean up the socket file

Diffstat:
Mapnd/apnd.go | 43++++++++++++++++++++++++++++++++++---------
1 file changed, 34 insertions(+), 9 deletions(-)

diff --git a/apnd/apnd.go b/apnd/apnd.go @@ -3,29 +3,39 @@ package main import ( "bytes" "crypto/tls" - "crypto/x509" + //"crypto/x509" "encoding/json" "fmt" - //"io" "log" "net/http" "net" + "os" + "os/signal" + "syscall" "golang.org/x/net/http2" ) -func echo_server(c net.Conn, h http.Client) { +func process_client(c net.Conn, h http.Client) { + + // Read data from connection buf := make([]byte, 4096) nr, err := c.Read(buf); if err != nil { return } - - var f interface{} + c.Close() data := buf[0:nr] fmt.Printf("Received: %v", string(data)) + + // Parse JSON + var f interface{} err = json.Unmarshal(data, &f) + if err != nil { + log.Printf("error parsing json:", err) + return + } m := f.(map[string]interface{}) @@ -49,13 +59,14 @@ func echo_server(c net.Conn, h http.Client) { req, err := http.NewRequest("POST", "https://api.development.push.apple.com/3/device/DE2D368BB6C80E1D8BCB86D20CB6C2161BD5CEC5BA35A1E1AA0DB382849ED9B2", bytes.NewBuffer(jsonStr)) req.Header.Set("apns-topic", "com.octopus.shlist") + + // Make request over existing transport resp, err := h.Do(req) fmt.Println("response was:", resp) - - c.Close() } func main() { + // Read client SSL key pair cert, err := tls.LoadX509KeyPair("ssl/aps.pem", "ssl/aps.key") if err != nil { log.Fatalf("server: loadkeys: %s", err) @@ -71,27 +82,41 @@ func main() { state := conn.ConnectionState() for _, v := range state.PeerCertificates { - fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey)) + // fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey)) fmt.Println(v.Subject) } log.Println("client: handshake: ", state.HandshakeComplete) log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual) + // Create new http client with http2 TLS transport underneath client := http.Client { Transport: &http2.Transport{TLSClientConfig: &config}, } + // Create socket that listens for connections from the main server l, err := net.Listen("unix", "../apnd.socket") if err != nil { log.Fatal("listen error:", err) } + // Close (and unlink) listener socket on shutdown signals + sigc := make(chan os.Signal, 1) + signal.Notify(sigc, os.Interrupt, os.Kill, syscall.SIGTERM) + go func(c chan os.Signal) { + sig := <-c + log.Printf("Caught signal %s: shutting down", sig) + + l.Close() + os.Exit(0) + }(sigc) + + // Main loop, service new main server connections for { fd, err := l.Accept() if err != nil { log.Fatal("accept error:", err) } - go echo_server(fd, client) + go process_client(fd, client) } }