C:\Documents and Settings\Owner\Desktop>perl w32inethttpsample.pl
Perl perl land thread id=27716
callback=0, constant=-1
PerlCallback: entering
PerlCallback: got context=1 mystatus=60
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=27716
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
r=13369352
Connection num=0,text=The operation completed successfully.
callback INTERNET_STATUS_HANDLE_CREATED 13369352
PerlCallback: entering
PerlCallback: got context=2 mystatus=60
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=27716
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
callback INTERNET_STATUS_HANDLE_CREATED 13369356
OpenRequest num=122,text=The data area passed to a system call is too small.
We are at last point before SendRequest(), which will trigger the crash
Press any key to continue . . .
SendRequest num=997,text=Overlapped I/O operation is in progress.
callback INTERNET_STATUS_HANDLE_CREATED 13369356
sleeping while downloading
PerlCallback: entering
PerlCallback: got context=2 mystatus=320
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=6728
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00000000
sleeping while downloading
sleeping while downloading
sleeping while downloading
sleeping while downloading
C:\Documents and Settings\Owner\Desktop>
####
C:\Documents and Settings\Owner\Desktop>perl w32inethttpsample.pl
Perl perl land thread id=48644
callback=0, constant=-1
PerlCallback: entering
PerlCallback: got context=1 mystatus=60
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=48644
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
r=13369352
Connection num=0,text=The operation completed successfully.
callback INTERNET_STATUS_HANDLE_CREATED 13369352
PerlCallback: entering
PerlCallback: got context=2 mystatus=60
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=48644
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
callback INTERNET_STATUS_HANDLE_CREATED 13369356
OpenRequest num=122,text=The data area passed to a system call is too small.
We are at last point before SendRequest(), which will trigger the crash
Press any key to continue . . .
SendRequest num=997,text=Overlapped I/O operation is in progress.
callback INTERNET_STATUS_HANDLE_CREATED 13369356
sleeping while downloading
PerlCallback: entering
PerlCallback: got context=2 mystatus=320
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=10
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=11
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=20
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=21
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=30
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=31
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=40
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=41
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=110
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =10035
PerlCallback: GetLastError() =10035
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=320
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=10
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=11
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=20
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=21
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=30
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=31
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=40
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=41
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
PerlCallback: entering
PerlCallback: got context=2 mystatus=100
PerlCallback: myWin32InternetPerlInterpreterPtr=00233BFC
PerlCallback: ThreadId=45252
PerlCallback: GetLastError() =0
PerlCallback: GetLastError() =0
PerlCallback: pointer from Perl_get_context() =00233BFC
HTTP code = 200
callback INTERNET_STATUS_REQUEST_COMPLETE 0
first 40 chars of file are "
####
#!/usr/bin/perl -w
use Win32; #for Win32::GetCurrentThreadId()
use Win32::Internet;
%s = (
'10' => 'INTERNET_STATUS_RESOLVING_NAME',
'11' => 'INTERNET_STATUS_NAME_RESOLVED',
'20' => 'INTERNET_STATUS_CONNECTING_TO_SERVER',
'21' => 'INTERNET_STATUS_CONNECTED_TO_SERVER',
'30' => 'INTERNET_STATUS_SENDING_REQUEST',
'31' => 'INTERNET_STATUS_REQUEST_SENT',
'40' => 'INTERNET_STATUS_RECEIVING_RESPONSE',
'41' => 'INTERNET_STATUS_RESPONSE_RECEIVED',
'42' => 'INTERNET_STATUS_CTL_RESPONSE_RECEIVED',
'43' => 'INTERNET_STATUS_PREFETCH',
'50' => 'INTERNET_STATUS_CLOSING_CONNECTION',
'51' => 'INTERNET_STATUS_CONNECTION_CLOSED',
'60' => 'INTERNET_STATUS_HANDLE_CREATED',
'70' => 'INTERNET_STATUS_HANDLE_CLOSING',
'80' => 'INTERNET_STATUS_DETECTING_PROXY',
'100' => 'INTERNET_STATUS_REQUEST_COMPLETE',
'110' => 'INTERNET_STATUS_REDIRECT',
'120' => 'INTERNET_STATUS_INTERMEDIATE_RESPONSE',
'140' => 'INTERNET_STATUS_USER_INPUT_REQUIRED',
'200' => 'INTERNET_STATUS_STATE_CHANGE',
'320' => 'INTERNET_STATUS_COOKIE_SENT',
'321' => 'INTERNET_STATUS_COOKIE_RECEIVED',
'324' => 'INTERNET_STATUS_PRIVACY_IMPACTED',
'325' => 'INTERNET_STATUS_P3P_HEADER',
'326' => 'INTERNET_STATUS_P3P_POLICYREF',
'327' => 'INTERNET_STATUS_COOKIE_HISTORY'
);
$c = new Win32::Internet({'flags'=>INTERNET_FLAG_ASYNC});
print "Perl perl land thread id=".Win32::GetCurrentThreadId()."\n";
$c->SetStatusCallback();
print 'r='.$c->HTTP($http, "google.com", undef, undef, undef, undef, 1)."\n";
($num, $text) = $c->Error();
print "Connection num=$num,text=$text\n";
#($status, $info) = $c->GetStatusCallback(1);
#print 'callback '.$s{$status}." $info \n";
$http->OpenRequest($req, '/', 'GET', 'HTTP/1.1', '', undef, 0, 2);
#($status, $info) = $c->GetStatusCallback(2);
#print 'callback '.$s{$status}." $info \n";
($num, $text) = $http->Error();
print "OpenRequest num=$num,text=$text\n";
print "We are at last point before SendRequest(), which will trigger the crash\n";
system('pause');
$req->SendRequest();
($num, $text) = $http->Error();
print "SendRequest num=$num,text=$text\n";
#($status, $info) = $c->GetStatusCallback(2);
#print 'callback '.$s{$status}." $info \n";
while($req->QueryInfo("",HTTP_QUERY_STATUS_CODE) == 0) {print "sleeping while downloading\n"; sleep 1;}
print "HTTP code = ".$req->QueryInfo("",HTTP_QUERY_STATUS_CODE)."\n";
#($status, $info) = $c->GetStatusCallback(2);
#print 'callback '.$s{$status}." $info \n";
$file = $req->ReadEntireFile();
print 'first 40 chars of file are "'.substr($file,0,40)."\"\n";
$http->Close();
####
--- internet.xs.old 2008-04-15 20:01:52.000000000 -0400
+++ internet.xs 2010-10-05 03:18:24.609375000 -0400
@@ -57,7 +57,7 @@
// VALUES FILLED IN BY PerlCallback
DWORD status = -1;
-
+static PerlInterpreter *myWin32InternetPerlInterpreterPtr;
static time_t ft2timet(FILETIME *ft)
{
SYSTEMTIME st;
@@ -824,7 +824,22 @@
// ;)
// if(mystatus!=status) {
- dSP;
+ SV **sp;
+ void * myptr;
+ printf("PerlCallback: entering\n");
+ printf("PerlCallback: got context=%d mystatus=%d\n",context,mystatus);
+ printf("PerlCallback: myWin32InternetPerlInterpreterPtr=%p\n",myWin32InternetPerlInterpreterPtr);
+
+ //comment below out to trigger original crash/bug in Win32::Internet and recompile
+ PERL_SET_CONTEXT(myWin32InternetPerlInterpreterPtr);
+
+ printf("PerlCallback: ThreadId=%d\n",GetCurrentThreadId());
+ printf("PerlCallback: GetLastError() =%d\n",GetLastError());
+ myptr = PERL_GET_CONTEXT;
+ printf("PerlCallback: GetLastError() =%d\n",GetLastError());
+ printf("PerlCallback: pointer from Perl_get_context() =%p\n",myptr);
+ //can't use dSP because we are after variable declarations
+ sp = PL_stack_sp;
ENTER;
SAVETMPS;
PUSHMARK(sp);
@@ -889,6 +904,7 @@
LPCTSTR proxybypass
DWORD flags
CODE:
+ myWin32InternetPerlInterpreterPtr = my_perl;
RETVAL = InternetOpen(agent,type,proxy,proxybypass,flags);
OUTPUT:
RETVAL
####
--- makefile.pl.old 2008-02-22 18:41:48.000000000 -0500
+++ makefile.pl 2010-10-03 21:23:51.500000000 -0400
@@ -22,16 +22,18 @@
use Config qw(%Config);
sub const_loadlibs {
my ($self) = @_;
- if ($^O eq "MSWin32") {
- if ($Config{cc} =~ /^gcc/i) {
- $self->{LDLOADLIBS} .= " -lwininet";
- }
- elsif ($Config{cc} =~ /^bcc/i) {
- $self->{LDLOADLIBS} .= " inet.lib";
- }
- elsif ($] == 5.006 && $Config{cc} =~ /^cl/i) {
- $self->{LDLOADLIBS} .= " wininet.lib";
- }
- }
+ $self->{LDLOADLIBS} .= " wininet.lib";
+
+# if ($^O eq "MSWin32") {
+# if ($Config{cc} =~ /^gcc/i) {
+# $self->{LDLOADLIBS} .= " -lwininet";
+# }
+# elsif ($Config{cc} =~ /^bcc/i) {
+# $self->{LDLOADLIBS} .= " inet.lib";
+# }
+# elsif ($] == 5.006 && $Config{cc} =~ /^cl/i) {
+# $self->{LDLOADLIBS} .= " wininet.lib";
+# }
+ # }
return $self->SUPER::const_loadlibs;
}