aboutsummaryrefslogtreecommitdiff
path: root/internal/imap/url.go
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.eu>2020-04-23 20:48:17 +0200
committerRené 'Necoro' Neumann <necoro@necoro.eu>2020-04-23 20:48:17 +0200
commitc883470c2ef977b8675b12428591bb003694e235 (patch)
tree09cd8fa950594e1ea13aa52492ce8116e07ef30b /internal/imap/url.go
parent6bd87a567ef481b922f6baec2b475ec376c45443 (diff)
downloadfeed2imap-go-c883470c2ef977b8675b12428591bb003694e235.tar.gz
feed2imap-go-c883470c2ef977b8675b12428591bb003694e235.tar.bz2
feed2imap-go-c883470c2ef977b8675b12428591bb003694e235.zip
Restructure imap pkg
Diffstat (limited to '')
-rw-r--r--internal/imap/url.go76
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