Fixed OneDrive provider

- Added authentication document
- Fixed date parsing
This commit is contained in:
Amir Abbas Mousavian
2018-02-26 23:47:41 +03:30
parent fd89a04c8e
commit 09cb34352f
7 changed files with 240 additions and 76 deletions
+32 -13
View File
@@ -478,32 +478,50 @@ internal extension TimeInterval {
public extension Date {
/// Date formats used commonly in internet messaging defined by various RFCs.
public enum RFCStandards: String {
/// Date format defined by usenet, commonly used in old implementations.
/// Obsolete (2-digit year) date format defined by RFC 822 for http.
case rfc822 = "EEE',' dd' 'MMM' 'yy HH':'mm':'ss z"
/// Obsolete (2-digit year) date format defined by RFC 850 for usenet.
case rfc850 = "EEEE',' dd'-'MMM'-'yy HH':'mm':'ss z"
/// Date format defined by RFC 1132 for http.
/// Date format defined by RFC 1123 for http.
case rfc1123 = "EEE',' dd' 'MMM' 'yyyy HH':'mm':'ss z"
/// Date format defined by ISO 8601, also defined in RFC 3339. Used by Dropbox.
case iso8601 = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"
/// Date format defined by RFC 3339, as a profile of ISO 8601.
case rfc3339 = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZZZ"
/// Date format defined RFC 3339 as rare case with milliseconds.
case rfc3339Extended = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSSZZZZZ"
/// Date string returned by asctime() function.
case asctime = "EEE MMM d HH':'mm':'ss yyyy"
// Defining a http alias allows changing default time format if a new RFC becomes standard.
/// Equivalent to and defined by RFC 1123.
public static let http = RFCStandards.rfc1123
/// Equivalent to and defined by ISO 8610.
public static let rfc3339 = RFCStandards.iso8601
/// Equivalent to and defined by RFC 850.
public static let usenet = RFCStandards.rfc850
// Sorted by commonness
fileprivate static let allValues: [RFCStandards] = [.rfc1123, .rfc850, .iso8601, .asctime]
/* re. [RFC7231 section-7.1.1.1](https://tools.ietf.org/html/rfc7231#section-7.1.1.1)
"HTTP servers and client MUST accept all three HTTP-date formats" which are IMF-fixdate,
obsolete RFC 850 format and ANSI C's asctime() format.
ISO 8601 format is common in JSON and XML fields, defined by RFC 3339 as a timestamp format.
Though not mandated, we check string against them to allow using Date(rfcString:) in
wider and more general sitations.
We use RFC 822 instead of RFC 1123 to convert from string because NSDateFormatter can parse
both 2-digit and 4-digit year correctly when `dateFormat` year is 2-digit.
These values are sorted by frequency.
*/
fileprivate static let parsingCases: [RFCStandards] = [.rfc822, .rfc850, .asctime, .rfc3339, .rfc3339Extended]
}
private static let posixLocale = Locale(identifier: "en_US_POSIX")
private static let utcTimezone = TimeZone(identifier: "UTC")
/// Checks date string against various RFC standards and returns `Date`.
public init?(rfcString: String) {
let dateFor: DateFormatter = DateFormatter()
dateFor.locale = Locale(identifier: "en_US")
dateFor.locale = Date.posixLocale
for standard in RFCStandards.allValues {
for standard in RFCStandards.parsingCases {
dateFor.dateFormat = standard.rawValue
if let date = dateFor.date(from: rfcString) {
self = date
@@ -515,11 +533,12 @@ public extension Date {
}
/// Formats date according to RFCs standard.
public func format(with standard: RFCStandards, locale: Locale? = nil, timeZone: TimeZone? = nil) -> String {
/// - Note: local and timezone paramters should be nil for `.http` standard
internal func format(with standard: RFCStandards, locale: Locale? = nil, timeZone: TimeZone? = nil) -> String {
let fm = DateFormatter()
fm.dateFormat = standard.rawValue
fm.timeZone = timeZone ?? TimeZone(identifier: "UTC")
fm.locale = locale ?? Locale(identifier: "en_US_POSIX")
fm.timeZone = timeZone ?? Date.utcTimezone
fm.locale = locale ?? Date.posixLocale
return fm.string(from: self)
}
}