Perl ISAPI extra newline in header?

 
Post new topic   Reply to topic    Aprelium Forum Index -> Perl
View previous topic :: View next topic  
Author Message
lmz
-


Joined: 28 Oct 2006
Posts: 4

PostPosted: Sat Oct 28, 2006 3:25 pm    Post subject: Perl ISAPI extra newline in header? Reply with quote

I have installed Abyss Web Server X1 v2.3.2 and ActivePerl (5.8.8 build 817) with the ISAPI DLL. I am currently trying to run Perl scripts using the ISAPI interface. Here is the relevant bit from abyss.conf (CGI/ISAPI, type is Perl ISAPI):

Code:

<interpreter>
   <ext>
      pl
   </ext>
   <interface>
      0
   </interface>
   <file>
      Z:\pkg\Perl\bin\perlis.dll
   </file>
   <checkexists>
      yes
   </checkexists>
   <type>
      2
   </type>
   <updatepaths>
      no
   </updatepaths>
</interpreter>



It seems to insert extra newlines before the script output so the script cannot add the Content-Type header. I tried the following two scripts:

plain.pl:

Code:

print "Content-Type: text/plain\r\n\r\nHello!";


test.pl (taking a little from the CGI perldoc)

Code:

use CGI qw /:standard/;

print header, start_html('test'), h1('Hello');


This is what I get when trying to access the files from the command line (using the LWP "get" utility)

Code:

Z:\>get -ue http://localhost/cgi-bin/plain.pl                                   
GET http://localhost/cgi-bin/plain.pl
Connection: Close
Date: Sat, 28 Oct 2006 14:10:50 GMT
Server: Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2 Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2
Client-Date: Sat, 28 Oct 2006 14:10:50 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1

Content-Type: text/plain

Hello!                                                                         

Z:\>get -ue http://localhost/cgi-bin/test.pl
GET http://localhost/cgi-bin/test.pl
Connection: Close
Date: Sat, 28 Oct 2006 14:12:15 GMT
Server: Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2 Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2
Client-Date: Sat, 28 Oct 2006 14:12:15 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1

Content-Type: text/html; charset=ISO-8859-1

<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h1>Hello</h1>


When I test it in the browser, the "Content-Type" header shows up in the browser display.

I have turned on logging for the ISAPI and this is the contents:

