Browse Source

[Issue #1458] Fixed URLEncoding issue around NSNumber parameter encoding.

Christian Noon 9 years ago
parent
commit
72958d0ebe
2 changed files with 42 additions and 0 deletions
  1. 12 0
      Source/ParameterEncoding.swift
  2. 30 0
      Tests/ParameterEncodingTests.swift

+ 12 - 0
Source/ParameterEncoding.swift

@@ -163,6 +163,12 @@ public struct URLEncoding: ParameterEncoding {
             for value in array {
                 components += queryComponents(fromKey: "\(key)[]", value: value)
             }
+        } else if let value = value as? NSNumber {
+            if value.isBool {
+                components.append((escape(key), escape((value.boolValue ? "1" : "0"))))
+            } else {
+                components.append((escape(key), escape("\(value)")))
+            }
         } else if let bool = value as? Bool {
             components.append((escape(key), escape((bool ? "1" : "0"))))
         } else {
@@ -359,3 +365,9 @@ public struct PropertyListEncoding: ParameterEncoding {
         return urlRequest
     }
 }
+
+// MARK: -
+
+extension NSNumber {
+    fileprivate var isBool: Bool { return CFBooleanGetTypeID() == CFGetTypeID(self) }
+}

+ 30 - 0
Tests/ParameterEncodingTests.swift

@@ -117,6 +117,36 @@ class URLParameterEncodingTestCase: ParameterEncodingTestCase {
         }
     }
 
+    func testURLParameterEncodeStringKeyNSNumberIntegerValueParameter() {
+        do {
+            // Given
+            let parameters = ["foo": NSNumber(value: 25)]
+
+            // When
+            let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
+
+            // Then
+            XCTAssertEqual(urlRequest.url?.query, "foo=25")
+        } catch {
+            XCTFail("Test encountered unexpected error: \(error)")
+        }
+    }
+
+    func testURLParameterEncodeStringKeyNSNumberBoolValueParameter() {
+        do {
+            // Given
+            let parameters = ["foo": NSNumber(value: false)]
+
+            // When
+            let urlRequest = try encoding.encode(self.urlRequest, with: parameters)
+
+            // Then
+            XCTAssertEqual(urlRequest.url?.query, "foo=0")
+        } catch {
+            XCTFail("Test encountered unexpected error: \(error)")
+        }
+    }
+
     func testURLParameterEncodeStringKeyIntegerValueParameter() {
         do {
             // Given