[C++] XmlHttp

Pagina: 1
Acties:

Onderwerpen


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Ik ben bezig met het aanspreken van een webservice van een klant van ons. Deze webservice zit op een https verbinding met een geldig certificaat. Echter, de testomgeving van de webservice zit ook achter https maar met een self-signed certificaat (dus eigenlijk gewoon geen echt certificaat).

Mijn probleem is nu het volgende:

Als test heb ik een JScript scriptje waarmee in de webservice kan aanspreken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var ParFile = WScript.Arguments.Item(0);

var objFile = new  ActiveXObject("Scripting.FileSystemObject");
var xmlFile = objFile.OpenTextFile(ParFile);
var xmlDoc  = xmlFile.ReadAll();

var xmlHttp = null;
try {   
    // IE7+, Firefox, Opera 8.0+, Safari...    
    xmlHttp= new XMLHttpRequest(); 
} catch(ex)   
{   // Internet Explorer...   
    try {   
        xmlHttp= new ActiveXObject('Msxml2.XMLHTTP');   
    } catch(ex) {   
        xmlHttp= new ActiveXObject('Microsoft.XMLHTTP');   
    }   
}   
  
xmlHttp.setOption(2, 13056);  // NOTE: 13056 = SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS 

xmlHttp.open("POST", "https://webserviceurl",false, "username", "password");
xmlHttp.setRequestHeader("Content-Type", "application/soap+xml");

xmlHttp.send(xmlDoc);
while (xmlHttp.readyState != 4) {
   xmlHttp.waitForResponse(1000);
}

WScript.echo(xmlHttp.getAllResponseHeaders());
WScript.echo(xmlHttp.responseXML.xml);
WScript.echo(xmlHttp.responseText);


Dit werkt prima...

Nu wil ik deze code omzetten naar onze C++ applicatie waarbij ik gebruik maak van een IE object. Het probleem zit hem echter in deze regel:
code:
1
xmlHttp.setOption(2, 13056);  // NOTE: 13056 = SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS


ik krijg deze code niet in de C++ verwerkt, waardoor door de unsigned-heid van het certificaat de boel niet werkt.

Mijn C++ code:
C++:
1
2
3
4
5
      Variant XmlHttp = Variant::CreateObject("Microsoft.XMLHTTP");
      XmlHttp.OleFunction("Open","POST",WideString(PostURL),false, UserName, PassWord);
      XmlHttp.OleFunction("setOption", "2", 13056);
      XmlHttp.OleFunction("setRequestHeader","Content-Type","application/soap+xml");
      XmlHttp.OleFunction("send", WideString(xmlstring));


de setOption functie geeft hier als error:
code:
1
Project test.exe raised exception class EOleSysError with message 'Onbekende naam'. Process stopped.


hoe krijg ik nu voor elkaar dat ik de certificaat error kan negeren?

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:56

Cyphax

Moderator LNX
Is die "2" niet een of andere soort enum ofzo? Misschien probeert ie nu een optie genaamd "2" te setten, maar vindt ie die niet, hence "Onbekende naam"? Probeer eens die 2 als numeriek mee te geven ipv als string?

MSDN: setOption Method
Hier staan wat opties bij naam, ipv nummer. De derde die daar staat (optie 2 als je vanaf 0 telt) heet SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS
Misschien toeval, misschien niet? Probeer het eens. :)
(Hoe meer ik lees op die pagina, hoe meer ik vermoed dat je hier je antwoord op zou moeten kunnen vinden ;))

[ Voor 66% gewijzigd door Cyphax op 29-09-2011 14:58 ]

Saved by the buoyancy of citrus


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Cyphax schreef op donderdag 29 september 2011 @ 14:54:
Is die "2" niet een of andere soort enum ofzo? Misschien probeert ie nu een optie genaamd "2" te setten, maar vindt ie die niet, hence "Onbekende naam"? Probeer eens die 2 als numeriek mee te geven ipv als string?

