rss-phpの認証方式を拡張する

BASIC認証など以外、たとえばNTLMがかかっているときにcurlを実行する方法。

# <i class="fa fa-cube"></i> rss-php



PHPでRSSを取得できるパッケージです。

[dg/rss-php: Small and easy-to-use library for consuming RSS and Atom feeds]

# <i class="fa fa-cube"></i> 実装

ひとつのファイルにまとめられていますし、長くも無いので読めると思います。

[rss-php/Feed.php at b33661748d89d8c0c288e8d86feada6018d05031 · dg/rss-php]

PHPの[curl]関数を使用しています。

# <i class="fa fa-cube"></i>  cURL関数の認証

Linuxのcurlと同等だとすると、デフォルトではuserとpassを入力してもBASIC認証しか対応できない。

[curl コマンド | コマンドの使い方(Linux) | hydroculのメモ]

# <i class="fa fa-cube"></i>  オプションの設定

[PHP: curl_setopt - Manual]

|  |  |
|:-:|:-:|
|  **CURLOPT_HTTPAUTH** |  使用する HTTP 認証方法。<br>以下の中から選びます。<br> **CURLAUTH_BASIC**、<br> **CURLAUTH_DIGEST**、 <br>**CURLAUTH_GSSNEGOTIATE**、<br> **CURLAUTH_NTLM**、<br> **CURLAUTH_ANY** および **CURLAUTH_ANYSAFE**。<br><br>2 つ以上の方法を組み合わせるには、ビット演算子 &#124;（or） を使用します。このような場合、cURL はサーバーがサポートしている方法を 問い合わせたうえで最適な方法を選択します。<br><br>**CURLAUTH_ANY** は CURLAUTH_BASIC &#124; CURLAUTH_DIGEST &#124; <br>CURLAUTH_GSSNEGOTIATE &#124; CURLAUTH_NTLM のエイリアスです。<br><br>**CURLAUTH_ANYSAFE** は CURLAUTH_DIGEST &#124; CURLAUTH_GSSNEGOTIATE &#124; CURLAUTH_NTLM のエイリアスです。   |

# <i class="fa fa-cube"></i>  コードを書き換える

(composerで入れて)
`vendor/dg/rss-php/src/Feed.php`
に

```php
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
```

を追加してやる。
と、メソッドはこうなる。

```php

        /**
         * Process HTTP request.
         * @param  string
         * @param  string
         * @param  string
         * @return string|FALSE
         * @throws FeedException
         */
        private static function httpRequest($url, $user, $pass)
        {
                if (extension_loaded('curl')) {
                        $curl = curl_init();
                        curl_setopt($curl, CURLOPT_URL, $url);
                        if ($user !== NULL || $pass !== NULL) {
                                curl_setopt($curl, CURLOPT_USERPWD, "$user:$pass");
                        }
                        // ↓追加
                        curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
                        curl_setopt($curl, CURLOPT_HEADER, FALSE);
                        curl_setopt($curl, CURLOPT_TIMEOUT, 20);
                        curl_setopt($curl, CURLOPT_ENCODING , '');
                        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // no echo, just return result
                        if (!ini_get('open_basedir')) {
                                curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // sometime is useful :)
                        }
                        $result = curl_exec($curl);
                        return curl_errno($curl) === 0 && curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200
                                ? $result
                                : FALSE;

                } elseif ($user === NULL && $pass === NULL) {
                        return file_get_contents($url);

                } else {
                        throw new FeedException('PHP extension CURL is not loaded.');
                }
        }



```


[dg/rss-php: Small and easy-to-use library for consuming RSS and Atom feeds]:https://github.com/dg/rss-php

[rss-php/Feed.php at b33661748d89d8c0c288e8d86feada6018d05031 · dg/rss-php]:https://github.com/dg/rss-php/blob/b33661748d89d8c0c288e8d86feada6018d05031/src/Feed.php

[curl]:http://php.net/manual/ja/book.curl.php

[curl コマンド | コマンドの使い方(Linux) | hydroculのメモ]:https://hydrocul.github.io/wiki/commands/curl.html#c8c1f93



[PHP: curl_setopt - Manual]:http://php.net/manual/ja/function.curl-setopt.php