Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Differenze nel parsare l'input...

    seondo voi ci sono delle differenze (in termini di velocità e sicurezza) nel parsare l'input con la libreria CGI.pm e a "mano"?

    (che cos'è questo tendenza della libreria CGI.pm ad andare in Overhead?)

    e con MOD_PERL tutto quello che ho detto non vale più?

  2. #2
    Ci sono due casi:

    1- i moduli sono in puro perl.

    2- i moduli che ti servono hanno delle routine scritte e compilate in C.

    Nel primo caso se ti fai tu una funzione che svolge le funzioni del modulo al 90% avrai migliori prestazioni, ovviamente se sai scrivere buon codice.
    Questo potrebbe essere il caso di CGI.pm

    Nel secondo invece tutto ciò che il modulo affida alle parti in C compilate ha prestazioni superiori per molti motivi, per cui in genere non conviene mai fare "a mano".
    Questo è il caso di DBI.pm

    Comunque considera che in genere la differenza di prestazioni non vale la comodità.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    beh la funzione che dovrebbe sostituire la CGI.pm è questa:

    codice:
    #!/usr/bin/perl
    
    &parse_form_data (*simple_form);
    
    my $user = $simple_form{'user'};
    
    print "Content-type: text/plain", "\n\n";
    $user = $simple_form{'user'};
    if ($user) {
        print "Nice to meet you ", $simple_form{'user'}, ".", "\n";
        print "Please visit this Web server again!", "\n";
    } else {
        print "You did not enter a name. Are you shy?", "\n";
        print "But, you are welcome to visit this Web server again!", "\n";
    }
    exit(0);
    
    sub parse_form_data
    {
        
        local (*FORM_DATA) = @_;
        local ( $request_method, $query_string, @key_value_pairs,
                      $key_value, $key, $value);
    
        $request_method = $ENV{'REQUEST_METHOD'};
        if ($request_method eq "GET") {
            $query_string = $ENV{'QUERY_STRING'};
        } elsif ($request_method eq "POST") {
            read (STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
        } else {
            &return_error (500, "Server Error",
                                "Server uses unsupported method");
        }
    
        @key_value_pairs = split (/&/, $query_string);
        foreach $key_value (@key_value_pairs) {
            ($key, $value) = split (/=/, $key_value);
            $value =~ tr/+/ /;
            $value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
    
        if (defined($FORM_DATA{$key})) {
                $FORM_DATA{$key} = join ("\0", $FORM_DATA{$key}, $value);
            } else {
                        $FORM_DATA{$key} = $value;
            }
        }
    }
    è sembra funzionare...ma se mi azzardo a mettere use strict in testa allo script mi va tutto in malora...come si dichiara *simple_form

    e poi..come posso controllare il numero massimo di byte in entrata? (quello che facevo con $CGI::POST_MAX=1024 * 150;)

    Grazie a tutti...

  4. #4
    con use strict non puoi usare
    local $var

    ma devi usare

    my $var

    il che in genere è comunque sempre meglio.

    Non dici cosa rappresenta
    *simple_form

    è un "typeglob", ma cosa c'è dentro? dove lo prendi? perchè lo usi?

    ritengo che puoi controllare le dimensioni tramite il controllo della QUERY_STRING, in caso di GET, o di STDIN in caso di POST
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  5. #5
    Originariamente inviato da shishii
    nere è comunque sempre meglio.

    Non dici cosa rappresenta
    *simple_form

    è un "typeglob", ma cosa c'è dentro? dove lo prendi? perchè lo usi?
    can you speak a little English ? http://www.oreilly.com/openbook/cgi/ch04_03.html

  6. #6
    lo leggo e lo scrivo bene.

    Ho visto... è un metodo di programmazione piuttosto arcaico, lo testimonia anche l'incompatibilità con use strict e l'uso di local.

    Comunqe ti basta fare:

    use strict;

    my %simple_form;

    &parse_form_data (*simple_form);

    ma forse è ancora meglio:

    &parse_form_data(\%simple_form);

    sub parse_form_data {
    my ($FORM_DATA) = @_;
    ....
    if (defined($FORM_DATA->{$key})) {
    $FORM_DATA->{$key} = join ("\0", $FORM_DATA->{$key}, $value);
    } else {
    $FORM_DATA->{$key} = $value;
    }

    }

    il "*" serve a rappresentare il referenziamento di tutte le variabili denominate "simple_form", quindi:

    $simple_form
    @simple_form
    %simple_form
    &simple_form
    <simple_form> # handler

    e non vedo perchè in questo caso sia utile.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  7. #7
    Credi che questa funzione vada bene invece?

    codice:
    #-#############################################
    # Sub: Get Form Data
    # This gets data from a post.
    
    sub get_form_data {
            my $temp;
            my $buffer;
            my @data;
            read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
            foreach $temp (split(/&|=/,$buffer)) {
                    $temp =~ tr/+/ /;
                    $temp =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
    		$temp =~ s/[\r\n]/ /g;
                    push @data, $temp;
            }
            foreach $temp (split(/&|=/,$ENV{'QUERY_STRING'})) {
                    $temp =~ tr/+/ /;
                    $temp =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
    		$temp =~ s/[\r\n]/ /g;
                    push @data, $temp;
            }
            return @data;
    }
    va bene per leggere sia in GET che in POST?

    Credi che possa sostituire degnamente la classica:
    codice:
    use CGI;
    my $q = new CGI();
    my $input = $q->param('input');

  8. #8
    direi meglio:

    codice:
     ########################################
    #####
    # Sub: Get Form Data
    # This gets data from a post.
    
    sub get_form_data {
        my ($buffer,@pairs,$pair,$name,$value);
        if ($ENV{'REQUEST_METHOD'} eq 'POST') {
            read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
            @pairs = split(/&/, $buffer);
        }
        elsif ($ENV{'REQUEST_METHOD'} eq 'GET') {
            $buffer = $ENV{'QUERY_STRING'};
            @pairs = split(/&/, $buffer);
        }
        else {
             die "Errore... metodo non consentito\n";
        }
    
        foreach $pair (@pairs) {
            ($name, $value) = split(/=/, $pair);
            $value =~ tr/+/ /;
            $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
            $value =~ s///g;
            $FORM{$name} = $value;
        }
    }
    in questo modo ti trovi un hash che ha come chiavi i nomi dei parametri e come valori i valori degli stessi.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  9. #9
    mitico!!!!!!!!!!!!!!!!!!!!!!!!!!!

  10. #10
    cambia qualcosa tra:

    codice:
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    e

    codice:
    $temp =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
    ??

    e questo lo ritieni utile?

    codice:
    $value =~ s///g;
    pensi che anche questo sia utile?

    codice:
    $temp =~ s/[\r\n]/ /g;
    vorrei un codice pulito ,puro e imparziale...se mi capisci!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.