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:
M | apnd/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)
}
}