CakePHPのOAuthライブラリが動かない場合の対応方法

CakePHPでOAuthを使うのに、このライブラリが有名だと思います。

http://code.42dh.com/oauth/

MITライセンスなのが良いですよね。

ところが、これを使ったCakePHPのシステムで、debug=2の時は動くのに、debug=0にすると動かないという謎の問題に出くわしました。

止まる場所は、認証ページへのリダイレクトに使う、

$consumer->getRequestToken('http://twitter.com/oauth/request_token', $callback);

のあたりです。

ソースを追ってみたところ、OAuth.phpの以下の場所で止まっていました。

public function get_normalized_http_url() {
  $parts = parse_url($this->http_url);

  $port = @$parts['port']; // ←ここ!!
  $scheme = $parts['scheme'];
  $host = $parts['host'];
  $path = @$parts['path'];

  $port or $port = ($scheme == 'https') ? '443' : '80';

  if (($scheme == 'https' && $port != '443')
      || ($scheme == 'http' && $port != '80')) {
    $host = "$host:$port";
  }
  return "$scheme://$host$path";
}

いや、確かに、portというキーは無かったんですけど、
そのための@演算子だし、そもそもこんなのでFatal Errorになるはずもなく。

要するに、PHPエンジンの方のバグなのか、謎ですね・・・

解決策は以下。

public function get_normalized_http_url() {
  $parts = parse_url($this->http_url);

  //== add this ==
  if (!array_key_exists('port', $parts)) {
      $parts['port'] = (isset($parts['scheme']) && $parts['scheme'] == 'https') ? '443' : '80';
  }
  //== add this ==

  $port = @$parts['port'];
  $scheme = $parts['scheme'];
  $host = $parts['host'];
  $path = @$parts['path'];

  $port or $port = ($scheme == 'https') ? '443' : '80';

  if (($scheme == 'https' && $port != '443')
      || ($scheme == 'http' && $port != '80')) {
    $host = "$host:$port";
  }
  return "$scheme://$host$path";
}
Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。Ruby on Rails、PHP、Androidアプリ、Windows/Macアプリ、超縦書の開発などを気まぐれにやる。軽度の資格マニアで、情報処理技術者試験(15区分 + 情報処理安全確保支援士試験)、技術士(情報工学部門)、CITP、Ruby Programmer Goldなどを保有。

babaの書いた記事

関連する記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