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