Sham has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, I am using the SSL connection to comunicate with the one of the payment gateway server. I m following all the rule to get the ssl connection with the appropriate data, srill I am getting the error as HTTP/1.1 400 Bad Request what can be the reason??? where should I concentrate to fix this?? Please suggest. SHAM...
  • Comment on What can be the reasons for bad request ??

Replies are listed 'Best First'.
Re: What can be the reasons for bad request ??
by starX (Chaplain) on Sep 08, 2007 at 12:12 UTC
    This might be a good place to start. Clearly if you're getting a 400 Bad Request error you're either not following all the rules or you're not sending the appropriate data. If you post some code, I or someone else here might be able to give you a better idea about what could be going wrong with your program specifically.
      Here is the test code I m using .
      use strict; use Data::Dumper; #use LWP::UserAgent; #use HTTP::Request; use Net::SSLeay qw(get_https post_https sslcat make_headers make_form) +; my $method = 'POST'; my $host = 'orbital1.paymentech.net'; #my $host = 'orbital2.paymentech.net'; my $uri = '/authorize'; ## This is the initial test xml-request for authorization my $xmlRequest = '<Request>'. '<NewOrder>'. '<IndustryType>EC/IndustryType>'. '<MessageType>A</MessageType>'. '<BIN>000002</BIN>'. + '<TerminalID>001</TerminalID>'. '<AccountNum>4111111111111111</AccountNum>'. '<Exp>102009</Exp>'. '<CurrencyCode>840</CurrencyCode>'. '<CurrencyExponent>2</CurrencyExponent>'. '<CardSecVal>213</CardSecVal>'. '<AVSzip>33408</AVSzip>'. '<AVSaddress1>test address</AVSaddress1>'. '<AVScity>miami</AVScity>'. '<AVSstate>Florida</AVSstate>'. '<AVSphoneNum>5618926384</AVSphoneNum>'. '<AVSname>Raj Malahotra</AVSname>'. '<AVScountryCode>US</AVScountryCode>'. '<AVSDestzip>33408</AVSDestzip>'. '<AVSDestaddress1>Dest addresss</AVSDestaddres +s1>'. '<AVSDestcity>testcity</AVSDestcity>'. '<AVSDeststate>Florida</AVSDeststate>'. '<AVSDestname>Raj Malahotra</AVSDestname>'. '<AVSDestcountryCode>US</AVSDestcountryCode>'. '<CustomerProfileFromOrderInd>A</CustomerProfi +leFromOrderInd>'. '<OrderID>091933208935</OrderID>'. '<Amount>15.00</Amount>'. '<BMLShippingCost>15.00</BMLShippingCost>'. + '<BMLTNCVersion>5</BMLTNCVersion>'. + '</NewOrder>'. '</Request>'; my ($page, $response, %reply_headers); ## As per the specifications given in the pdf of Paymentech my $MIME_Version = '1.0'; my $content_type = 'application/PTI41'; my $content_length = length $xmlRequest; my $content_transfer_encoding = 'text'; my $request_number = '1'; my $document_type = 'Request'; #my $CRLF = "\x0d\x0a"; #my $CRLF = "\r\n"; my $CRLF = $Net::SSLeay::CRLF; my $headers = make_headers( 'MIME-Version' => $MIME_Version +, 'Content-Type' => $content_type +, 'Content-length' => $content_length +, 'Content-transfer-encoding' => $content_tra +nsfer_encoding, 'Request-number' => $request_number +, 'Document-type' => $document_ty +pe, ); #$headers = "POST /AUTHORIZE HTTP/1.0" . $CRLF . $headers; $headers = "POST /AUTHORIZE HTTP/1.0\r\n" . 'Host: ' . $host . ': 443' . "\r\n" . "Accept: */*\r\n" . $headers; $Net::SSLeay::trace = 3; # 0=no debugging, 1=ciphers, 2=trace, 3=dump + data ($page, $response, %reply_headers) = post_https( $host, 443, $uri, $headers, $xmlRequest ); print STDERR "\n========= headers ======== \n" . Dumper($headers) +; print STDERR "\n========= request ======== \n" . Dumper($xmlReque +st); print STDERR "\n========= page ======== \n" . Dumper($page); print STDERR "\n========= response ======== \n" . Dumper($respons +e); print STDERR "\n========= reply_headers ======== \n" . Dumper(%re +ply_headers);
      Please suggest if it needs any change. Thanks, SHAM...
        I notice you're explicitly using Net::SSLeay and you've commented out LWP. When I work with SSL, I continue using LWP and when LWP sees an HTTPS URL, it just auto-magically uses Crypt::SSLeay to open the SSL connection. I never have to use Net::SSLeay anywhere in my code. Is there a specific reason you're using Net::SSLeay directly?

        From the SSL readme with LWP:

        SSL SUPPORT
        -----------
        
        The libwww-perl package has support for using SSL/TLSv1 with its HTTP
        client and server classes. This support makes it possible to access
        https schemed URLs with LWP. Because of the problematic status of
        encryption software in general and certain encryption algorithms in
        particular, in several countries, libwww-perl package doesn't include
        SSL functionality out-of-the-box.
        
        Encryption support is obtained through the use of Crypt::SSLeay or
        IO::Socket::SSL, which can both be found from CPAN. While libwww-perl
        has "plug-and-play" support for both of these modules (as of v5.45),
        the recommended module to use is Crypt::SSLeay. In addition to
        bringing SSL support to the LWP package, IO::Socket::SSL can be used
        as an object oriented interface to SSL encrypted network sockets.
        
        There is yet another SSL interface for perl called Net::SSLeay. It has
        a more complete SSL interface and can be used for web client
        programming among other things but doesn't directly support LWP.
        
        The underlying SSL support in all of these modules is based on OpenSSL
        <http://www.openssl.org/> (formerly SSLeay). For WWW-server side SSL
        support (e.g. CGI/FCGI scripts) in Apache see <http://www.modssl.org/>.
        

        Cheers,

        Brent

        -- Yeah, I'm a Delt.

        Well ... your XML is invalid:

        my $xmlRequest = '<Request>'. '<NewOrder>'. '<IndustryType>EC/IndustryType>'. ...
        should be
        my $xmlRequest = '<Request>'. '<NewOrder>'. '<IndustryType>EC</IndustryType>'.
        see the missing angle bracket after EC? But maybe that's just a posting error.

        -derby