Skip to content

Commit f2794a0

Browse files
committed
tls example
1 parent 4f3c759 commit f2794a0

File tree

2 files changed

+8
-126
lines changed

2 files changed

+8
-126
lines changed

README.md

Lines changed: 8 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Features
1717
- Simple interface. One function `ListenAndServe` and two types `Conn` & `Command`
1818
- Support for pipelining and telnet commands
1919
- Works with Redis clients such as [redigo](https://github.com/garyburd/redigo), [redis-py](https://github.com/andymccurdy/redis-py), [node_redis](https://github.com/NodeRedis/node_redis), and [jedis](https://github.com/xetorthio/jedis)
20+
- [TLS Support](#tls-example)
2021

2122
Installing
2223
----------
@@ -25,7 +26,7 @@ Installing
2526
go get -u github.com/tidwall/redcon
2627
```
2728

28-
Examples
29+
Example
2930
-------
3031

3132
Here's a full example of a Redis clone that accepts:
@@ -123,136 +124,17 @@ func main() {
123124
}
124125
```
125126

126-
The same example is also provided for serving redcon over TLS:
127+
TLS Example
128+
-----------
127129

128-
```sh
129-
go run example/tls/tls.go
130-
```
131-
132-
```go
133-
package main
134-
135-
import (
136-
"crypto/tls"
137-
"log"
138-
"strings"
139-
"sync"
140-
141-
"github.com/tidwall/redcon"
142-
)
143-
144-
const serverKey = `
145-
-----BEGIN EC PARAMETERS-----
146-
BggqhkjOPQMBBw==
147-
-----END EC PARAMETERS-----
148-
-----BEGIN EC PRIVATE KEY-----
149-
MHcCAQEEIHg+g2unjA5BkDtXSN9ShN7kbPlbCcqcYdDu+QeV8XWuoAoGCCqGSM49
150-
AwEHoUQDQgAEcZpodWh3SEs5Hh3rrEiu1LZOYSaNIWO34MgRxvqwz1FMpLxNlx0G
151-
cSqrxhPubawptX5MSr02ft32kfOlYbaF5Q==
152-
-----END EC PRIVATE KEY-----
153-
`
130+
Redcon has full TLS support through the `ListenAndServeTLS` function.
154131

155-
const serverCert = `
156-
-----BEGIN CERTIFICATE-----
157-
MIIB+TCCAZ+gAwIBAgIJAL05LKXo6PrrMAoGCCqGSM49BAMCMFkxCzAJBgNVBAYT
158-
AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn
159-
aXRzIFB0eSBMdGQxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xNTEyMDgxNDAxMTNa
160-
Fw0yNTEyMDUxNDAxMTNaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0
161-
YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMM
162-
CWxvY2FsaG9zdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHGaaHVod0hLOR4d
163-
66xIrtS2TmEmjSFjt+DIEcb6sM9RTKS8TZcdBnEqq8YT7m2sKbV+TEq9Nn7d9pHz
164-
pWG2heWjUDBOMB0GA1UdDgQWBBR0fqrecDJ44D/fiYJiOeBzfoqEijAfBgNVHSME
165-
GDAWgBR0fqrecDJ44D/fiYJiOeBzfoqEijAMBgNVHRMEBTADAQH/MAoGCCqGSM49
166-
BAMCA0gAMEUCIEKzVMF3JqjQjuM2rX7Rx8hancI5KJhwfeKu1xbyR7XaAiEA2UT7
167-
1xOP035EcraRmWPe7tO0LpXgMxlh2VItpc2uc2w=
168-
-----END CERTIFICATE-----
169-
`
132+
The [same example](example/tls/clone.go) is also provided for serving Redcon over TLS.
170133

171-
var addr = ":6380"
172-
173-
func main() {
174-
cer, err := tls.X509KeyPair([]byte(serverCert), []byte(serverKey))
175-
if err != nil {
176-
log.Fatal(err)
177-
}
178-
config := &tls.Config{Certificates: []tls.Certificate{cer}}
179-
180-
var mu sync.RWMutex
181-
var items = make(map[string][]byte)
182-
183-
go log.Printf("started server at %s", addr)
184-
err = redcon.ListenAndServeTLS(addr,
185-
func(conn redcon.Conn, cmd redcon.Command) {
186-
switch strings.ToLower(string(cmd.Args[0])) {
187-
default:
188-
conn.WriteError("ERR unknown command '" + string(cmd.Args[0]) + "'")
189-
case "detach":
190-
hconn := conn.Detach()
191-
log.Printf("connection has been detached")
192-
go func() {
193-
defer hconn.Close()
194-
hconn.WriteString("OK")
195-
hconn.Flush()
196-
}()
197-
return
198-
case "ping":
199-
conn.WriteString("PONG")
200-
case "quit":
201-
conn.WriteString("OK")
202-
conn.Close()
203-
case "set":
204-
if len(cmd.Args) != 3 {
205-
conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command")
206-
return
207-
}
208-
mu.Lock()
209-
items[string(cmd.Args[1])] = cmd.Args[2]
210-
mu.Unlock()
211-
conn.WriteString("OK")
212-
case "get":
213-
if len(cmd.Args) != 2 {
214-
conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command")
215-
return
216-
}
217-
mu.RLock()
218-
val, ok := items[string(cmd.Args[1])]
219-
mu.RUnlock()
220-
if !ok {
221-
conn.WriteNull()
222-
} else {
223-
conn.WriteBulk(val)
224-
}
225-
case "del":
226-
if len(cmd.Args) != 2 {
227-
conn.WriteError("ERR wrong number of arguments for '" + string(cmd.Args[0]) + "' command")
228-
return
229-
}
230-
mu.Lock()
231-
_, ok := items[string(cmd.Args[1])]
232-
delete(items, string(cmd.Args[1]))
233-
mu.Unlock()
234-
if !ok {
235-
conn.WriteInt(0)
236-
} else {
237-
conn.WriteInt(1)
238-
}
239-
}
240-
},
241-
func(conn redcon.Conn) bool {
242-
return true
243-
},
244-
func(conn redcon.Conn, err error) {
245-
},
246-
config,
247-
)
248-
249-
if err != nil {
250-
log.Fatal(err)
251-
}
252-
}
134+
```sh
135+
go run example/tls/clone.go
253136
```
254137

255-
256138
Benchmarks
257139
----------
258140

File renamed without changes.

0 commit comments

Comments
 (0)