我在尝试使用 Delphi 2010 和 Indy 10.5.8 发送 cookie 时遇到问题。下面的代码显示了程序
用于执行初始登录和用户身份验证 - 验证序列号,然后是用户登录,然后轮询任何其他登录用户。
第二步,再次登录,查询用户论坛数据库。这是由于没有发送 cookie 而失败的第二步。
请参阅随附的 JPG 以了解发生的情况(“AllPosts”的内容)。该图显示了程序在尝试访问论坛数据库时生成的诊断信息。论坛在我登录时返回 cookie 信息,但 Indy10 Put 命令不会在随后对论坛的调用中将 Cookie 发回。
以下是用于访问论坛的代码的例外情况。前 4 个程序与登录大厅有关,后 2 个程序用于访问论坛。在附件 JPG 中,您可以看到第一次调用 TransmitPost 成功登录论坛并在响应中获取 Cookie。随后调用 TransmitPost 收到响应错误号 46,表示 Cookie 丢失。这两个调用都是从下面的例程 ViewForums 进行的。
在设计时已经设置了一个 cookie 管理器。
// ****************************************************************************
procedure TNetPlayForumForm.TransmitRequest(const ReturnCode: Boolean = True;
const ShowResponse: Boolean = True);
var
Response: String;
begin
Response := IdHTTPForum.Get(IPAdd);
if ShowResponse then AllPosts.Lines.Add(Response)
else GoodMessage('Ready.');
if ReturnCode then ResponseInteger := ExtractNumber(Response, ResponseData)
else
begin // No return code for some transmissions.
ResponseInteger := 0;
ResponseData := Response;
end;
// ****************************************************************************
procedure TNetPlayForumForm.QVerifySerial;
begin
BusyMessage('Verifying the serial number: ' + SerialNumber);
AllPosts.Lines.Add('Verifying the serial number: ' + SerialNumber);
IPAdd := rsNetPlayForumServer + Format(rsVerifySerial, [SerialNumber]);
TransmitRequest;
end;
// ****************************************************************************
procedure TNetPlayForumForm.QLoginUser;
begin
BusyMessage('Logging in: ' + UserName + ' on port ' + MyPortNumber + '.');
AllPosts.Lines.Add('Logging in: ' + UserName + ' on port ' + MyPortNumber +
'.');
IPAdd := rsNetPlayForumServer +
Format(rsLoginUser, [SerialNumber, UserName, Password, MyPortNumber]);
TransmitRequest;
end;
// ****************************************************************************
procedure TNetPlayForumForm.QPollTheLobby;
begin
BusyMessage('Polling the forum for players on-line.');
IPAdd := rsNetPlayForumServer + Format(rsPollTheLobby, [SerialNumber]);
AllPosts.Lines.Add('Polling the forum for players on-line.');
AllPosts.Lines.Add('IP addresses for players on-line:');
TransmitRequest(False);
end;
// ****************************************************************************
procedure TNetPlayForumForm.TransmitPost;
var
Response: String;
RawHeaders: TIdHeaderList;
Indx: Integer;
RawHeader: String;
Nam: String;
PostStream: TStream;
begin
PostStream := TStringStream.Create('');
Response := IdHTTPForum.Put(IPAdd, PostStream);
PostStream.Free;
RawHeaders := IdHTTPForum.Request.RawHeaders;
for Indx := 0 to RawHeaders.Count - 1 do
begin
Nam := RawHeaders.Names[Indx];
RawHeader := 'Request: ' + Nam + ' = ' + RawHeaders.Values[Nam];
AllPosts.Lines.Add(RawHeader);
end;
AllPosts.Lines.Add(Response);
ResponseInteger := ExtractNumber(Response, ResponseData);
RawHeaders := IdHTTPForum.Response.RawHeaders;
for Indx := 0 to RawHeaders.Count - 1 do
begin
Nam := RawHeaders.Names[Indx];
RawHeader := 'Response: ' + Nam + ' = ' + RawHeaders.Values[Nam];
AllPosts.Lines.Add(RawHeader);
end;
end;
// ****************************************************************************
procedure TNetPlayForumForm.ViewForums;
// ****************************************************************************
// Forum elements: This, Parent, Forum, Topic. There can be multiple topics.
// A forum element contains: ID, Status, Type, Name
// Poster, Description, Topics, Posts
// LastPostDate, LastPostUser, Views, Replies, URL.
// ****************************************************************************
begin
IPAdd := rsNetPlayForumAccess +
Format(rsLoginToForum, [SerialNumber, UserName, Password]);
TransmitPost;
IPAdd := rsNetPlayForumAccess + rsViewForums;
TransmitPost;
end;
// ****************************************************************************
如果您对我如何将 cookie 信息插入到论坛的后续调用中以安抚论坛的看门人,我将不胜感激。