🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
3 messages
3 total messages Started by Marcin Gryszkalis Fri, 08 Jan 2010 13:15
File::Copy syswrite binmode utf8 i nie wiadomo co
#51747
Author: Marcin Gryszkalis
Date: Fri, 08 Jan 2010 13:15
50 lines
2229 bytes
Witam

Trochę mnie wczoraj zaskoczyła jedna rzecz, mianowicie w jednej aplikacji 
CGI musiałem wyrzucić do przeglądarki plik, ale ponieważ plik potencjalnie 
mógł być dość duży zamiast

print(read_file($path)); # read_file z File::Slurp

chciałem napisać

copy($path, \*STDOUT); # copy z File::Copy

bo copy kopiuje po kawałku więc nie zje mi pamięci.


Niestety efekt był taki, że funkcja copy się zapętlała wysyłając plik w 
kółko od początku, jednocześnie dostałem następujący warning:

Argument "\x{5c63}" isn't numeric in addition (+) at 
/usr/local/lib/perl5/5.10.1/File/Copy.pm line 203.


198     for (;;) {
199     my ($r, $w, $t);
200        defined($r = sysread($from_h, $buf, $size))
201         or goto fail_inner;
202     last unless $r;
203     for ($w = 0; $w < $r; $w += $t) {
204            $t = syswrite($to_h, $buf, $r - $w, $w)
205         or goto fail_inner;
206     }
207     }


chodzi o dodawnie $w += $t, gdzie $t jest wielkością zwróconą z syswrite, co 
istotne
0x5c63 to jest wielkość pliku, na którym testowałem, więc zakładam, że 
syswrite zapsało tyle właśnie bajtów - tylko dlaczego zostało to 
zinterpretowane jako \x{5c63}?

jawne binmode(STDOUT) nic nie zmieniło (zresztą File::Copy samo też robi 
binmode dla handle-ów).

Skąd takie zachowanie?

pozdrawiam
-- 
Marcin Gryszkalis, PGP 0x9F183FA3
jabber jid:mg@fork.pl, gg:2532994
http://the.fork.pl
Re: File::Copy syswrite binmode utf8 i nie wiadomo co
#51748
Author: Adam Osuchowski
Date: Sun, 10 Jan 2010 17:56
19 lines
1632 bytes
Marcin Gryszkalis wrote:
> Skąd takie zachowanie?

Próbowałeś wyizolować problem? Tzn. puścić np. z palca:

$ perl -MFile::Copy -e 'copy "plik", \*STDOUT' > /dev/null

na tym samym pliku i zobaczyć czy pokazuje ten sam warning. A potem,
prosty skrypt CGI, który woła tylko copy() i nic więcej.

U mnie na wersjach 5.8.8 i 5.10.0 i różnych (binarnych, tekstowych,
długich, krótkich) plikach nie wystąpiło nic takiego. Więc albo coś
spaprali w 5.10.1, albo to kwestia Twojego środowiska, tudzież jakieś
efekty uboczne samego CGI.

BTW, tak poza samym problemem, nie byłoby prościej, szybciej i efektywniej
używać do tego X-Sendfile? Jeśli korzystasz z jakiegoś popularnego serwera
typu apache, lighttpd czy nginx to one wspierają tę funkcjonalność
(w nginxie to się inaczej nazywa ale działa podobnie).
Re: File::Copy syswrite binmode utf8 i nie wiadomo co
#51749
Author: Marcin Gryszkalis
Date: Sun, 10 Jan 2010 19:05
35 lines
2117 bytes
Adam Osuchowski wrote:
> Próbowałeś wyizolować problem? Tzn. puścić np. z palca:
> $ perl -MFile::Copy -e 'copy "plik", \*STDOUT' > /dev/null

Z powłoki jest ok (nie ma błędu)

> na tym samym pliku i zobaczyć czy pokazuje ten sam warning. A potem,
> prosty skrypt CGI, który woła tylko copy() i nic więcej.

Sprawdzę wieczorem.

> U mnie na wersjach 5.8.8 i 5.10.0 i różnych (binarnych, tekstowych,
> długich, krótkich) plikach nie wystąpiło nic takiego. Więc albo coś
> spaprali w 5.10.1, albo to kwestia Twojego środowiska, tudzież jakieś
> efekty uboczne samego CGI.

Na to wygląda, ale popatrzę jeszcze...

 
> BTW, tak poza samym problemem, nie byłoby prościej, szybciej i efektywniej
> używać do tego X-Sendfile? Jeśli korzystasz z jakiegoś popularnego serwera
> typu apache, lighttpd czy nginx to one wspierają tę funkcjonalność
> (w nginxie to się inaczej nazywa ale działa podobnie).

Wiem, używam nginx-a ale tam to wymaga odrobiny zmian w konfiguracji, bo nie 
można tak po prostu dowolnego pliku wysłać, więc na szybko chciałem zrobić 
copy.

http://wiki.nginx.org/NginxXSendfile

pozdrawiam
-- 
Marcin Gryszkalis, PGP 0x9F183FA3
jabber jid:mg@fork.pl, gg:2532994
http://the.fork.pl
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads