pl: multipart/form-data

Beitrag lesen

Zunächst hardcodest du die Grammatikregeln deines Parsers.

So siehts aus, das Hardcoding hält sich in Grenzen.

    if($self->{CONTENT_TYPE} eq 'multipart/c-eav'){
        require cEAV;
        $self->{eav} = cEAV->decode_eav( $self->{rawdata} );
        $self->{param} = $self->{eav}->{param};
    }
    elsif($self->{CONTENT_TYPE} eq 'multipart/form-data'){
        $self->_parse_multipart; # factory
    }
    elsif( $self->{CONTENT_TYPE} eq 'application/json' ){
        require JSON;
        my $json = JSON->new;
        $self->{json} = $json->decode($self->rawdata);
        $self->{param} = $self->{json}{param};
    }
    else{
        # ParameterNamen, application/x-www-form-urlencoded
        my $pnames = [ $self->{rawdata} =~ /(\w+)=/g ];
        foreach my $pname ( @$pnames ){
            my $vals = [$self->{rawdata} =~ /$pname=([^;&]+)/g];
            foreach my $v( @$vals){
                $v =~ s/\+/ /g;
                $v =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
            }
            $self->{param}{$pname} = $vals;
        }
    }

Die Scalierbarkeit und Übersichtlichkeit ist sichergestellt. Wenns zuviel wird, wirds in die Factory ausgelagert (Autoloader) . Falls ein neuer Content-Type hinzukommt, ist das ratzfatz eingebaut, da wird nur noch ne Methode aufgerufen.