Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

CGI and Cookies.

Posted on 2001-09-17
21
Medium Priority
?
422 Views
Last Modified: 2013-11-18
Hi.

Firstly, sorry about the low points but it's all I've got and I need this really.

I need to know how to write and read a cookie from within a CGI application.

Can anyone guide me please?

Thanks a lot,

John.
0
Comment
Question by:Jaymol
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 12
  • 7
  • 2
21 Comments
 
LVL 17

Expert Comment

by:geobul
ID: 6487116
Hi John,
Here is my way of doing this:

Setting cookies :

{ login action }
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  slCookies : TStringList;
  login, passw : string;
begin
  slCookies := TStringList.Create;
  ...
  { reading values from somewhere - from Request here }
  login:=Request.ContentFields.Values['login'];
  passw:=Request.ContentFields.Values['passw'];
  .....
  { adding cookies to string list }
  slCookies.Add('login='+login);
  slCookies.Add('passw='+passw);
  { set cookies in Response }
  Response.SetCookieField(slCookies,'','',Request.Date-1,False);
  .......
  slCookies.Free;
end;


Reading cookies:

procedure TWebModule1.WebModule1WebActionItem2Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  login, passw : String;
begin
  ...
  login := Request.CookieFields.Values['login'];
  passw := Request.CookieFields.Values['passw'];
  ...
end;

Regards, Geo
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487124
Thanks Geo, but I've been trying that (and similar stuff) all morning and haven't made a single cookie yet!

John.
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 6487205
Jaymol, maybe you should go and ask the local bakery... ;-) (just joking)

Are you sure that no cookie is set? Did you enable cookies in thew browser? What happens if you do a request via good old telnet (assuming that the web server is running on your local machine; turn local echo to on if you want to see what you type):

telnet localhost 80
GET /yourdll.dll?login=Myself&passw=LetMeIn HTTP/1.0


(two returns!)
You should then get the reply from your DLL and see what is going wrong.
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 6

Author Comment

by:Jaymol
ID: 6487214
It's actually a CGI application that I'm writing, and cookies are enabled as there are cookies for other sites.

Pulling my hair out about this!

John.
0
 
LVL 17

Expert Comment

by:geobul
ID: 6487253
Well,
There is one html page containing a request to your CGI (html link or form), where in response of that request (WebAction1) you must set the cookies and send a second html page in response. The second html page contains a request to your CGI again, and when processing that second request from the same client browser (WebAction2 for example) you must be able to read the cookies set in the WebAction1.

Regards, Geo
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487718
Okay, what I've done now is completely stripped the lot down.  I've created a new cgi application and added this into the event of the one and only action (default action.)

  With Response.Cookies.Add do begin
    Name:='PageColour';
    Value:='3';
    Domain:='http://www.gadgetsntoys.com';
  end;
  Response.Content:='Cookie should be created now.';

I gave the action the path name of "test" and then uploaded the exe to my server.

Then, I ran the script with the following command...

     http://www.gadgetsntoys.com/test.exe

It replied that the cookie had been created (just so I know it actually ran!), but there's no cookie.

HELP!!!!

John.
0
 
LVL 14

Accepted Solution

by:
AvonWyss earned 80 total points
ID: 6487747
This may help you:
http://community.borland.com/article/0,1410,19523,00.html
And maybe this:
http://home.netscape.com/newsref/std/cookie_spec.html

Especially, Borland uses the SetCookieField method, which you don't.
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487756
If you look at the SetCookieField code, it's actually what I did.  (SetCookieField is a function, coded within just like my example.)

John.
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 6487771
procedure TWebResponse.SetCookieField(Values: TStrings; const ADomain,
  APath: string; AExpires: TDateTime; ASecure: Boolean);
var
  I: Integer;
begin
  for I := 0 to Values.Count - 1 do
    with Cookies.Add do
    begin
      Name := Values.Names[I];
      Value := Values.Values[Values.Names[I]];
      Domain := ADomain;
      Path := APath;
      Expires := AExpires;
      Secure := ASecure;
    end;
end;

Actually, I think that the Path portion is essential (look at the Netscape docs), and the expiration should gbe in the future (like, Now+356 for one year's expiration time).
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487774
Okay, I had a look at the links and made a little exe.

Here's the two actions that were in it....

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  MyCookies: TStringList;
begin
  MyCookies := TStringList.Create;
  with MyCookies do begin
    Add('Name=Frank Borland');
    Add('Address=100 Borland Way');
    Add('Product=Delphi');
  end;
  with Response do begin
    SetCookieField(MyCookies, 'localhost', '/', (Now + 1), False);
    Content := 'Cookie planted';
  end;
end;

procedure TWebModule1.WebModule1WebActionItem2Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  i: integer;
begin
  Response.Content := '';
  for i := 0 to (Request.CookieFields.Count - 1) do
  begin
    Response.Content := Response.Content + '' +
    Request.CookieFields[i] + '';
  end;
  Response.Content := Response.Content + '';
end;


Basically, the first one creates the cookies, the second one reads them back.

There were no cookies created.

John.
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487787
From the netscape doc you gave me a link to...

"Expires is an optional attribute. If not specified, the cookie will expire when the user's session ends."

"If the path is not specified, it as assumed to be the same path as the document being described by the header which contains the cookie."

I understand cookies.  I need to know how to create and read them from a Delphi CGI executable application.
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 6487807
Okay okay, don't get mad at me. I never use cookies but instead use a session ID I pass along with GET/POST requests. This allows to make server-side tracking without needing cookies, so I'm not an expert with cookies.

Have you done the test with TELNET? I tried your http://www.gadgetsntoys.com/test.exe url, but I get a 404...
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487813
?????

I'm not getting mad!  And I deleted the test.exe

I'll put another one back in there, called test.exe so you can have a go at that.  (It'll just be the code I supplied above.)

John.
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487821
I've put the test.exe in there.  If you run it like this...

    http://www.gadgetsntoys.com/cgi-bin/test.exe

...then it runs the default procedure that is the create cookie bit.

Thanks,

John.
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 6487835
Ok, here's what is returned:

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Mon, 17 Sep 2001 14:55:51 GMT
Set-Cookie: PageColour=3
Content-Type: text/html
Content:

So I believe that the cookie is set.
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487849
But it's not!

John.
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 6487866
Where and how are you checking this?
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487890
Thanks for your help mate.  Turns out that I was being a donkey and not checking for the cookies correctly.  (I've been going mad over this all day, but it's been working all day!!!)

Thanks again,

John.
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 6487899
*lol* things like this happen...

Thanks for the points anyways...
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487909
Thanks for the help.  BTW, what d'you think of the site so far?

John.
0
 
LVL 6

Author Comment

by:Jaymol
ID: 6487946
How come this doesn't work then?

var
  TmpS  : String;
begin
  TmpS:=Request.CookieFields.Values[Request.QueryFields.Values['name']];
  Response.ContentType:='text/html';
  Response.Content:='<b><u>Cookie Value</u></b><br><br>Name : '+Request.QueryFields.Values['name']+'<br>Value : '+TmpS;

I'm running it to get back a cookie value I created earlier but it returns a server error instead.

John.
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
This article covers the basics of the Sass, which is a CSS extension language. You will learn about variables, mixins, and nesting.
The viewer will learn the benefit of using external CSS files and the relationship between class and ID selectors. Create your external css file by saving it as style.css then set up your style tags: (CODE) Reference the nav tag and set your prop…
The viewer will learn the basics of jQuery, including how to invoke it on a web page. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery.: (CODE)

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question