From 04d7c8c38cf9919d33eccbc0495a583d31451488 Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Thu, 24 Feb 2022 17:30:55 +0100 Subject: [PATCH] Add rediss url parsing support --- CHANGELOG.md | 10 +++++++--- asynq.go | 23 ++++++++++++++++++++--- asynq_test.go | 8 +++++++- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7021b26..a3f2e4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Enable rediss url parsing support + ## [0.22.1] - 2022-02-20 ### Fixed @@ -264,9 +268,9 @@ Use `ProcessIn` or `ProcessAt` option to schedule a task instead of `EnqueueIn` #### `Inspector` -All Inspector methods are scoped to a queue, and the methods take `qname (string)` as the first argument. -`EnqueuedTask` is renamed to `PendingTask` and its corresponding methods. -`InProgressTask` is renamed to `ActiveTask` and its corresponding methods. +All Inspector methods are scoped to a queue, and the methods take `qname (string)` as the first argument. +`EnqueuedTask` is renamed to `PendingTask` and its corresponding methods. +`InProgressTask` is renamed to `ActiveTask` and its corresponding methods. Command "Enqueue" is replaced by the verb "Run" (e.g. `EnqueueAllScheduledTasks` --> `RunAllScheduledTasks`) #### `CLI` diff --git a/asynq.go b/asynq.go index 234d4b9..cda9a23 100644 --- a/asynq.go +++ b/asynq.go @@ -8,6 +8,7 @@ import ( "context" "crypto/tls" "fmt" + "net" "net/url" "strconv" "strings" @@ -419,9 +420,10 @@ func (opt RedisClusterClientOpt) MakeRedisClient() interface{} { // ParseRedisURI parses redis uri string and returns RedisConnOpt if uri is valid. // It returns a non-nil error if uri cannot be parsed. // -// Three URI schemes are supported, which are redis:, redis-socket:, and redis-sentinel:. +// Three URI schemes are supported, which are redis:, rediss:, redis-socket:, and redis-sentinel:. // Supported formats are: // redis://[:password@]host[:port][/dbnumber] +// rediss://[:password@]host[:port][/dbnumber] // redis-socket://[:password@]path[?db=dbnumber] // redis-sentinel://[:password@]host1[:port][,host2:[:port]][,hostN:[:port]][?master=masterName] func ParseRedisURI(uri string) (RedisConnOpt, error) { @@ -430,7 +432,7 @@ func ParseRedisURI(uri string) (RedisConnOpt, error) { return nil, fmt.Errorf("asynq: could not parse redis uri: %v", err) } switch u.Scheme { - case "redis": + case "redis", "rediss": return parseRedisURI(u) case "redis-socket": return parseRedisSocketURI(u) @@ -444,6 +446,8 @@ func ParseRedisURI(uri string) (RedisConnOpt, error) { func parseRedisURI(u *url.URL) (RedisConnOpt, error) { var db int var err error + var redisConnOpt RedisClientOpt + if len(u.Path) > 0 { xs := strings.Split(strings.Trim(u.Path, "/"), "/") db, err = strconv.Atoi(xs[0]) @@ -455,7 +459,20 @@ func parseRedisURI(u *url.URL) (RedisConnOpt, error) { if v, ok := u.User.Password(); ok { password = v } - return RedisClientOpt{Addr: u.Host, DB: db, Password: password}, nil + + if u.Scheme == "rediss" { + h, _, err := net.SplitHostPort(u.Host) + if err != nil { + h = u.Host + } + redisConnOpt.TLSConfig = &tls.Config{ServerName: h} + } + + redisConnOpt.Addr = u.Host + redisConnOpt.Password = password + redisConnOpt.DB = db + + return redisConnOpt, nil } func parseRedisSocketURI(u *url.URL) (RedisConnOpt, error) { diff --git a/asynq_test.go b/asynq_test.go index e5fdd62..d1081a8 100644 --- a/asynq_test.go +++ b/asynq_test.go @@ -5,6 +5,7 @@ package asynq import ( + "crypto/tls" "flag" "sort" "strings" @@ -12,6 +13,7 @@ import ( "github.com/go-redis/redis/v8" "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" h "github.com/hibiken/asynq/internal/asynqtest" "github.com/hibiken/asynq/internal/log" ) @@ -99,6 +101,10 @@ func TestParseRedisURI(t *testing.T) { "redis://localhost:6379", RedisClientOpt{Addr: "localhost:6379"}, }, + { + "rediss://localhost:6379", + RedisClientOpt{Addr: "localhost:6379", TLSConfig: &tls.Config{ServerName: "localhost"}}, + }, { "redis://localhost:6379/3", RedisClientOpt{Addr: "localhost:6379", DB: 3}, @@ -151,7 +157,7 @@ func TestParseRedisURI(t *testing.T) { continue } - if diff := cmp.Diff(tc.want, got); diff != "" { + if diff := cmp.Diff(tc.want, got, cmpopts.IgnoreUnexported(tls.Config{})); diff != "" { t.Errorf("ParseRedisURI(%q) = %+v, want %+v\n(-want,+got)\n%s", tc.uri, got, tc.want, diff) } }