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

I'm running a script which tries to set a cookie.

The script is in /cgi-bin, but I'm not running it from there.

I'm running it in the front page as an <!--#exec cgi="/cgi-bin/myscript.cgi" --> include in an shtml page.

It doesn't set the cookie when I go to the shtml page with the include in it.

If I go to the actual script directly, /cgi-bin/myscript.cgi, it does.

What's going wrong here? Is it the path setting in the cookie? I've tried no path, '/', '/cgi-bin/' but none of them seems to work.

Any help gratefully received.
--

“Every bit of code is either naturally related to the problem at hand, or else it's an accidental side effect of the fact that you happened to solve the problem using a digital computer.”
M-J D
  • Comment on What's the path when setting cookie via an exec cgi include?

Replies are listed 'Best First'.
Re: What's the path when setting cookie via an exec cgi include?
by hv (Prior) on May 15, 2003 at 03:39 UTC

    In the HTTP protocol, the browser sends a request and the server sends an answer. If the answer includes a virtual include like <!--#exec cgi="/cgi-bin/myscript.cgi" -->, the server may act on that to execute the CGI and incorporate the result, but the simplest implementation will grab only the text output, and ignore meta-information sent from that CGI output such as new cookies - chances are, the server already thinks it knows what the header to return to the browser (cookies and all) should look like.

    If there is a straightforward way for your primary CGI to determine that the cookie will be required and send it directly, I'd suggest taking that approach. I don't know of any simple alternative.

    Hugo
Re: What's the path when setting cookie via an exec cgi include?
by dws (Chancellor) on May 15, 2003 at 03:41 UTC
    It doesn't set the cookie when I go to the shtml page with the include in it. If I go to the actual script directly, /cgi-bin/myscript.cgi, it does. What's going wrong here?

    To set a cookie, you need to emit a Set-Cookie: as part of your response header. If you embed an <!--#exec... directive in a page such that any HTML gets into the output stream before the tag, whatever the executed script does happens too late.

    You might be able to get this to work by doing the <!--#exec as the very first thing in the .shtml, but I've never tried that.

      For the record, there is nothing in the shtml file at all except for the exec cgi thing.

      I moved it from another server where I was allowed to have index.cgi as the front page, and the exec cgi thing was my workaround.

      It looks like there's no way around it...
      --

      “Every bit of code is either naturally related to the problem at hand, or else it's an accidental side effect of the fact that you happened to solve the problem using a digital computer.”
      M-J D

        A workaround is to set the cookie with javascript. Javascript will allow you to set a cookie after the content header has already been sent (as in your case). So /cgi-bin/myscript.cgi could print the javascript html code setting the cookie/s you need.

        Although this isn't perl, here's some javascript for setting a cookie. It's a function followed by the call. This script sets a cookie called myName to Bubba. You set the cookie just like you would in perl. Specifying all the cookie parameters you need. Again, this snippet is javascript, not perl.

        function setCookie(name, value, expires, path, domain, secure) { var curCookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); document.cookie = curCookie; } now=new Date(); now.setFullYear(now.getFullYear()+1); setCookie("myName", "Bubba", now, "/" ,".yourdomain.com");
        jtrue
        A little bit of a cheat, but couldn't you simply use a standard index.html, and use frames to call the CGI script and return its output?

        -- Foxcub
        #include www.liquidfusion.org.uk