MSDN: setOption Method
Hier staan wat opties bij naam, ipv nummer. De derde die daar staat (optie 2 als je vanaf 0 telt) heet SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS
Misschien toeval, misschien niet? Probeer het eens. :)
(Hoe meer ik lees op die pagina, hoe meer ik vermoed dat je hier je antwoord op zou moeten kunnen vinden ;))
ik was even vergeten wat ik allemaal geprobeerd heb (namelijk heel veel), waardoor ik dat ook niet allemaal hier heb genoteerd... maar zowel de 2 numeriek meegeven als de SXH_OPTION_IGNORE_..... geven dezeldfe foutmelding :(

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:56

Cyphax

Moderator LNX
En kan je iets met deze info:
The SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS option is a DWORD mask of various flags that can be set to change this default behavior. The default value is to ignore all problems. You must set this option before calling the send method. The flags are as follows:

SXH_SERVER_CERT_IGNORE_UNKNOWN_CA = 256

Unknown certificate authority

SXH_SERVER_CERT_IGNORE_WRONG_USAGE = 512

Malformed certificate such as a certificate with no subject name.

SXH_SERVER_CERT_IGNORE_CERT_CN_INVALID = 4096

Mismatch between the visited hostname and the certificate name being used on the server.

SXH_SERVER_CERT_IGNORE_CERT_DATE_INVALID = 8192

The date in the certificate is invalid or has expired.

SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS = 13056

All certificate errors.

To turn off a flag, you subtract it from the default value, which is the sum of all flags. For example, to catch an invalid date in a certificate, you turn off the SXH_SERVER_CERT_IGNORE_CERT_DATE_INVALID flag as follows:
Van MSDN: getOption Method

Probeer die 13056 eens? :)
Die beschrijving is waarschijnlijk wel handig :)

Als je dat toevallig ook al had geprobeerd, kan je dan een opsomming maken van wat je nog meer hebt geprobeerd voor zover je je dat nog kan herinneren?

[ Voor 11% gewijzigd door Cyphax op 29-09-2011 15:33 ]

Saved by the buoyancy of citrus


  • FlowinG
  • Registratie: Maart 2003
  • Laatst online: 19-09 17:00
Wat me opvalt in de JavaScript is dat je eerst de option zet en daarna pas de verbinding opent (xmlHttp.open("POST", "https://webserviceurl",false, "username", "password");). In de C++ code open je de verbinding eerst, waarna je pas de option set (XmlHttp.OleFunction("setOption", "2", 13056); ).

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Cyphax schreef op donderdag 29 september 2011 @ 15:31:
En kan je iets met deze info:

[...]


Van MSDN: getOption Method

Probeer die 13056 eens? :)
Die beschrijving is waarschijnlijk wel handig :)

Als je dat toevallig ook al had geprobeerd, kan je dan een opsomming maken van wat je nog meer hebt geprobeerd voor zover je je dat nog kan herinneren?
die 13056 is eigenljik gelijk aan wat je in je vorige antwoord al zei... het gekke is namelijk (voor zover ik dat begrijp) dat een int value een int waarde krijgt toegewezen... dat vind ik zelf ook erg onduidelijk, maar het komt volgens mij neer op deze regel (in JScript):
xmlHttp.setOption(2, 13056);

blijkbaar weet de de functie setOption wat 2 is, want feitelijk staat hier: geef 2 de waarde 13056. Ik neem aan dat ze bedoelen: geef optie 2 de waarde 13056.

op het moment probeer ik de klant zover de krijgen dat ze de testomgeving ook in http beschikbaar krijgen OF dat ze voor de testomgeving ook een geldig certificaat installeren... ik geloof dat ze wel bereid zijn dat te doen, maar ja, zover is het nog niet....
FlowinG schreef op donderdag 29 september 2011 @ 15:37:
Wat me opvalt in de JavaScript is dat je eerst de option zet en daarna pas de verbinding opent (xmlHttp.open("POST", "https://webserviceurl",false, "username", "password");). In de C++ code open je de verbinding eerst, waarna je pas de option set (XmlHttp.OleFunction("setOption", "2", 13056); ).
nu even getest, maar helaas geeft dat dezelfde foutmelding...

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:56

Cyphax

Moderator LNX
P.O. Box schreef op donderdag 29 september 2011 @ 15:50:
[...]

blijkbaar weet de de functie setOption wat 2 is, want feitelijk staat hier: geef 2 de waarde 13056. Ik neem aan dat ze bedoelen: geef optie 2 de waarde 13056.
Optie 2, ja, maar dat is een... enum ofzo? Dat is in C dus iets anders, maar wat precies? Daar gaat het mis, zo gok ik. Dus de vraag blijft even: hoe identificeer je die optie?

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Ja dat is mij dus ook niet duidelijk...
onderaan MSDN: getOption Method staan de waardes van de enum gedefinieerd, maar ik begrijp niet hoe dit werkt...

Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-09 00:06
Niet een antwoord op je vraag, maar de webservice lijkt op soap gezien het zetten van de content-type header. Je zou kunnen overwegen om een soap library te gebruiken:
http://stackoverflow.com/...a-good-c-library-for-soap

En als je direct HTTP(s) wilt gebruiken zijn er ook alternatieven voor het XmlHttpRequest COM object zoals libcurl of WinHTTP die misschien makkelijker zijn in gebruik.
Pagina: 1