Endpoints API 使用 OAuth 會遇到的 RuntimeError: UnicodeDecodeError

前陣子在做 BigData Lab 時使用到 Cloud Endpoints API 來串接 server 上的 API 來省去自己開發 JavaScript SDK 的時間,原本在 local 端測試也都測試的好好的,突然某一天早上睡覺起來打開電腦開始寫 code 就發現 local 不能用了,後來測試發現只有在帶有 OAuth Authentication 時才會噴出這個錯誤。

因此我到 Google Code 的 googleappengine 上面去發了個 issue:

Issue 10285: RuntimeError: UnicodeDecodeError('utf8', "id_token verification failed: Can't parse header: \xc9\xad\xbd", 52, 53, 'invalid start byte')

並且跑到 Google+ Community 去廣邀大家幫我 Star 這個 issue,所以 Google 真的很快看到並且解決了呢,現在 Endpoints API 又可以在 local 測了好爽,比脫掉外套撿到兩百塊還爽。

解決方法

解決方法如下,有兩種:

自己套用 Patch

Google 的人有把 patch 直接貼上來,可以到 google_appengine/google/appengine/api/logservice 的資料夾底下,套用這個 Patch:

Solution of "RuntimeError: UnicodeDecodeError('utf8', "id_token verification failed: Can't parse header: \xc9\xad\xbd", 52, 53, 'invalid start byte')"

*** logservice_stub.py  2013-11-27 09:09:49.463620508 -0800
--- logservice_stub.py.new 2013-11-27 09:16:53.893843940 -0800
***************
*** 19,20 ****
--- 19,21 ----
  import atexit
+ import codecs
  import logging
***************
*** 217,219 ****
      if isinstance(message, str):
!       message = message.decode('utf-8')
      return (row_id, log_line.timestamp_usec(), log_line.level(), message)
--- 218,220 ----
      if isinstance(message, str):
!       message = codecs.decode(message, 'utf-8', 'replace')
      return (row_id, log_line.timestamp_usec(), log_line.level(), message)

Patch 的方式如下:

cd google_appengine/google/appengine/api/logservice # google_appengine 就是你的 GAE SDK 目錄

patch < path/to/utf8_patch_for_appengine.patch # 剛剛下載下來的 patch

手動直接修改

找到 google_appengine/google/appengine/api/logservice/logservice_stub.py 這個檔案,到開頭多 import codecs 這個 library。

import codecs

然後到 218 行,找到

message = message.decode('utf-8')

把它換成

message = codecs.decode(message, 'utf-8', 'replace')

Python 內建的 decode 大概不夠給力,不過這樣一來總算是可以在 local 測 Endpoints 了,我猜可能是後來 Google 有去改動線上那隻 js api 造成的。

結論

下次遇到急迫的 Google App Engine 問題時,可以去 Google Code 的 repository 看看有沒有相關的 issue,沒有的話就自己發一個,然後到社群網路上發佈一下(個人推薦 Google+ Community 上的 Google App Engine 群組,人還蠻多的),大家也有遇到一樣的問題就會幫你打個星星,Google 的人才會比較容易注意到問題。

comments powered by Disqus