fix crash

This commit is contained in:
Ryan ZHAO 2020-11-18 11:56:11 +11:00
parent 4f3a8d93a7
commit e35756609b

View file

@ -496,8 +496,8 @@ public class OWSLinkPreview: MTLModel {
return Promise.value(cachedInfo) return Promise.value(cachedInfo)
} }
return downloadLink(url: previewUrl) return downloadLink(url: previewUrl)
.then(on: DispatchQueue.global()) { (data) -> Promise<OWSLinkPreviewDraft> in .then(on: DispatchQueue.global()) { (data, response) -> Promise<OWSLinkPreviewDraft> in
return parseLinkDataAndBuildDraft(linkData: data, linkUrlString: previewUrl) return parseLinkDataAndBuildDraft(linkData: data, response: response, linkUrlString: previewUrl)
}.then(on: DispatchQueue.global()) { (linkPreviewDraft) -> Promise<OWSLinkPreviewDraft> in }.then(on: DispatchQueue.global()) { (linkPreviewDraft) -> Promise<OWSLinkPreviewDraft> in
guard linkPreviewDraft.isValid() else { guard linkPreviewDraft.isValid() else {
throw LinkPreviewError.noPreview throw LinkPreviewError.noPreview
@ -508,8 +508,13 @@ public class OWSLinkPreview: MTLModel {
} }
} }
// Twitter doesn't return OpenGraph tags to Signal
// `curl -A Signal "https://twitter.com/signalapp/status/1280166087577997312?s=20"`
// If this ever changes, we can switch back to our default User-Agent
private static let userAgentString = "WhatsApp"
class func downloadLink(url urlString: String, class func downloadLink(url urlString: String,
remainingRetries: UInt = 3) -> Promise<Data> { remainingRetries: UInt = 3) -> Promise<(Data, URLResponse)> {
Logger.verbose("url: \(urlString)") Logger.verbose("url: \(urlString)")
@ -530,10 +535,12 @@ public class OWSLinkPreview: MTLModel {
return Promise(error: LinkPreviewError.assertionFailure) return Promise(error: LinkPreviewError.assertionFailure)
} }
let (promise, resolver) = Promise<Data>.pending() sessionManager.requestSerializer.setValue(self.userAgentString, forHTTPHeaderField: "User-Agent")
let (promise, resolver) = Promise<(Data, URLResponse)>.pending()
sessionManager.get(urlString, sessionManager.get(urlString,
parameters: [String: AnyObject](), parameters: [String: AnyObject](),
headers: [:], headers: nil,
progress: nil, progress: nil,
success: { task, value in success: { task, value in
@ -559,7 +566,7 @@ public class OWSLinkPreview: MTLModel {
resolver.reject(LinkPreviewError.invalidContent) resolver.reject(LinkPreviewError.invalidContent)
return return
} }
resolver.fulfill(data) resolver.fulfill((data, response))
}, },
failure: { _, error in failure: { _, error in
Logger.verbose("Error: \(error)") Logger.verbose("Error: \(error)")
@ -576,8 +583,8 @@ public class OWSLinkPreview: MTLModel {
return return
} }
OWSLinkPreview.downloadLink(url: urlString, remainingRetries: remainingRetries - 1) OWSLinkPreview.downloadLink(url: urlString, remainingRetries: remainingRetries - 1)
.done(on: DispatchQueue.global()) { (data) in .done(on: DispatchQueue.global()) { (data, response) in
resolver.fulfill(data) resolver.fulfill((data, response))
}.catch(on: DispatchQueue.global()) { (error) in }.catch(on: DispatchQueue.global()) { (error) in
resolver.reject(error) resolver.reject(error)
}.retainUntilComplete() }.retainUntilComplete()
@ -662,9 +669,10 @@ public class OWSLinkPreview: MTLModel {
} }
class func parseLinkDataAndBuildDraft(linkData: Data, class func parseLinkDataAndBuildDraft(linkData: Data,
response: URLResponse,
linkUrlString: String) -> Promise<OWSLinkPreviewDraft> { linkUrlString: String) -> Promise<OWSLinkPreviewDraft> {
do { do {
let contents = try parse(linkData: linkData) let contents = try parse(linkData: linkData, response: response)
let title = contents.title let title = contents.title
guard let imageUrl = contents.imageUrl else { guard let imageUrl = contents.imageUrl else {
@ -699,9 +707,9 @@ public class OWSLinkPreview: MTLModel {
} }
} }
class func parse(linkData: Data) throws -> OWSLinkPreviewContents { class func parse(linkData: Data, response: URLResponse) throws -> OWSLinkPreviewContents {
guard let linkText = String(bytes: linkData, encoding: .utf8) else { guard let linkText = String(data: linkData, urlResponse: response) else {
owsFailDebug("Could not parse link text.") print("Could not parse link text.")
throw LinkPreviewError.invalidInput throw LinkPreviewError.invalidInput
} }