diff --git a/CHANGELOG.md b/CHANGELOG.md index 543863c2..b98f92b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,7 +42,7 @@ _None._ ### Bug Fixes -_None._ +- Fix crash when querying a WordPress plugin whose slug is not url-safe. [#767] ### Internal Changes diff --git a/Sources/WordPressKit/Services/PluginDirectoryServiceRemote.swift b/Sources/WordPressKit/Services/PluginDirectoryServiceRemote.swift index 5dd800b7..d46c3f19 100644 --- a/Sources/WordPressKit/Services/PluginDirectoryServiceRemote.swift +++ b/Sources/WordPressKit/Services/PluginDirectoryServiceRemote.swift @@ -58,7 +58,7 @@ public struct PluginDirectoryGetInformationEndpoint { func buildRequest() throws -> URLRequest { try HTTPRequestBuilder(url: PluginDirectoryRemoteConstants.getInformationEndpoint) - .append(percentEncodedPath: "\(slug).json") + .appendURLString("\(slug).json") .query(name: "fields", value: "icons,banners") .build() } diff --git a/Tests/WordPressKitTests/Tests/PluginDirectoryTests.swift b/Tests/WordPressKitTests/Tests/PluginDirectoryTests.swift index 13b9f1a8..88671778 100644 --- a/Tests/WordPressKitTests/Tests/PluginDirectoryTests.swift +++ b/Tests/WordPressKitTests/Tests/PluginDirectoryTests.swift @@ -343,4 +343,16 @@ class PluginDirectoryTests: XCTestCase { XCTAssertTrue(lhs == rhs) } + + func testUnconventionalPluginSlug() async throws { + let data = try MockPluginDirectoryProvider.getPluginDirectoryMockData(with: "plugin-directory-rename-xml-rpc", sender: type(of: self)) + stub(condition: isHost("api.wordpress.org")) { _ in + HTTPStubsResponse(data: data, statusCode: 200, headers: ["Content-Type": "application/json"]) + } + + let _ = try await PluginDirectoryServiceRemote().getPluginInformation(slug: "%-is-not-allowed") + let _ = try await PluginDirectoryServiceRemote().getPluginInformation(slug: "中文") + + // No assertion needed. + } }