From 5a61c340b2c1c8acf3a0904db8d3d41b5f947cf1 Mon Sep 17 00:00:00 2001 From: kento_yoshida Date: Wed, 15 Oct 2025 07:52:26 +0000 Subject: [PATCH 1/2] Fix JQL Japanese character encoding issue (#38462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix an error that occurs when JQL queries contain Japanese characters ## Problem - Error occurs when JQL contains Japanese characters (e.g., `labels="ใƒ†ใ‚นใƒˆ"`) - Error message: "Could not guess schema due to empty data set" - Works correctly with curl command using `--data-urlencode` ## Root Cause - StringEntity in JiraClient.java was created without explicit encoding - Defaulted to ISO-8859-1, causing Japanese characters to be incorrectly encoded ## Changes - Explicitly specify UTF-8 encoding in StringEntity constructor - Add test case for Japanese JQL queries ## Testing - All existing tests pass - Japanese JQL query test case passes ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../embulk/input/jira/client/JiraClient.java | 3 ++- .../input/jira/client/JiraClientTest.java | 22 ++++++++++++++++++ src/test/resources/jira_client.json | 23 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/embulk/input/jira/client/JiraClient.java b/src/main/java/org/embulk/input/jira/client/JiraClient.java index b192f67..49b715a 100644 --- a/src/main/java/org/embulk/input/jira/client/JiraClient.java +++ b/src/main/java/org/embulk/input/jira/client/JiraClient.java @@ -30,6 +30,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; @@ -225,7 +226,7 @@ private HttpRequestBase createPostRequest(final PluginTask task, final String ur request.setHeader(CONTENT_TYPE, "application/json"); break; } - request.setEntity(new StringEntity(body)); + request.setEntity(new StringEntity(body, StandardCharsets.UTF_8)); return request; } diff --git a/src/test/java/org/embulk/input/jira/client/JiraClientTest.java b/src/test/java/org/embulk/input/jira/client/JiraClientTest.java index 7b91b80..d5182c6 100644 --- a/src/test/java/org/embulk/input/jira/client/JiraClientTest.java +++ b/src/test/java/org/embulk/input/jira/client/JiraClientTest.java @@ -182,4 +182,26 @@ public void test_searchIssues_emptyJql() throws IOException issues = result.getLeft(); assertEquals(issues.size(), 2); } + + @Test + public void test_searchIssues_withJapaneseJql() throws IOException + { + String dataName = "searchIssuesWithJapaneseJql"; + JsonObject messageResponse = data.get(dataName).getAsJsonObject(); + + int statusCode = messageResponse.get("statusCode").getAsInt(); + String body = messageResponse.get("body").toString(); + + when(statusLine.getStatusCode()).thenReturn(statusCode); + when(response.getEntity()).thenReturn(new StringEntity(body, "UTF-8")); + + ConfigSource config = TestHelpers.config().set("jql", "labels=\"ใƒ†ใ‚นใƒˆ\""); + task = CONFIG_MAPPER.map(config, PluginTask.class); + + Pair, String> result = jiraClient.searchIssues(task, null, 50); + List issues = result.getLeft(); + assertEquals(1, issues.size()); + assertEquals("TEST-1", issues.get(0).getValue("key").getAsString()); + assertEquals("ใƒ†ใ‚นใƒˆ", issues.get(0).getValue("string").getAsString()); + } } diff --git a/src/test/resources/jira_client.json b/src/test/resources/jira_client.json index 48ee84e..a2b6c46 100644 --- a/src/test/resources/jira_client.json +++ b/src/test/resources/jira_client.json @@ -77,5 +77,28 @@ ], "errors": {} } + }, + "searchIssuesWithJapaneseJql": { + "statusCode": 200, + "body": { + "startAt": 0, + "maxResults": 50, + "total": 1, + "issues": [ + { + "id": "id1", + "key": "TEST-1", + "self": "self1", + "fields": { + "boolean": true, + "long": 1, + "double": 1, + "string": "ใƒ†ใ‚นใƒˆ", + "date": "2019-01-01T00:00:00.000Z", + "json": {} + } + } + ] + } } } \ No newline at end of file From e1b602f756f974a4291fb8a29f29a67a9656951c Mon Sep 17 00:00:00 2001 From: kento_yoshida Date: Wed, 15 Oct 2025 08:11:55 +0000 Subject: [PATCH 2/2] Add charset=UTF-8 to Content-Type header MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Explicitly specify UTF-8 charset in Content-Type header to ensure the server correctly interprets the request body encoding. This complements the StringEntity UTF-8 encoding fix by informing the server that the request body is UTF-8 encoded. ๐Ÿค– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/main/java/org/embulk/input/jira/client/JiraClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/embulk/input/jira/client/JiraClient.java b/src/main/java/org/embulk/input/jira/client/JiraClient.java index 49b715a..9bc19a5 100644 --- a/src/main/java/org/embulk/input/jira/client/JiraClient.java +++ b/src/main/java/org/embulk/input/jira/client/JiraClient.java @@ -223,7 +223,7 @@ private HttpRequestBase createPostRequest(final PluginTask task, final String ur task.getUsername(), task.getPassword()).getBytes()))); request.setHeader(ACCEPT, "application/json"); - request.setHeader(CONTENT_TYPE, "application/json"); + request.setHeader(CONTENT_TYPE, "application/json; charset=UTF-8"); break; } request.setEntity(new StringEntity(body, StandardCharsets.UTF_8));