Nhiệm vụ: Sửa lỗi giải mã URL trong haih-agent
Sửa lỗi giải mã URL trong haih-agent
Thêm tính năng giải mã URL/route params chính xác trong haih-agent để các ký tự đặc biệt được mã hóa phần trăm (percent-encoded) không dẫn đến lỗi 404 giả.
Vấn đề
haih-agent gặp phải lỗi tương tự như trên freecode.academy: các URL chứa ký tự đặc biệt ở dạng mã hóa phần trăm có thể dẫn đến lỗi 404 mặc dù thực thể tương ứng có tồn tại.
Nguyên nhân đã được xác nhận: thiếu cơ chế giải mã URL chính xác. Trong trường hợp ứng dụng này, việc sử dụng decodeURI sẽ giải quyết được vấn đề.
Những việc cần làm
- Tìm đoạn mã chung trong
haih-agentnơi URL/route params/slug được sử dụng để tìm kiếm thực thể hoặc khớp tuyến đường (route matching). - Thêm tính năng giải mã đồng nhất trước logic nghiệp vụ/tra cứu (lookup) để các ký tự được mã hóa phần trăm được so sánh với dữ liệu ở định dạng mong đợi.
- Xác định chính xác vị trí áp dụng
decodeURIhoặc tương đương sao cho bản sửa lỗi hoạt động tập trung, và các dự án dựa trênhaih-agentkhông bắt buộc phải sửa cục bộ. - Tránh giải mã hai lần và tránh lỗi trên các giá trị đã được giải mã.
- Kiểm tra khả năng tương tác với việc tạo URL/URL chuẩn (canonical URLs) để đảm bảo việc mã hóa/giải mã đối xứng và được thực hiện đúng một lần tại ranh giới tương ứng.
Ví dụ về trường hợp lỗi
/comments/topics/dzheneriki-typescript/nu-vot-ts-tebe-govorit-%22ty-zanimaeshsya-figney%22,-i
Trước khi sửa, URL như vậy có thể trả về lỗi 404 do %22 và các ký tự được mã hóa khác. Sau khi giải mã, trang/thực thể hiện có phải được tìm thấy.
Kiểm tra riêng các trường hợp
%22/ dấu ngoặc kép;- Chữ cái tiếng Nga (Cyrillic);
- khoảng trắng và
%20; %25và các trường hợp có khả năng mã hóa hai lần;- dấu phẩy và các ký tự slug hợp lệ khác;
- mã hóa phần trăm bị lỗi (malformed percent-encoding) — không được làm sập ứng dụng;
- các tham số tuyến đường đã được giải mã — không bị lỗi khi giải mã lại.
Tiêu chí nghiệm thu
- Đã tìm thấy và khắc phục nguồn gốc chung của sự cố trong
haih-agent. - Các URL được mã hóa phần trăm được phân giải chính xác thành các trang/thực thể hiện có.
- Đã xác nhận rằng
decodeURIhoặc lựa chọn tương đương được áp dụng ở cấp độ chính xác và không dẫn đến giải mã hai lần. - Mã hóa phần trăm không hợp lệ được xử lý an toàn và không gây ra lỗi 500.
- Đã thêm các bài kiểm tra hồi quy (regression tests) ít nhất cho
%22, chữ cái tiếng Nga,%20,%25và mã hóa bị lỗi. - Đã xác minh rằng bản sửa lỗi không làm hỏng các URL thông thường không có ký tự đặc biệt.
- Nếu có thể, bản sửa lỗi được thực hiện tập trung để tự động giải quyết vấn đề trong các dự án sử dụng
haih-agent.
Ворклоги
Làm rõ về việc giải mã URI
Sau khi kiểm tra, hóa ra decodeURI(asPath) không giải quyết được tất cả các trường hợp cần thiết.
Ví dụ cụ thể:
/projects/%40prisma-cms/sendmail
được kỳ vọng là:
/projects/@prisma-cms/sendmail
Nhưng decodeURI() lại giữ nguyên %40, bởi vì @ thuộc về các ký tự URI được bảo lưu và toàn bộ URI không được giải mã hoàn toàn.
Đối với URI của các thực thể, việc xử lý đường dẫn theo từng phân đoạn (segment) sẽ chính xác hơn:
- Đầu tiên, tách pathname theo
/, giữ nguyên cấu trúc định tuyến. - Cho từng phân đoạn đi qua
decodeURIComponent()một cách riêng biệt. - Ráp lại đường dẫn.
Bằng cách này, chúng ta nhận được kết quả giải mã mong muốn %40 -> @, mà không gặp rủi ro là một ký tự %2F được mã hóa bên trong một slug đơn lẻ sẽ sớm biến thành dấu / cấu trúc và làm thay đổi số lượng phân đoạn tuyến đường.
Nói cách khác, logic đích phải nhận biết phân đoạn (segment-aware), ví dụ về mặt khái niệm:
const uri = pathname
.split('/')
.map(segment => decodeURIComponent(segment))
.join('/')
Điều này cũng tương xứng với cách triển khai hiện tại của slugifyUri(), vốn đã hoạt động theo từng phân đoạn.
decodeURI(asPath) hiện tại có thể được coi là một bản sửa lỗi tạm thời: nó giải quyết các trường hợp như %22, nhưng không xử lý %40 và các ký tự được bảo lưu khác nếu chúng là một phần của slug/URI thực thể.
Lỗi URIError riêng biệt không được xem xét ở đây như một vấn đề của nhiệm vụ này: các lỗi kỹ thuật liên quan đến URL bị lỗi định dạng (malformed URL) phải được xử lý riêng.
Tiến độ: bản vá đã được thực hiện và mở rộng đến nền tảng CNC (ChPU)
Việc triển khai đã được thực hiện trong commit: https://github.com/haih-net/agent/commit/1f99a51dd407eb4e58f9e2f83f411a265db2f24c
Các URI đến giờ đây được giải mã thông qua decodeURI tại các điểm quan trọng khi làm việc với router.asPath, giúp loại bỏ lỗi 404 giả cho các trang hiện có chứa các ký tự mã hóa phần trăm (percent-encoded).
Đồng thời, công việc đã được mở rộng ra nền tảng URI chung của haih-agent: đã thêm tính năng tạo slugified URI từ tên khái niệm và tự động chuyển hướng 301 khi thay đổi URI. Điều này được thực hiện như một nền tảng cho việc chuyển đổi các ứng dụng dựa trên haih-agent sang các URL thân thiện với con người.
Phần tiếp theo thực tế là SEO/GEO của fi1osof.ru, nơi các URL nhiệm vụ và dự án hiện tại đang sử dụng CUID kỹ thuật. Nhiệm vụ liên quan: Nâng cấp SEO/GEO.