Code:

Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   New request
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   Prefetch-ReadClient() = ""
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   ServerSupportFunction(dwHSERequest=HSE_REQ_MAP_URL_TO_PATH, lpvBuffer="")
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   GetServerVariable(szVariableName="SCRIPT_NAME")="/cgi-bin/plain.pl"
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   GetServerVariable(szVariableName="SERVER_PROTOCOL")="HTTP/1.1"
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   WriteClient(Buffer="HTTP/1.1 200 OK
", dwSize=17, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   WriteClient(Buffer="Date: Sat, 28 Oct 2006 14:10:50 GMT
", dwSize=37, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   GetServerVariable(szVariableName="SERVER_SOFTWARE")="Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2"
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   WriteClient(Buffer="Server: Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2

", dwSize=47, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   WriteClient(Buffer="Content-Type: text/plain

Hello!", dwSize=34, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/plain.pl   Request #0   HttpExtensionProc() = HSE_STATUS_SUCCESS (1) / ecb.dwHttpStatusCode = 200
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   New request
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   Prefetch-ReadClient() = ""
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   ServerSupportFunction(dwHSERequest=HSE_REQ_MAP_URL_TO_PATH, lpvBuffer="")
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   GetServerVariable(szVariableName="SCRIPT_NAME")="/cgi-bin/test.pl"
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   GetServerVariable(szVariableName="SERVER_SOFTWARE")="Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2"
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   GetServerVariable(szVariableName="GATEWAY_INTERFACE")="CGI/1.1"
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   GetServerVariable(szVariableName="SERVER_PROTOCOL")="HTTP/1.1"
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   GetServerVariable(szVariableName="SERVER_PROTOCOL")="HTTP/1.1"
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   WriteClient(Buffer="HTTP/1.1 200 OK
", dwSize=17, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   WriteClient(Buffer="Date: Sat, 28 Oct 2006 14:12:15 GMT
", dwSize=37, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   GetServerVariable(szVariableName="SERVER_SOFTWARE")="Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2"
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   WriteClient(Buffer="Server: Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2

", dwSize=47, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   WriteClient(Buffer="Content-Type: text/html; charset=ISO-8859-1

", dwSize=47, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   WriteClient(Buffer="<!DOCTYPE html
   PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
", dwSize=316, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   WriteClient(Buffer="<h1>Hello</h1>", dwSize=14, dwSync=0)
Module: Z:\pkg\Perl\bin\perlis.dll   URI: /cgi-bin/test.pl   Request #1   HttpExtensionProc() = HSE_STATUS_SUCCESS (1) / ecb.dwHttpStatusCode = 200


I think this shows that there are two newlines sent after the "Server:..." header. I have tested these scripts with CGI and they work fine. Is this a problem in my configuration, in Abyss or a in the ActivePerl ISAPI DLL?

Thanks
Back to top View user's profile Send private message
TRUSTAbyss
-


Joined: 29 Oct 2003
Posts: 3714
Location: USA, GA

PostPosted: Sat Oct 28, 2006 9:29 pm    Post subject: Reply with quote

It's normal for the extra two lines before the actual HTML output is sent. You
will notice this from all header output scripts.

The real problem is that you're using "\r\n" in the header lines. You need to
use, only the "\n" characters. Example: print "Content-Type: text/html\n\n";

For a full header output:

Code:
print "HTTP/1.1 200 OK\n";
print "Content-Length: 13\n";
print "Content-Type: text/html\n\n";

print "Hello, World!";


Note: The last line always requires two "\n" characters.
_________________
Computer Programmer & Networking Specialist

Back to top View user's profile Send private message Visit poster's website MSN Messenger
lmz
-


Joined: 28 Oct 2006
Posts: 4

PostPosted: Sun Oct 29, 2006 2:43 pm    Post subject: Reply with quote

TRUSTAbyss wrote:


Code:
print "HTTP/1.1 200 OK\n";
print "Content-Length: 13\n";
print "Content-Type: text/html\n\n";

print "Hello, World!";




That actually works, but I'd rather not print my HTTP headers myself.

It seems that I need to force the CGI module to do NPH. There is a check to make sure NPH is enabled automatically if it's running under IIS but probably they need to add another check for Abyss... The code below works:

Code:

use CGI qw( -nph );
my $cgi = new CGI;
print $cgi->header(),
$cgi->start_html('hello world'),
$cgi->h1('hello world'),
$cgi->end_html();


Thanks for the help :)
Back to top View user's profile Send private message
aprelium
-


Joined: 22 Mar 2002
Posts: 6800

PostPosted: Sun Oct 29, 2006 2:52 pm    Post subject: Reply with quote

lmz wrote:
It seems that I need to force the CGI module to do NPH. There is a check to make sure NPH is enabled automatically if it's running under IIS but probably they need to add another check for Abyss... The code below works:


Abyss Web Server is smart enough to detect if you're sending an NPH output or not. So there is no need for such a setting as everything is handled automatically.

As you noticed both scripts (NPH and not NPH) worked fine.
_________________
Support Team
Aprelium - http://www.aprelium.com
Back to top View user's profile Send private message Send e-mail
lmz
-


Joined: 28 Oct 2006
Posts: 4

PostPosted: Mon Oct 30, 2006 4:43 pm    Post subject: Reply with quote

aprelium wrote:
lmz wrote:
It seems that I need to force the CGI module to do NPH. There is a check to make sure NPH is enabled automatically if it's running under IIS but probably they need to add another check for Abyss... The code below works:


Abyss Web Server is smart enough to detect if you're sending an NPH output or not. So there is no need for such a setting as everything is handled automatically.

As you noticed both scripts (NPH and not NPH) worked fine.


Well, I don't even know what NPH is or how Abyss detects it, but I know that this code:

Code:

use CGI qw( -nph );
my $cgi = new CGI;
print $cgi->header(),
$cgi->start_html('hello world'),
$cgi->h1('hello world'),
$cgi->end_html();


works fine, and this code (note the commented out nph param):

Code:

use CGI ; # qw( -nph );
my $cgi = new CGI;
print $cgi->header(),
$cgi->start_html('hello world'),
$cgi->h1('hello world'),
$cgi->end_html();


displays a Content-Type header in the response body (with configuration like in my first post).
Back to top View user's profile Send private message
aprelium
-


Joined: 22 Mar 2002
Posts: 6800

PostPosted: Tue Oct 31, 2006 10:29 am    Post subject: Reply with quote

lmz,

NPH means Non-parsed headers. This is when the script sends headers to the server without using the CGI spec and asks the server to not preprocess them and to forward them as they are to the client directly.

In the second script it seems that Perl ISAPI is messing with the NPH output. Could you please set temporarily the Perl interpreter to use perl.exe instead of PerlIS.dll and retest your second script? Is it working fine?
_________________
Support Team
Aprelium - http://www.aprelium.com
Back to top View user's profile Send private message Send e-mail
lmz
-


Joined: 28 Oct 2006
Posts: 4

PostPosted: Thu Nov 02, 2006 10:08 am    Post subject: Reply with quote

OK, so I have associated *.pl with Perl ISAPI and *.pcgi with Perl CGI.

this is nph.{pl,pcgi} :

Code:

use CGI qw( -nph );
my $cgi = new CGI;
print $cgi->header(),
$cgi->start_html('hello world'),
$cgi->h1('hello world'),
$cgi->end_html();


and this is nonph.{pl,pcgi}

Code:

use CGI ; #qw( -nph );
my $cgi = new CGI;
print $cgi->header(),
$cgi->start_html('hello world'),
$cgi->h1('hello world'),
$cgi->end_html();


and the results:

Code:

Z:\cgi-bin>GET -ue http://localhost/cgi-bin/nph.pl                             
GET http://localhost/cgi-bin/nph.pl                                           
Connection: Close                                                             
Date: Thu, 02 Nov 2006 09:03:11 GMT                                           
Server: Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2 Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2
Content-Type: text/html; charset=ISO-8859-1                                   
Content-Type: text/html; charset=iso-8859-1                                   
Client-Date: Thu, 02 Nov 2006 09:03:12 GMT                                     
Client-Peer: 127.0.0.1:80                                                     
Client-Response-Num: 1                                                         
Title: hello world                                                             
                                                                               
<!DOCTYPE html                                                                 
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"                       
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">           
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">     
<head>                                                                         
<title>hello world</title>                                                     
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />     
</head>                                                                       
<body>                                                                         
<h1>hello world</h1>                                                           
</body>                                                                       
</html>                                                                       
Z:\cgi-bin>GET -ue http://localhost/cgi-bin/nph.pcgi                           
GET http://localhost/cgi-bin/nph.pcgi                                         
Date: Thu, 02 Nov 2006 09:03:15 GMT                                           
Server: Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2                                   
Content-Type: text/html; charset=ISO-8859-1                                   
Content-Type: text/html; charset=iso-8859-1                                   
Client-Date: Thu, 02 Nov 2006 09:03:15 GMT                                     
Client-Peer: 127.0.0.1:80                                                     
Client-Response-Num: 1                                                         
Title: hello world                                                             
                                                                               
<!DOCTYPE html                                                                 
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"                       
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">           
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">     
<head>                                                                         
<title>hello world</title>                                                     
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />     
</head>                                                                       
<body>                                                                         
<h1>hello world</h1>                                                           
</body>                                                                       
</html>                                                                       
Z:\cgi-bin>GET -ue http://localhost/cgi-bin/nonph.pl                           
GET http://localhost/cgi-bin/nonph.pl                                         
Connection: Close                                                             
Date: Thu, 02 Nov 2006 09:03:37 GMT                                           
Server: Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2 Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2
Client-Date: Thu, 02 Nov 2006 09:03:38 GMT                                     
Client-Peer: 127.0.0.1:80                                                     
Client-Response-Num: 1                                                         
                                                                               
Content-Type: text/html; charset=ISO-8859-1                                   
                                                                               
<!DOCTYPE html                                                                 
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"                       
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">           
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">     
<head>                                                                         
<title>hello world</title>                                                     
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />     
</head>                                                                       
<body>                                                                         
<h1>hello world</h1>                                                           
</body>                                                                       
</html>                                                                       
Z:\cgi-bin>GET -ue http://localhost/cgi-bin/nonph.pcgi                         
GET http://localhost/cgi-bin/nonph.pcgi                                       
Connection: Close                                                             
Date: Thu, 02 Nov 2006 09:03:40 GMT                                           
Server: Abyss/2.3.2-X1-Win32 AbyssLib/2.3.2                                   
Content-Type: text/html; charset=ISO-8859-1                                   
Content-Type: text/html; charset=iso-8859-1                                   
Client-Date: Thu, 02 Nov 2006 09:03:40 GMT                                     
Client-Peer: 127.0.0.1:80                                                     
Client-Response-Num: 1                                                         
Title: hello world                                                             
                                                                               
<!DOCTYPE html                                                                 
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"                       
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">           
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">     
<head>                                                                         
<title>hello world</title>                                                     
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />     
</head>                                                                       
<body>                                                                         
<h1>hello world</h1>                                                           
</body>                                                                       
</html>                                                                       


In a web browser, all of them display fine except the nonph.pl script which displays a content-type header in the document body.
Back to top View user's profile Send private message
aprelium
-


Joined: 22 Mar 2002
Posts: 6800

PostPosted: Thu Nov 02, 2006 11:12 am    Post subject: Reply with quote

lmz,

Thank you for the detailed information you have provided. We'll check the Perl ISAPI again with your script to determine why it is sending the Content-type header in the body.

FYI, the ActivePerl ISAPI mode has been created to provide several workarounds and to fix the broken behavior of this ISAPI which is not fully conforming to the standard. We did our best to test it with popular Perl scripts but as you have shown with your simple test, there are still situations which are not correctly handled.
_________________
Support Team
Aprelium - http://www.aprelium.com
Back to top View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic    Aprelium Forum Index -> Perl All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB phpBB Group