Problem mit POST und Session-Cookies
Verfasst: 18.11.2014 16:36
Hallo,
ich wollte mich jüngst mal von WinAPI-Funktionen in einem Projekt entledigen, deshalb habe ich mir für einen alten Code einen neuen geschrieben.
alter Code (irgendwo hier gefunden und angepasst):
neuer Code:
(nur schnell zusammengekürzt)
Zuvor führe ich einen Login aus, aus dem ich dann die Session-ID ermittele und wieder übergebe. Abhängig davon, ob ich angemeldet bin, bekomme ich bei einer Folgeanfrage Daten ausgeliefert oder nicht. Benutze ich den alten Code, klappt alles wunderbar. Wenn ich den neuen Code benutze, klappt zwar der Login, aber ich bekomme die Daten in der Folgeabfrage nicht angezeigt. Es muss also irgendwie daran liegen, dass ich die Cookies im neuen Code nicht richtig übergebe und meine Sitzung nicht erkannt wird. Aber ich sende soweit ich weiß den gleichen Header...
Was macht der zweite (neue) Code anders bzw. wie bekomme ich die Cookies korrekt übertragen?
ich wollte mich jüngst mal von WinAPI-Funktionen in einem Projekt entledigen, deshalb habe ich mir für einen alten Code einen neuen geschrieben.
alter Code (irgendwo hier gefunden und angepasst):
Code: Alles auswählen
#_INTERNET_OPEN_TYPE_DIRECT = 1
#_HTTP_ADDREQ_FLAG_ADD = $20000000
#_HTTP_ADDREQ_FLAG_REPLACE = $80000000
#_INTERNET_FLAG_SECURE = 0
#_INTERNET_SERVICE_HTTP = 3
#_INTERNET_DEFAULT_HTTP_PORT = 80
#_HTTP_QUERY_COOKIE = 44
Procedure.s SendPOST(psPostData.s)
Protected sUserAgent.s
Protected sBuffer.s
Protected sResult.s
Protected sDomain.s
Protected sPostHeader.s
Protected sHost.s
Protected iOpenHandle.i
Protected iConnectHandle.i
Protected iRequestHandle.i
Protected iSendHandle.i
Protected iBytesRead.i
Protected iStatus.i
sHost = "test.testseite.de"
sDomain = ".testseite.de"
sPostHeader = "Content-Type: application/x-www-form-urlencoded " + #CRLF$
sPostHeader + "Cookie: testSession=IrgendEineSessionId; path=/; domain=" + sDomain + "; HttpOnly;" + #CRLF$
sUserAgent = "IrgendeinUserAgent"
sBuffer = Space(1024)
If sHost <> "" And psPostData <> "" And sPostHeader <> ""
iOpenHandle = InternetOpen_(sUserAgent, #_INTERNET_OPEN_TYPE_DIRECT, "", "", 0)
If iOpenHandle
iConnectHandle = InternetConnect_(iOpenHandle, sHost, #_INTERNET_DEFAULT_HTTP_PORT, "", "", #_INTERNET_SERVICE_HTTP, 0, 0)
If iConnectHandle
iRequestHandle = HttpOpenRequest_(iConnectHandle, "POST", "http://test.testseite.de/api.php", "", "", 0, #_INTERNET_FLAG_SECURE, 0)
If iRequestHandle
HttpAddRequestHeaders_(iRequestHandle, sPostHeader, Len(sPostHeader), #_HTTP_ADDREQ_FLAG_REPLACE | #_HTTP_ADDREQ_FLAG_ADD)
iSendHandle = HttpSendRequest_(iRequestHandle, "", 0, psPostData, Len(psPostData))
If iSendHandle
Repeat
InternetReadFile_(iRequestHandle, @sBuffer, 1024, @iBytesRead)
sResult + Left(sBuffer, iBytesRead)
sBuffer = Space(1024)
Until iBytesRead = 0
iStatus = #True
Else
iStatus = -3
EndIf
Else
iStatus = -2
EndIf
Else
iStatus = -1
EndIf
Else
iStatus = 0
EndIf
Else
iStatus = 0
EndIf
If iStatus < 0 Or iStatus = #True
InternetCloseHandle_(iOpenHandle)
EndIf
ProcedureReturn sResult
EndProcedure
Code: Alles auswählen
Procedure.s httpRequest(psType.s, psData.s)
Protected iDataLen.i
Protected iBffSize.i
Protected iConnection.i
Protected iRqTime.i
Protected iNwEvent.i
Protected iRcvSize.i
Protected iHdrEnd.i
Protected sServer.s
Protected sDomain.s
Protected sURL.s
Protected sCookie.s
Protected sRequest.s
Protected sRcvData.s
Protected *RcvBff
sServer = "test.testseite.de"
sDomain = Right(sServer, Len(sServer) - FindString(sServer, ".") + 1)
sURL = "http://" + sServer + "/api.php"
sCookie = "testSession=IrgendEineSessionId"
iDataLen = StringByteLength(psData, #PB_Ascii)
iBffSize = 65536
Select psType
Case "get"
; egal
Case "post"
sRequest + "POST " + sURL + " HTTP/1.0" + #CRLF$
sRequest + "User-Agent: IrgendeinUserAgent" + #CRLF$
sRequest + "Host: " + sServer + #CRLF$
sRequest + "Content-Type: application/x-www-form-urlencoded" + #CRLF$
sRequest + "Content-Length: " + Str(iDataLen) + #CRLF$
sRequest + "Cookie: " + sCookie + "; path=/; domain=" + sDomain + "; HttpOnly;" + #CRLF$ + #CRLF$
sRequest + psData
Default
EndSelect
iConnection = OpenNetworkConnection(sServer, 80, #PB_Network_TCP | #PB_Network_IPv4)
If iConnection
SendNetworkString(iConnection, sRequest, #PB_Ascii)
iRqTime = ElapsedMilliseconds()
Repeat
Delay(10)
iNwEvent = NetworkClientEvent(iConnection)
Until iNwEvent
Select iNwEvent
Case #PB_NetworkEvent_None
Case #PB_NetworkEvent_Disconnect
Case #PB_NetworkEvent_Data
*RcvBff = AllocateMemory(iBffSize)
If *RcvBff = 0
ProcedureReturn ""
EndIf
Repeat
iRcvSize = ReceiveNetworkData(iConnection, *RcvBff, iBffSize)
sRcvData + PeekS(*RcvBff, iRcvSize, #PB_UTF8)
Until Not iRcvSize
FreeMemory(*RcvBff)
iHdrEnd = FindString(sRcvData, #LFCR$, 1)
If iHdrEnd
ProcedureReturn Mid(sRcvData, iHdrEnd + 3)
Else
ProcedureReturn sRcvData
EndIf
EndSelect
CloseNetworkConnection(iConnection)
EndIf
EndProcedure
Zuvor führe ich einen Login aus, aus dem ich dann die Session-ID ermittele und wieder übergebe. Abhängig davon, ob ich angemeldet bin, bekomme ich bei einer Folgeanfrage Daten ausgeliefert oder nicht. Benutze ich den alten Code, klappt alles wunderbar. Wenn ich den neuen Code benutze, klappt zwar der Login, aber ich bekomme die Daten in der Folgeabfrage nicht angezeigt. Es muss also irgendwie daran liegen, dass ich die Cookies im neuen Code nicht richtig übergebe und meine Sitzung nicht erkannt wird. Aber ich sende soweit ich weiß den gleichen Header...
Was macht der zweite (neue) Code anders bzw. wie bekomme ich die Cookies korrekt übertragen?