2008-09-05 6 views
2

Ich verwende ein Perl-Skript zum POST zur Google Appengine-Anwendung. Ich poste eine Textdatei, die XML enthält, mit der Option -F.So erhalten Sie die richtige Inhaltslänge für eine POST-Anfrage

http://www.cpan.org/authors/id/E/EL/ELIJAH/bget-1.1

Es gibt eine Version 1.2, die bereits getestet und das gleiche Problem bekommen. Der Beitrag sieht ungefähr so ​​aus.

Host: foo.appspot.com 
User-Agent: lwp-request/1.38 
Content-Type: text/plain 
Content-Length: 202 

<XML> 
    <BLAH>Hello World</BLAH> 
</XML> 

Ich habe das Beispiel geändert, so dass die 202 nicht richtig ist, mach dir keine Sorgen darüber. Auf zum Problem. Die Inhaltslänge stimmt mit der Anzahl der Bytes in der Datei überein. Wenn ich jedoch die Inhaltslänge nicht manuell heraufsetze, werden nicht alle Bytes der Datei abgeschnitten. Die Anzahl der abgeschnittenen Bytes ist bei Dateien unterschiedlicher Größe nicht identisch. Ich benutzte die Option -r auf dem Skript und ich kann sehen, was es sendet und es sendet die ganze Datei, aber Google Appengine self.request.body zeigt, dass nicht alles empfangen wird. Ich denke, die Lösung ist, die richtige Zahl für Content-Length zu bekommen, und anscheinend ist es nicht so einfach wie die Anzahl der Bytes in der Datei oder das Perl-Skript macht es irgendwie kaputt.

Update: Danke an Erickson für die richtige Antwort. Ich habe printf verwendet, um Zeichen an das Ende der Datei anzuhängen, und es hat immer genau die Anzahl der Zeilen in der Datei abgeschnitten. Ich denke, ich konnte herausfinden, was hinzugefügt wird, indem ich jedes Zeichen auf der Serverseite durchlaufe, aber es nicht wert ist. Dies wurde nicht einmal auf die Google-Gruppen für App-Engine beantwortet beantwortet!

Antwort

3

Ist die Anzahl der zusätzlichen Bytes gleich der Anzahl der Zeilen in der Datei? Ich frage, weil es vielleicht möglich ist, dass Wagenrückläufe eingeführt, aber nicht gezählt werden.

0

Wie erhalten Sie die Anzahl der Bytes? .. Mit Blick auf die Größe der Datei auf dem Dateisystem?

Sie können "-s" verwenden, um die Größe der Datei zu erhalten.

Oder, wenn Sie mehr tun wollen, Sie File::Stat

1

verwenden Ich habe, bevor sie in ähnliche Probleme stoßen.

Ich nehme an, Sie verwenden die length() -Funktion, um die Größe der Datei zu bestimmen? Wenn dies der Fall ist, ist es wahrscheinlich, dass die Daten, die Sie veröffentlichen, UTF-8-codiert statt ASCII sind.

Um die richtige Anzahl zu erhalten, müssen Sie möglicherweise ein "Byte verwenden;" Pragma an die Spitze des Skripts oder die Länge Anruf in einem Block wickeln:

my $size; do {use bytes; $size = length($file_data)}

Vom perlfunc Manpage:

„die Zeichen Hinweis: Wenn die EXPR in Unicode ist, werden Sie Holen Sie sich die Anzahl der Zeichen, nicht die Anzahl der Bytes. "