in reply to What's the path when setting cookie via an exec cgi include?

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.

Replies are listed 'Best First'.
Re: Re: What's the path when setting cookie via an exec cgi include?
by Cody Pendant (Prior) on May 15, 2003 at 03:46 UTC
    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
        The only problem with using Javascript, though, is that more and more people have turned it off to prevent "browsing annoyances" (pop-up windows and the like), and also because of it opening a whole can of worms with respect to security.

        Not only that, the implementation of Javascript differs from browser-to-browser (and even between different implementations of the same browser on different OSs), though I'm not sure that'd make any difference with what you have there. A good, high profile, example of this is the new Opodo website: it's written entirely in Javascript, and while it works perfectly in IE, it won't work in anything else.

        I think that it's important to point out that a Javascript solution certainly won't work for everyone out there, whereas the original Perl solution to set the cookie probably would have.

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

      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