View previous topic :: View next topic |
Author |
Message |
lmz -
Joined: 28 Oct 2006 Posts: 4
|
Posted: Sat Oct 28, 2006 3:25 pm Post subject: Perl ISAPI extra newline in header? |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
TRUSTAbyss -
Joined: 29 Oct 2003 Posts: 3752 Location: USA, GA
|
Posted: Sat Oct 28, 2006 9:29 pm Post subject: |
|
|
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. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
lmz -
Joined: 28 Oct 2006 Posts: 4
|
Posted: Sun Oct 29, 2006 2:43 pm Post subject: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
aprelium -
Joined: 22 Mar 2002 Posts: 6800
|
Posted: Sun Oct 29, 2006 2:52 pm Post subject: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
lmz -
Joined: 28 Oct 2006 Posts: 4
|
Posted: Mon Oct 30, 2006 4:43 pm Post subject: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
aprelium -
Joined: 22 Mar 2002 Posts: 6800
|
Posted: Tue Oct 31, 2006 10:29 am Post subject: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
lmz -
Joined: 28 Oct 2006 Posts: 4
|
Posted: Thu Nov 02, 2006 10:08 am Post subject: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
aprelium -
Joined: 22 Mar 2002 Posts: 6800
|
Posted: Thu Nov 02, 2006 11:12 am Post subject: |
|
|
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 |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|
|