diff options
Diffstat (limited to 'internal/imap/url.go')
-rw-r--r-- | internal/imap/url.go | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/internal/imap/url.go b/internal/imap/url.go new file mode 100644 index 0000000..6ffea72 --- /dev/null +++ b/internal/imap/url.go @@ -0,0 +1,76 @@ +package imap + +import ( + "net" + "net/url" + + "github.com/Necoro/feed2imap-go/internal/log" +) + +// Our own convenience wrapper +type URL struct { + *url.URL + // url.URL has no port field and splits it everytime from Host + port *string +} + +const ( + imapsPort = "993" + imapPort = "143" + imapsSchema = "imaps" + imapSchema = "imap" +) + +func (url *URL) Port() string { + if url.port == nil { + port := url.URL.Port() + url.port = &port + } + return *url.port +} + +func (url *URL) ForceTLS() bool { + return url.Scheme == imapsSchema || url.Port() == imapsPort +} + +func (url *URL) setDefaultScheme() { + switch url.Scheme { + case imapSchema, imapsSchema: + return + default: + oldScheme := url.Scheme + if url.Port() == imapsPort { + url.Scheme = imapsSchema + } else { + url.Scheme = imapSchema + } + + if oldScheme != "" { + log.Warnf("Unknown scheme '%s', defaulting to '%s'", oldScheme, url.Scheme) + } + } +} + +func (url *URL) setDefaultPort() { + if url.Port() == "" { + var port string + if url.Scheme == imapsSchema { + port = imapsPort + } else { + port = imapPort + } + url.port = &port + url.Host = net.JoinHostPort(url.Host, port) + } +} + +func (url *URL) sanitizeUrl() { + url.setDefaultScheme() + url.setDefaultPort() +} + +func NewUrl(url *url.URL) *URL { + u := URL{URL: url} + u.sanitizeUrl() + return &u +}
\ No newline at end of file |