فهرست منبع

Fix an issue where empty Encodable Parameters resulted in a non-nil query string. (#2818)

David Barry 6 سال پیش
والد
کامیت
1081318d3b
2فایلهای تغییر یافته به همراه14 افزوده شده و 1 حذف شده
  1. 1 1
      Source/ParameterEncoder.swift
  2. 13 0
      Tests/ParameterEncoderTests.swift

+ 1 - 1
Source/ParameterEncoder.swift

@@ -167,7 +167,7 @@ open class URLEncodedFormParameterEncoder: ParameterEncoder {
             let query: String = try AFResult<String> { try encoder.encode(parameters) }
                                 .mapError { AFError.parameterEncoderFailed(reason: .encoderFailed(error: $0)) }.get()
             let newQueryString = [components.percentEncodedQuery, query].compactMap { $0 }.joinedWithAmpersands()
-            components.percentEncodedQuery = newQueryString
+            components.percentEncodedQuery = newQueryString.isEmpty ? nil : newQueryString
 
             guard let newURL = components.url else {
                 throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.url))

+ 13 - 0
Tests/ParameterEncoderTests.swift

@@ -177,6 +177,19 @@ final class URLEncodedFormParameterEncoderTests: BaseTestCase {
         let components = URLComponents(url: newRequest.url!, resolvingAgainstBaseURL: false)
         XCTAssertEqual(components?.percentEncodedQuery, "property=property")
     }
+
+    func testThatQueryIsNilWhenEncodableResultsInAnEmptyString() throws {
+        // Given
+        let encoder = URLEncodedFormParameterEncoder(destination: .queryString)
+        let request = URLRequest.makeHTTPBinRequest()
+
+        // When
+        let newRequest = try encoder.encode([String: String](), into: request)
+
+        // Then
+        let components = URLComponents(url: newRequest.url!, resolvingAgainstBaseURL: false)
+        XCTAssertNil(components?.percentEncodedQuery)
+    }
 }
 
 final class URLEncodedFormEncoderTests: BaseTestCase {