[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: Wrong type argument: stringp, nil



From: Naohiro Aota <nao.aota@xxxxxxxxx>
Subject: Re: [emacs-w3m:10488] Re: Wrong type argument: stringp, nil
Date: Thu, 04 Dec 2008 09:52:27 +0900 (JST)

> From: jidanni@xxxxxxxxxxx
> Subject: Re: [emacs-w3m:10488] Re: Wrong type argument: stringp, ni > l
> Date: Thu, 04 Dec 2008 04:40:55 +0800
>
>> [Off list mail because too big]
>> Thanks for looking into the problem
>>
>> (snip)
>>
>> The window looks like
>> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ >> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ >> ━━━━━━━━━━━━ >> WWWOFFLE - Thu, 04 Dec 2008 04:17:20 CST (15 mins ago) - [Index >> |Refresh:
>>               Options|Monitor|Delete|Configure|Info] - WWWOFFLE
>> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ >> ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ >> ━━━━━━━━━━━━
>>
>> and when I hit \ it says 'can't view page source'
>> and when I hit B I get the error.
>>
>> http://jidanni.org/comp/configuration/ are some files I use with
>> Debian sid.
>>
>> And here's tcpflow -i lo:
>
> Finally I could reproduce the problem. But it seems there is someth > ing > wrong with WWWOFFLE. Without WWWOFFLE I could retrieve the page as > it
> should be. But with WWWOFFLE I couldn't retrieve the page with any
> browser (emacs-w3m, w3m, and Firefox).
>
> Anyway emacs-w3m is proved to have a problem with handling loopback
> redirection. We'll try to find and fix it.
>
> For Japanese developers:
>
> ループしているリダイレクトを見に行ってしまうと、 w3m-history に URL > が > nil なエントリが入ってしまい履歴を戻れなくなってしまうようです。 と > りあ > えず、簡単なテストページを用意してみました。 (と言っても、 .htacces > s に
> 相互に redirect するように書いただけです ^^; )

;; w3m-retrieve() の仕様変更が必要そうなのでちょっとはやめに。

ループの時だけでなく、リダイレクト数が規定の回数に達した時に起こるよう
ですね。 結局、サーバからリダイレト先指定はもらえたものの、 実際の UR L を取得できないことにより、 (w3m-real-url url) が nil になってしまうこ
がこのバグの原因になっています。

対策についてですが、まず、リダイレクトエラーの時は 404 などのエラーと い、サーバからもらって表示するべきコンテンツは存在しないと思います。
た、現状ではリダイレクトに失敗したことが一目ではわからないようになって
います。なので、なるべくリダイレクトエラーが起こったことを通知してあげ
たいです(w3m-show-error-information() のように)。こうすれば、問題のバ
も同時に解決します。

その実装のためにちょっと考えてみた案をいくつか。

1. w3m-retrieve() がシンボルを返してもよいことにして、リダイレクション
   が限界数を超えると 'redirection-exceeded を返し、これを
   w3m-retrieve-and-render() の中で処理。
   => 文字列を期待するコードがエラーになる欠点あり。

2. シンボルだと上記の欠点があるので、 "X-w3m-error/redirection" のよう
   な疑似 MIME を返す。以下、1と同様。
=> 既存のコードとの親和性は高いが、 X-w3m-error なんて作っていいの かな?

3. 思いきって w3m-w3m-retrieve() の中で処理。
   => 内部関数だけなので外部について気にしなくてもよい。
      w3m-retrieve() の取得内容は変わってしまうし、
      w3m-show-error-information() の場所を考えると美しくない。

こんな感じでしょうか。 ぼくとしては 2番に一票です。

;; と言いつつ、手元で実装してみたのは 3番だけだったり ^^;

--
青田