hotti: DBI::errstr fetch() without execute()

Beitrag lesen

hi mein Lieber,

Warum reitest Du eigentlich so auf Handles herum?

Ich bin halt ein Low-Level-Fuzzi ;)

Du willst doch ohnehin einen (binären) String verarbeiten, und so lange der nicht zu groß für den Speicher wird, kannst Du den String direkt weiterverarbeiten. Da sind außer dem HTTP-Socket überhaupt keine Handles im Spiel.

BinärSequenzen in einen String (scalar) schreiben ist ok, aber Lesen erfordert ein Handle, ein String ist dafür ungeeignet. Eine Binary wird Byte für Byte (oder SeqenzLänge für SequenzLänge) aus einem Handle gelesen mit der Funktion, die aus einem Handle lesen kann: read().

STDIN und STDOUT sind im HTTP-Umfeld übrigens extrem CGI-spezifisch, mit anderen, wesentlich schnelleren Systemen wie mod_perl und FastCGI gibt es die in dieser Form schlicht nicht. Sie werden bestenfalls über eine (mehr oder weniger bremsende) Kompatibilitätsschicht emuliert.

Vielleicht kann ich Dich ein bischen neugierig machen: Ich entwickle z.Z. (solange ich die Zeit noch habe) ein System zum Übertragen von Binaries über HTTP als Client-Server-Anwendung. Die Binaries können Multipart-Messages sein, MP3s oder DB-Dumps oder was auch immer (auch Text), das System ist unabhängig von Inhalten und damit auch unabhängig von Zeichenkodierungen; es geht eben nur um Bytes (Darstellung auch, aber später und woanders).

Dieses System ist, so ganz nebenbei, auch als schlanke Alternative zu XML oder Multipart-Messages nach dem MIME-Standard brauchbar und funktioniert derzeit in meinen Tests einwandfrei.

Zu STDIN am Server: Ich habe u.a. ein Script, das ist nicht über Parameter, sondern per (custom) HTTP-Header gesteuert. Damit ist der Message-Body (STDIN) frei von Parametern, Boundaries oder sonstigen Controls, die dem Script mitteilen, was es machen soll, das steht alles im Header. STDIN kann somit bytegenau gelesen werden, da steht z.B. eine Binary und warum sollte ich die erst irgendwo anders hinschreiben!? Zu unnötigen Kopieren kannst Du ja selbst ein Liedchen singen;)

Btw.:

  
use strict;  
use Data::Dump;  
use myConfig qw($cfg);  
  
$| = 1;  
  
my %attr = (  
	'host' => 'rolfrost',  
	'method' => 'GET',  
	'uri' => '/cgi-bin/geheim.cgi',  
	'callback' => \&callback,  
	'auth' => $cfg->{http}->{auth}, # Authorization: Basic encode_base64('usr:pass','')  
);  
  
binmode STDOUT;  
  
my $s = Net::HTTP10->new(%attr) or die "Kein Socket";  
#print Data::Dump::dump $s;  
$s->request;  
my $href = $s->read_headers;  
print Data::Dump::dump $href;  
#$s->body_callback; # Läuft ;)  

Ja, die gute alte Version HTTP/1.0. Kein Transfer-Encoding und keine Chunks, Body as Rock ;)

  
package Net::HTTP10; # mein neues Modul  
  
use strict;  
use IO::Socket;  
use vars qw(@ISA);  
@ISA = qw(IO::Socket);  
use warnings;  
use Carp;  

Schönen Sonntag,
Grüße an Alle,
Rolf alias Hotti