From 620d0ab88d1d5e81078eb40d2e973d6f9bbae0b2 Mon Sep 17 00:00:00 2001 From: Philipp Heckel Date: Sun, 5 Jun 2022 11:07:23 -0400 Subject: [PATCH] Timeout --- ntfy/Utils/ApiService.swift | 15 +++++++++++---- ntfy/Views/SettingsView.swift | 2 ++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/ntfy/Utils/ApiService.swift b/ntfy/Utils/ApiService.swift index 43f525b..1a1a629 100644 --- a/ntfy/Utils/ApiService.swift +++ b/ntfy/Utils/ApiService.swift @@ -23,7 +23,7 @@ class ApiService { Log.d(tag, "Polling single message from \(url) with user \(user?.username ?? "anonymous")") let request = newRequest(url: url, user: user) - URLSession.shared.dataTask(with: request) { (data, response, error) in + newSession(timeout: 30).dataTask(with: request) { (data, response, error) in if let error = error { completionHandler(nil, error) return @@ -55,7 +55,7 @@ class ApiService { request.setValue(String(priority), forHTTPHeaderField: "Priority") request.setValue(tags.joined(separator: ","), forHTTPHeaderField: "Tags") request.httpBody = message.data(using: String.Encoding.utf8) - URLSession.shared.dataTask(with: request) { (data, response, error) in + newSession(timeout: 10).dataTask(with: request) { (data, response, error) in guard error == nil else { Log.e(self.tag, "Error publishing message", error!) return @@ -68,7 +68,7 @@ class ApiService { guard let url = URL(string: topicAuthUrl(baseUrl: baseUrl, topic: topic)) else { return } let request = newRequest(url: url, user: user) Log.d(tag, "Checking auth for \(url) with user \(user?.username ?? "anonymous")") - URLSession.shared.dataTask(with: request) { (data, response, error) in + newSession(timeout: 10).dataTask(with: request) { (data, response, error) in if let error = error { Log.e(self.tag, "Error checking auth: \(error)") completionHandler(.Error(error.localizedDescription)) @@ -98,7 +98,7 @@ class ApiService { private func fetchJsonData(urlString: String, user: BasicUser?, completionHandler: @escaping ([T]?, Error?) -> ()) { guard let url = URL(string: urlString) else { return } let request = newRequest(url: url, user: user) - URLSession.shared.dataTask(with: request) { (data, response, error) in + newSession(timeout: 30).dataTask(with: request) { (data, response, error) in if let error = error { Log.e(self.tag, "Error fetching data", error) completionHandler(nil, error) @@ -126,6 +126,13 @@ class ApiService { } return request } + + private func newSession(timeout: TimeInterval) -> URLSession { + let sessionConfig = URLSessionConfiguration.default + sessionConfig.timeoutIntervalForRequest = timeout + sessionConfig.timeoutIntervalForResource = timeout + return URLSession(configuration: sessionConfig) + } } struct BasicUser { diff --git a/ntfy/Views/SettingsView.swift b/ntfy/Views/SettingsView.swift index 177def7..a2c5d05 100644 --- a/ntfy/Views/SettingsView.swift +++ b/ntfy/Views/SettingsView.swift @@ -123,6 +123,8 @@ struct UsersView: View { return false } else if username.isEmpty || password.isEmpty { return false + } else if store.getUser(baseUrl: baseUrl) != nil { + return false } } else { // Existing user if username.isEmpty {