Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: CGI hook

by Zaxo (Archbishop)
on Aug 08, 2006 at 01:41 UTC ( [id://566042]=note: print w/replies, xml ) Need Help??


in reply to CGI hook

I don't think there's any provision in CGI.pm's new function for a coderef as argument. It won't be called, it will just be stringified and taken as a field name.

Calling new with arguments overrides GET or POST input, leaving requests unhandled. That may be confusing your idea of what's happening.

Clearly, you're looking for a callback to handle some sort of runtime condition - at least that's what your question sounds like. It's probably one of our famous X-Y questions. What are you really trying to accomplish?

After Compline,
Zaxo

Replies are listed 'Best First'.
Re^2: CGI hook
by ikegami (Patriarch) on Aug 08, 2006 at 02:39 UTC

    I don't think there's any provision in CGI.pm's new function for a coderef as argument.

    You should have checked the docs before replying.

    You can set up a callback that will be called whenever a file upload is being read during the form processing. This is much like the UPLOAD_HOOK facility available in Apache::Request, with the exception that the first argument to the callback is an Apache::Upload object, here it's the remote filename.

    $q = CGI->new(\&hook [,$data [,$use_tempfile]]); sub hook { my ($filename, $buffer, $bytes_read, $data) = @_; print "Read $bytes_read bytes of $filename\n"; }

      In my CGI.pm, that passage reads,

                 You can set up a callback that will be called whenever a
             file upload is being read during the form processing. This
             is much like the UPLOAD_HOOK facility available in
             Apache::Request, with the exception that the first
             argument to the callback is an Apache::Upload object, here
             it's the remote filename.
      
              $q = CGI->new();
              $q->upload_hook(\&hook,$data);
      
              sub hook
              {
                     my ($filename, $buffer, $bytes_read, $data) = @_;
                     print  "Read $bytes_read bytes of $filename\n";
              }
      
      
      The hook is not an argument to new, but is set in the upload_hook method.

      After Compline,
      Zaxo

        That example in the CGI.pm docs never worked right. upload_hook can only be used as a function call, not as a method call. This is because when you create a new CGI object, it immediately calls 'init' which parses the request information, and that includes handling any file uploads. So by the time new returns, the file upload has already been handled and hence it is too late to set up the upload hook. That is why it was changed so that you pass the upload hook as a parameter to new.

        However, when using the functional interface you can use the upload_hook function, as long as you call it before you make any other calls.

        It was added as an option to new() in version 3.12. For versions before that, you are right. Current version is 3.20 btw.
        Timeline for upload_hook support:
        • 3.01 - upload_hook support added
        • 3.03 - support for upload_hook configuration in new() added
        • 3.12 - documentation updated to reflect change that was made in 3.03
        Found the correction for 3.12 by checking the change list:
Re^2: CGI hook
by datannen (Novice) on Aug 08, 2006 at 02:02 UTC
    I want to be able to upload a file and perform an action within the _hook subroutine every 4000 bytes or so.
Re^2: CGI hook
by Anonymous Monk on Aug 08, 2006 at 03:27 UTC
    Calling new with arguments overrides GET or POST input, leaving requests unhandled.

    Just to niggle, CGI->new will handle whatever you call it with, including any GET or POST input:

    if ($ENV{'REQUEST_METHOD'} eq "GET" and $ENV{'QUERY_STRING'}) { (my $query = $ENV{'QUERY_STRING'}) =~ s/$munge//; my $q = CGI->new($query); }

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://566042]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (6)
As of 2025-01-14 15:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Which URL do you most often use to access this site?












    Results (42 votes). Check out past polls.