Request đi từ Windows live writer preview mode - tìm ra rồi

Sunday, February 1, 2009 0 phản hồi

Vừa ăn Tết xong đã bị khách hàng dzí vì một issue trên plugin viết cho Windows Live Writer. Issue đơn giản như thế này:

Module mình vừa release là một plugin viết cho Windows Live Writer (một công cụ soạn thảo blog của Microsoft có thể tích hợp với nhiều blogging platform). Chức năng chính của module là cho phép tìm kiếm một số thông tin đặc biệt và nhúng nội dung tìm được vào cửa sổ blog editor của Windows Live Writer. Khách hàng mong đợi ở chế độ preview của editor này có thể nhìn thấy nội dung hiển thị như khi xem trên blog thật. Tuy nhiên, vì một số hạn chế kĩ thuật dưới đây nên ở preview mode, html content bị vỡ layout và không show được một số phần content liên quan đến business của khách hàng.
1. Windows Live Writer sử dụng một browser engine khác trong preview mode và chặn một số script đặc biệt
2. Cơ chế render nội dung của browser engine này xử lý không tốt cho CSS 2.0 => vỡ layout.

Chính vì những hạn chế này, product manager của khách hàng yêu cầu: chỉ render ra một nội dung HTML đơn giản (chỉ show image tag) ở chế độ preview mode.

Sau khi suy nghĩ về solution trong vài ngày đầu - mình hoàn toàn bị tắc nghẽn. Vì để làm được điều này ta cần biết được request nào đi từ Windows Live Writer và request nào đi từ browser mà user đang duyệt web bình thường. Biết được điều đó ta có thể chặn và render ra những đoạn javascript để sinh ra HTML đúng như mong đợi.

Dưới đây là những phương pháp tôi đã thử:
1. Phân tích http request header khi đi từ Windows Live Writer và request đi từ các browser khác.
Kết quả: hoàn toàn giống nhau. WLW sử dụng một browser engine build từ một version trước của Internet Explorer.
2. Kiểm tra URL referer ở phía client trên WLW và các browser khác:
Kết quả: đều bằng null. Điều này chứng tỏ: WLW preview page được render trực tiếp mà không đi qua trang trung gian nào

Đã trao đổi với technical team của khách hàng để họ hiểu được issue. Critical bug này được chuyển sang cho một developer của team họ để giải quyết. Kết quả: Họ cũng không có solution sau hơn 3 tuần mò mẫm.
Tuyệt vọng!!!

Ngày đầu năm, bị sếp dzí và cho biết khách hàng đang complain. Sếp yêu cầu viết mail cho Microsoft nhờ support. Lên trao đổi với anh T - production manager để giúp anh hiểu vấn đề về những khó khăn hiện tại.
Bước ra khỏi thang máy với cái đầu hoang mang trăm chuyện. Quyết định: uống một ly cafe cho sáng suốt. Đúng là cafe có tác dụng cho những hoàn cảnh như thế này. Uống xong bỗng lóe lên một hy vọng.
Phát hiện ra là mình chưa kiểm tra URL referer khi WLW request về phía server (lúc trước chỉ kiểm tra toàn http header).
Và dưới đây là kết quả:
Đứng từ WLW ở preview mode khi request về server thì URL Referer luôn bằng null. Thông thường, khi ta include một file javascript vào một trang - nếu chặn ở server ta sẽ thấy URL referer của request đến nó chính là URL của trang đang chứa đoạn script include này. Riêng với WLW, nó lại là NULL. Đây chính là tín hiệu giúp ta phân biệt được đâu là request từ Windows Live Writer và đâu là request đi từ browser bình thường.

Xong!