@@ -25,7 +25,7 @@ Installing
2525go get -u github.com/tidwall/redcon
2626```
2727
28- Example
28+ Examples
2929-------
3030
3131Here's a full example of a Redis clone that accepts:
@@ -123,6 +123,136 @@ func main() {
123123}
124124```
125125
126+ The same example is also provided for serving redcon over TLS:
127+
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+ `
154+
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+ `
170+
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+ }
253+ ```
254+
255+
126256Benchmarks
127257----------
128258
@@ -168,4 +298,3 @@ Josh Baker [@tidwall](http://twitter.com/tidwall)
168298License
169299-------
170300Redcon source code is available under the MIT [ License] ( /LICENSE ) .
171-
0 commit comments