Bug Report: UnicodeDecodeError when limit_bytes truncates UTF-8 mid-character
Maintainer thường phản hồi trong vòng 1 ngày
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 68/100
Hướng nghiên cứu
Start with kubernetes/client/rest.py at the UTF-8 decode in request, then inspect the response handling and tests for preloaded content. Reproduce with a response ending in an incomplete UTF-8 sequence and confirm ordinary invalid UTF-8 still behaves as intended. Done means a byte-limited pod log no longer raises UnicodeDecodeError when truncation splits a character.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
When using read_namespaced_pod_log() with _preload_content=True and limit_bytes parameter, the client raises UnicodeDecodeError if the byte limit cuts a multi-byte UTF-8 character in the middle.
Environment
- kubernetes-client version: 36.0.3 (also occurs in versions < 36.0.0)
- Python version: 3.12
- Operating System: Linux
Problem Description
The limit_bytes parameter works at the byte level and can cut a multi-byte UTF-8 character mid-sequence. When _preload_content=True (the default), the client attempts to decode the truncated byte stream as UTF-8 in rest.py:232, which raises UnicodeDecodeError.
Root Cause
In kubernetes/client/rest.py, line 232:
r.data = r.data.decode('utf8')
This assumes:
- The response is valid UTF-8
- The byte stream is complete
However, the Kubernetes API /api/v1/namespaces/{namespace}/pods/{name}/log endpoint:
- Returns logs as a byte stream with no encoding specified (content-type: text/plain)
- The
limitBytesparameter cuts at byte boundaries, not character boundaries - Can therefore return incomplete UTF-8 sequences when the limit is reached
Evidence
Stack Trace
File "/opt/app-root/lib/python3.12/site-packages/kubernetes/client/rest.py", line 232, in request
r.data = r.data.decode('utf8')
^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc2 in position 10485759: unexpected end of data
Analysis
- Position 10485759: This is exactly 10MB - 1 byte (10485760 = 10 * 1024 * 1024)
- Byte 0xc2: Start of a 2-byte UTF-8 sequence (continuation byte missing)
- The error occurs precisely at the
limit_bytesboundary
Full Call Stack
File "/opt/app-root/lib/python3.12/site-packages/kubernetes/client/api/core_v1_api.py", line 24264, in read_namespaced_pod_log
return self.read_namespaced_pod_log_with_http_info(name, namespace, **kwargs)
File "/opt/app-root/lib/python3.12/site-packages/kubernetes/client/api/core_v1_api.py", line 24387, in read_namespaced_pod_log_with_http_info
return self.api_client.call_api(...)
File "/opt/app-root/lib/python3.12/site-packages/kubernetes/client/api_client.py", line 348, in call_api
return self.__call_api(resource_path, method, ...)
File "/opt/app-root/lib/python3.12/site-packages/kubernetes/client/api_client.py", line 180, in __call_api
response_data = self.request(...)
File "/opt/app-root/lib/python3.12/site-packages/kubernetes/client/api_client.py", line 373, in request
return self.rest_client.GET(url, ...)
File "/opt/app-root/lib/python3.12/site-packages/kubernetes/client/rest.py", line 244, in GET
return self.request("GET", url, ...)
File "/opt/app-root/lib/python3.12/site-packages/kubernetes/client/rest.py", line 232, in request
r.data = r.data.decode('utf8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc2 in position 10485759: unexpected end of data
Reproduction
from kubernetes import client, config
config.load_kube_config()
v1 = client.CoreV1Api()
# This will fail if limit_bytes cuts a UTF-8 character mid-sequence
try:
log = v1.read_namespaced_pod_log(
name="pod-with-large-logs",
namespace="default",
limit_bytes=10 * 1024 * 1024, # 10 MB
_preload_content=True, # Default
)
except UnicodeDecodeError as e:
print(f"Error at position {e.start}: {e.reason}")
# Output: Error at position 10485759: 'utf-8' codec can't decode byte 0xc2
Proposed Solutions
Option 1: Handle Incomplete UTF-8 (Recommended)
Modify rest.py:232 to handle incomplete UTF-8 sequences:
# Current code:
r.data = r.data.decode('utf8')
# Proposed fix:
r.data = r.data.decode('utf8', errors='ignore') # Or 'replace'
Or better, strip incomplete sequences at the end:
def safe_decode_utf8(data):
"""Decode UTF-8, handling incomplete sequences at the end."""
try:
return data.decode('utf8')
except UnicodeDecodeError as e:
# If error is at the end, try truncating incomplete sequence
if e.start >= len(data) - 4: # UTF-8 max 4 bytes
return data[:e.start].decode('utf8', errors='strict')
raise
Impact
This affects any application using:
read_namespaced_pod_log()withlimit_bytes- Default
_preload_content=True - Pod logs containing non-ASCII characters (common in error messages, stack traces)
References
- Related issue: #2596 (different manifestation of string handling in v36.x)
- Discussion: https://gitlab.cee.redhat.com/ccx/ccx-ocp-core/-/merge_requests/1146
Expected Behavior
The client should handle incomplete UTF-8 sequences gracefully, OR
Actual Behavior
The client raises an unhandled UnicodeDecodeError that propagates to the application.
- Ngôn ngữ chính
- Python
- Star
- 7.7k
- Fork
- 3.5k
- Merge trung bình
- 1 ngày 9 giờ
- Pull request đã merge (30 ngày)
- 25
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của kubernetes-client/python
-
getheaders is deprecated in urllib3 >= 2.0.0Có thể làm lại được Pull request cho issue này đã bị đóng mà không được merge. Đang mởkind/bug
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 68/100
kubernetes-client/python#2280 · 18 bình luận · 9 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
kind/feature
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
kubernetes-client/python#2764 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Resolve inconsistent typing in 37.0.0 delete operationsCó thể đã có người làm @tamird đã nhận 1 ngày trước. Đang mởkind/feature
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 55/100
kubernetes-client/python#2752 · 8 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Make async an extraCó thể đã có người làm @jdork0 đã nhận 7 ngày trước. Đang mởkind/feature
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 55/100
kubernetes-client/python#2739 · 3 bình luận · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Growing library sizeCó thể đã có người làm Có pull request liên kết đang mở hoặc đã được merge. Đang mởhelp wanted
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 35/100
kubernetes-client/python#2677 · 16 bình luận · 1 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của kubernetes-client/python
Issue tương tự
-
enhancement help wanted
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Git-Hospital/githealthcheck#61 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
changelog investigate
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
ramnes/notion-sdk-py#433 ·
-
Partial method descriptors raise on class accessCó thể đã có người làm @Gambit-Checkmate đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
Maintainer thường phản hồi trong vòng 19 ngày
-
docs pkg:core
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 84/100
pydantic/pydantic-ai#11929 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
intake/intake-esm#789 ·