[Gauche-devel-jp] http-get でうまくリダイレクトされない問題

Back to archive index

kzfm1024 kzfm1****@gmail*****
2009年 4月 21日 (火) 01:08:15 JST


尾山です。

私も receive-body-nochunked を変更するよりも copy- 
port を変更した方が
良いと思います。マニュアルにも size 引数に関する記述は 
ありません。

http://practical-scheme.net/gauche/man/gauche-refj_57.html#IDX657

receive-body-nochunked を元に戻して portutil.scm を以下 
のように変更して
みても http-get は問題なく動作しました。

ひとつ質問させてください。
%do-copy のように手続き名の先頭に % をつけるのは慣習的 
なものなのでしょうか?
また慣習的なものだとするとどのような時に % をつけるので 
しょうか?
portutil.scm だとマクロかプライベートな手続きかのどちらかなと 
思いました。

*** portutil.scm.org	2009-04-21 00:18:41.000000000 +0900
--- portutil.scm	2009-04-21 00:38:54.000000000 +0900
***************
*** 122,151 ****
     (check-arg input-port? src)
     (check-arg output-port? dst)
     (let-keywords args ((unit 4096)
!                       (size 0))
       (cond ((eq? unit 'byte)
!            (if (and (integer? size) (positive? size))
!                (%do-copy/limit1 (read-byte src)
!                                 (write-byte data dst)
!                                 size)
!                (%do-copy (read-byte src)
!                          (write-byte data dst)
!                          (+ count 1))))
             ((eq? unit 'char)
!            (if (and (integer? size) (positive? size))
!                (%do-copy/limit1 (read-char src)
!                                 (write-char data dst)
!                                 size)
!                (%do-copy (read-char src)
!                          (write-char data dst)
!                          (+ count 1))))
             ((integer? unit)
              (let ((buf (make-u8vector (if (zero? unit) 4096 unit))))
!              (if (and (integer? size) (positive? size))
!                  (%do-copy/limitN src dst buf unit size)
!                  (%do-copy (read-block! buf src)
!                            (write-block buf dst 0 data)
!                            (+ count data)))))
             (else
              (error "unit must be 'char, 'byte, or non-negative  
integer" unit))
             )
--- 122,160 ----
     (check-arg input-port? src)
     (check-arg output-port? dst)
     (let-keywords args ((unit 4096)
!                       (size -1))
       (cond ((eq? unit 'byte)
!            (cond ((and (integer? size) (zero? size))
!                   size)
!                  ((and (integer? size) (positive? size))
!                   (%do-copy/limit1 (read-byte src)
!                                    (write-byte data dst)
!                                    size))
!                  (else
!                   (%do-copy (read-byte src)
!                             (write-byte data dst)
!                             (+ count 1)))))
             ((eq? unit 'char)
!            (cond ((and (integer? size) (zero? size))
!                   size)
!                  ((and (integer? size) (positive? size))
!                   (%do-copy/limit1 (read-char src)
!                                    (write-char data dst)
!                                    size))
!                  (else
!                   (%do-copy (read-char src)
!                             (write-char data dst)
!                             (+ count 1)))))
             ((integer? unit)
              (let ((buf (make-u8vector (if (zero? unit) 4096 unit))))
!              (cond ((and (integer? size) (zero? size))
!                     size)
!                    ((and (integer? size) (positive? size))
!                     (%do-copy/limitN src dst buf unit size))
!                    (else
!                     (%do-copy (read-block! buf src)
!                               (write-block buf dst 0 data)
!                               (+ count data))))))
             (else
              (error "unit must be 'char, 'byte, or non-negative  
integer" unit))
             )


On 2009/04/17, at 16:19, Shiro Kawai wrote:

> ありがとうございます。fixしました。
>
> 今思うと、copy-portはsize = 0の時は何もせずにリ 
> ターンし、
> size < 0をサイズ無指定と扱う方が良かったかもしれません。
> いやまてよ、マニュアルにsize引数は書いてないからまだ 
> オフィシャルじゃ
> なかったかな。それならそう変えてしまおうかな。
>
> --shiro
>
>
> From: kzfm1024 <kzfm1****@gmail*****>
> Subject: [Gauche-devel-jp] http-get でうまくリダイレクトさ 
> れない問題
> Date: Wed, 15 Apr 2009 00:49:19 +0900
>
>> 尾山と申します。
>>
>> 以下のようなレスポンスを返すサイトに対して http-get を
>> 実行したところ
>> ブロックしたまま返ってこなくなりました。
>>
>> HTTP/1.1 301 MovedPermanently
>> Date: Mon, 13 Apr 2009 13:49:47 GMT
>> Server: Server
>> x-amz-id-1: 1D8FH40X7ZTQPMF8S5DA
>> p3p: policyref="http://www.amazon.com/w3c/p3p.xml",CP="AMZN "
>> x-amz-id-2: 6R7aDSk08UmlmJY1rkw1wLWWks8vpDL7
>> Location: http://www.amazon.com/gp/dmusic/media/log_action.mp3?ie=UTF8&ASIN=B001AUEMFS&TYPE=DigitalMusicSampleStreamSampler&CustomerID=&URL=http%3A%2F%2Famazonm-666.vo.llnwd.net%2Fs%2Fd7%2F100513%2F100513276%2F206028666%5FS64.mp3%3Fe%3D1239634187%26h%3Dd1337683d6e7094fe05f9e91a963bcef
>> Vary: Accept-Encoding,User-Agent
>> Content-Type: text/html; charset=ISO-8859-1
>> Set-cookie: session-id-time=1240210800l; path=/; domain=.amazon.com;
>> expires=Mon Apr 20 07:00:00 2009 GMT
>> Set-cookie: session-id=000-0000000-0000000; path=/;
>> domain=.amazon.com; expires=Mon Apr 20 07:00:00 2009 GMT
>> Content-Length: 0
>> Cneonction: close
>> Connection: Keep-Alive
>>
>> gosh> (sampleTrack "B001AUEMFS")
>>   C-c C-c*** UNHANDLED-SIGNAL-ERROR: unhandled signal 2 (SIGINT)
>> Stack Trace:
>> _______________________________________
>>   0  (read-block! buf src)
>>         At line 146 of "/usr/local/share/gauche/0.8.14/lib/gauche/
>> portutil.scm"
>>   1  (copy-port remote sink)
>>         At line 298 of "/usr/local/share/gauche/0.8.14/lib/rfc/
>> http.scm"
>>   2  (loop109 (cddr args108) G110 G111)
>>         [unknown location]
>>   3  (with-error-handler (lambda (e) (let ((e e)) (%guard-rec e e
>> (else ...
>>         [unknown location]
>>   4  (request-response request conn host request-uri request-body  
>> opts)
>>         At line 179 of "/usr/local/share/gauche/0.8.14/lib/rfc/
>> http.scm"
>>   5  (amazon-mp3-sampleTrack "xxxxxx" asin)
>>         At line 94 of "(stdin)"
>>
>> 調べてみたところ Content-Length が 0 の場合は  
>> receive-
>> body-nochunked が
>> size 0 で実行されます。そして receive-body-nochunked  
>> の中で
>> copy-port が
>> 実行されて read-block! でブロックしています。
>>
>> とりあえず receive-body-nochunked を以下のように修正し
>> たところ、
>> リダイレクトされて動作するようになりました。
>>
>> *** http.scm.org	2009-04-13 23:26:26.000000000 +0900
>> --- http.scm	2009-04-14 00:19:47.000000000 +0900
>> ***************
>> *** 298,304 ****
>>     (flusher sink headers))
>>
>>   (define (receive-body-nochunked size remote sink)
>> !   (copy-port remote sink :size size))
>>
>>   ;; NB: chunk extension and trailer are ignored for now.
>>   (define (receive-body-chunked remote sink)
>> --- 298,304 ----
>>     (flusher sink headers))
>>
>>   (define (receive-body-nochunked size remote sink)
>> !   (when (positive? size) (copy-port remote sink :size size)))
>>
>>   ;; NB: chunk extension and trailer are ignored for now.
>>   (define (receive-body-chunked remote sink)
>>
>> 以上、よろしくお願いします。
>>
>> _______________________________________________
>> Gauche-devel-jp mailing list
>> Gauch****@lists*****
>> http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp
>>
>
> _______________________________________________
> Gauche-devel-jp mailing list
> Gauch****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp




Gauche-devel-jp メーリングリストの案内
Back to archive index