Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
2 - PROFAN-Programmierung

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Neuerer Beitrag  |  Älteres Thema 
 WinHttp.dll
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   13.06.14 20:28

Ich stehe aktuell vor der Aufgabe, mit einer Http Post Action aus einem XProfan Programm, ein CSV-Datei auf einen Webserver uploaden zu müssen.

Erste Versuche funktionieren bei der Kommunikation mit einem lokalen Apache Webserver schon, aber den richtigen Durchblick hab ich dann doch nicht.

Es hapert am Format der Übergabe-Daten, und das große Internet Orakel (Google) hilft auch nicht wirklich weiter.

Hat jemand hier schon Erfahrungen mit der WinHttp.dll gesammelt, und kann Erfahrungen damit hier posten, bzw. mich in meiner Testphase unterstützen?

Daten wie WinHttp.ph, WinHttp.inc und anderen Quellcode gebe ich gesondert bekannt.

Beste Grüße
Matthias Griesbach

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: WinHttp.dll
Autor: Maik Borchardt (---.dip0.t-ipconnect.de)
Datum:   13.06.14 23:24

Hallo Matthias,


wäre schön wenn du die Inc+weitere Dateien zur verfügung stellen könntest.

Wie sieht denn dein Header aus den du per Post sendest....???

Xp Home
Profan 9

Beitrag beantworten
 
 Quellcodes
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   14.06.14 17:49

Folgende Quellcodes habe ich bis jetzt am laufen.

Zuerst das Upload PHP-Script für den Webserver

<?PHP
 //echo 'Datei: '.$_FILES["userfile"]["name"];
 //echo 'Datei: '.$_FILES["userfile"]["size"];
 if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["name"])) {
 echo 'succsess';
 }
 else 
 {
 echo 'error 200';
 }
 ?>


Für Profan dann einmal die Header Datei WinHttp.ph
INTERNET_SCHEME_HTTP                   = 1;
 INTERNET_SCHEME_HTTPS                  = 2;
 INTERNET_DEFAULT_HTTP_PORT             = 80;
 INTERNET_DEFAULT_HTTPS_PORT            = 443;
  
 WINHTTP_NO_PROXY_NAME                  = 0;
 WINHTTP_NO_PROXY_BYPASS                = 0;
 WINHTTP_NO_REFERER                     = 0;
 WINHTTP_NO_HEADER_INDEX                = 0;
 WINHTTP_DEFAULT_ACCEPT_TYPES           = 0;
 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY      = 0;
 WINHTTP_HEADER_NAME_BY_INDEX           = 0;
 WINHTTP_NO_ADDITIONAL_HEADERS          = 0;
 WINHTTP_NO_REQUEST_DATA                = 0;
 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY      = 0;
  
 WINHTTP_AUTH_TARGET_SERVER             = 0;
 WINHTTP_AUTH_TARGET_PROXY              = 1;
  
 WINHTTP_AUTH_SCHEME_BASIC              = 1;
 WINHTTP_AUTH_SCHEME_NTLM               = 2;
 WINHTTP_AUTH_SCHEME_PASSPORT           = 4;
 WINHTTP_AUTH_SCHEME_DIGEST             = 8;
 WINHTTP_AUTH_SCHEME_NEGOTIATE          = 16;
  
 WINHTTP_OPTION_REDIRECT_POLICY                         = 88;
 WINHTTP_OPTION_REDIRECT_POLICY_NEVER                   = 0;
 WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP  = 1;
 WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS                  = 2;
  
 WINHTTP_QUERY_STATUS_CODE              = 19;
 WINHTTP_QUERY_RAW_HEADERS_CRLF         = 22;
 WINHTTP_QUERY_CONTENT_ENCODING         = 29;
 WINHTTP_QUERY_LOCATION                 = 33;
 WINHTTP_QUERY_FLAG_NUMBER              = $20000000;
 WINHTTP_QUERY_CONTENT_LENGTH           = 5;
  
 WINHTTP_OPTION_USERNAME                = $1000;
 WINHTTP_OPTION_PASSWORD                = $1001;
  
 WINHTTP_FLAG_REFRESH                   = $00000100;
 WINHTTP_FLAG_SECURE                    = $00800000;
  
 WINHTTP_ADDREQ_FLAG_ADD                = $20000000;
 
 WINHTTP_RETURNTYPE_MEMORY;
 WINHTTP_RETURNTYPE_FILE;
 


Dann die Include Datei mit den Funktionen WinHttp.inc
'Eine Struktur aus der Vorlage, noch nicht Profan angepasst
 
 'Structure WinHTTP_ParametersStruc
   'URL.s
  'RequestType.s
   'ReturnHeader.i
  ' UserName.s
  ' Password.s
  ' HeaderData.s
   'OptionalData.s
   'UserAgent.s
  ' CallbackID.i
  ' *CallbackStart
  ' *CallbackProgress
  ' *CallbackEnd
  ' *Memory
  ' FilePath.s
  ' FileBufferSize.i
 'EndStructure
 
 
 'Ein paar Variablen
 Declare WinHttp&,hInternet&, hSession&, hConnect&, hRequest&, bResults&
 
 'Init Prozedur. "P" mit "*" ersetzen, und Zeile Listbox entkommentieren, um alle Funktionen anzusehen
 Proc WinHttpInit
   WinHttp&=ImportDLL("winhttp.dll", "P")
   'ListBox$("Funktionen",1)
 EndProc
 
 'Exit Prozedur
 Proc WinHttpEnd
   FreeDll WinHttp&
 EndProc
 
 'Prozedur zum Starten einer Session
 Proc HttpOpen
   Parameters name$
   Declare ansistring#,widestring#,size&,wsize&,i&
   size&=Len(name$)+1
   Dim ansistring#,size&
   String ansistring#,0=name$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   hSession& = PWinHttpOpen(Addr(widestring#),~WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,~WINHTTP_NO_PROXY_NAME,~WINHTTP_NO_PROXY_BYPASS,0)
   CaseNot  hSession& :Return "Session: "+str$(~GetLastError())+" - "+WinError$(%WinError)
   Return "Session established"
 EndProc
 
 'Prozedur um eine Verbundung zum Webserver (Domain) herzustellen
 Proc HttpConnect
   Parameters name$
   Declare ansistring#,widestring#,size&,wsize&,i&
   size&=Len(name$)+1
   Dim ansistring#,size&
   String ansistring#,0=name$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   hConnect& = PWinHttpConnect(hSession&,addr(widestring#),~INTERNET_DEFAULT_HTTP_PORT, 0)
   CaseNot  hConnect& :Return "Connect: "+str$(~GetLastError())+" - "+WinError$(%WinError)
   Return "Connection established"
   Dispose ansistring#
   Dispose widestring#
 EndProc
 
 'Prozedur um einen Request zu erstellen.
 Proc HttpRequest
   Parameters verb$, objekt$, types$
   Declare ansistring#,widestring#,widestring2#,size&,wsize&,wsize2&,i&
   size&=Len(objekt$)+1
   Dim ansistring#,size&
   String ansistring#,0=objekt$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1
   Dim widestring2#,len(verb$)+1
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   Dispose ansistring#
   size&=Len(verb$)+1
   Dim ansistring#,size&
   String ansistring#,0=verb$
   'String widestring2#,0=verb$
   CaseNot verb$:verb$="GET"  
   MultiByteToWideChar(1,1,ansistring#,size&,widestring2#,wsize&)
   hRequest& = PWinHttpOpenRequest( hConnect&, addr(widestring2#) ,addr(widestring#),0,~WINHTTP_NO_REFERER,~WINHTTP_DEFAULT_ACCEPT_TYPES,0) '~NULL objekt$ addr(widestring#) addr(widestring2#)
   CaseNot  hRequest& :Return "Request: "+str$(~GetLastError())+" - "+WinError$(%WinError)
   Return "Request opened"
   Dispose ansistring#
   Dispose widestring#
   Dispose widestring2#
 EndProc
 
 'Prozedur um dem Request Header Informationen hinzuzufügen
 Proc HttpAddHeader
   Parameters text$
   Declare ansistring#,widestring#,size&,wsize&,i&
   text$=text$+chr$(13)+chr$(10)
   size&=Len(text$)+1
   Dim ansistring#,size&
   String ansistring#,0=text$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1  
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   CaseNot PWinHttpAddRequestHeaders(hRequest&, addr(widestring#),-1,~WINHTTP_ADDREQ_FLAG_ADD):Return "AddHeader: "+str$(~GetLastError())+WinError$(%WinError)
   Dispose ansistring#
   Dispose widestring#
   Return "Add Header "+text$
 EndProc
 
 'Prozedur um den Request zu senden
 'Der Body Text wird hier mit übergeben.
 Proc HttpSend
   Parameters Text$
   text$=text$
   Declare ansistring#,widestring#,size&,wsize&,i&
   size&=Len(text$)+1
   Dim ansistring#,size&
   String ansistring#,0=text$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1  
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   bResults& = PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0,addr(widestring#), 0,0, 0) '~WINHTTP_NO_REQUEST_DATA addr(widestring#)
   CaseNot  bResults& :Return "Send: "+str$(~GetLastError())+WinError$(%WinError)
   Return "Send Request"
 EndProc 
 
 'Prozedur um Darten auf den Webserver zu schreiben
 Proc HttpWriteData
   Parameters file$
   Declare BytesWritten&, Size&, Buff#
   Size&= FileSize(file$)
   Dim  Buff#, Size&
 
   BlockRead(file$, Buff#, 0, Size&) 
 
   bResults& = PWinHttpWriteData( hRequest&, addr(Buff#), Size&, BytesWritten&)
   CaseNot  bResults& :Return "Write: "+str$(~GetLastError())+WinError$(%WinError)
   Return str$(Size&)+" Bytes written"
   Dispose Buff#                                   
 EndProc
 
 'Prozedur um die Antwort des Servers zu verarbeiten
 'Die Größe des Buffers beruht nur auf einer Annahme.
 Proc HttpReceiveResponse
   Declare Size&,Downloaded&,Buff#
   Dim Buff#,2048
   bResults& = PWinHttpReceiveResponse( hRequest&, 0)
   CaseNot  bResults& :Return "Receive: "+str$(~GetLastError())+WinError$(%WinError)
   'Hier soll eigentlich Size& auf die exakte Buffergröße gesetzt werden
   'Klappt aber nicht.
   PWinHttpQueryDataAvailable( hRequest&, Size&)
   Print str$(Size&)+" Bytes"
   'Da Size& nicht bestückt wird, ersteinmal manuell angeben
   Size&=500
   PWinHttpReadData( hRequest&, addr(Buff#), Size&, Downloaded&)
   Return String$(Buff#,0)
   Dispose Buff#  
 EndProc
 
 'Prozedur um alle HInternet Handels freizugeben.
 Proc HttpClose
   Case hRequest& : PWinHttpCloseHandle(hRequest&)
   Case hConnect& : PWinHttpCloseHandle(hConnect&)
   Case hSession& : PWinHttpCloseHandle(hSession&)
 EndProc
 


Und letztendlich den TestQuellcode WinHttp.prf
'Zur Sicherheit mal alle Windows-Header einbinden
 $H Messages.ph
 $H Windows.ph
 $H COMMCTRL.PH
 
 'Inc und Header für die WinHttp.dll
 $H includes/WinHttp.ph
 $I includes/WinHttp.inc
 
 'Funktionen um Strings in das Unicode-Format zu wandeln.
 'Die WinHttp.dll nimmt nur Uncode Strings an.
 Def MultiByteToWideChar(6) !"KERNEL32","MultiByteToWideChar"
 Def WideCharToMultiByte(8) !"KERNEL32","WideCharToMultiByte"
 
 'Ein paar Variablen
 Declare Ende&, Body$
 
 'Ein Programmfenster
 CLS
 
 'WinHttp.dll laden
 WinHttpInit
 
 'Dll Handle ausgeben
 Print str$(WinHttp&)
 
 'Eine Session starten
 Print HttpOpen("HTTP Profan")+ "("+str$(hSession&)+")"
 
 'Eine Verbindung zum Webserver aufbauen
 Print HttpConnect("localhost")+ "("+str$(hConnect&)+")"
 
 'Einen POST Request anlegen
 Print HttpRequest("POST","kylt/PCR_Upload.php","multipart/form-data")+ "("+str$(hRequest&)+")"
 
 'Header Infos hinzufügen
 Print HttpAddHeader("Content-Type: multipart/form-data; boundary=--AaB03x") 'Boundary ist zwingend anzugeben, wird sonst vom Webserver angemeckert.
 'Print HttpAddHeader("Content-Type: application/x-www-form-urlencoded")
 
 'Das BODY Element aufbauen chr$(13)+chr$(10)=Zeilenumbruch
 Body$="--AaB03x"+chr$(13)+chr$(10)+"_"
 Body$=Body$+"Content-Disposition: form-data; name="+chr$(34)+"data"+chr$(34)+"; filename="+chr$(34)+"kylt-export.csv"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
 Body$=Body$+"Content-Disposition: form-data; name="+chr$(34)+"max_file_size"+chr$(34)+"; value="+chr$(34)+"1000000"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
 Body$=Body$+"Content-Disposition: form-data; name="+chr$(34)+"userfile"+chr$(34)+"; value="+chr$(34)+"C:\\Kylt%20PCR\\kylt-export.csv"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
 'Body$=Body$+"Content-type: text/x-csv "+chr$(34)+"C:\\Kylt%20PCR\\kylt-export.csv"+chr$(34)+";"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
 
 'Body ausgeben
 Print Body$
 
 'Request und Body senden
 Print HttpSend(Body$)
 
 'Daten auf den Server schreiben
 Print HttpWriteData("C:\\Kylt PCR\\kylt-export.csv")
 
 'Response vom Webserver ausgeben
 Print HttpReceiveResponse()
 
 'Alle HInternet Handels freigeben (Session,Connect,Request)
 HttpClose
 
 'Programmschleife - Beenden mit ESC
 WhileNot Ende&
   WaitInput
   Case %key=27: Ende&=1
 EndWhile
 
 'WinHttp.dll entladenladen
 WinHttpEnd
 


Wie schon geschildert funktioniert die Kommunikation schon Grundlegend, aber es hapert noch am erstellen des POST Action Headers / Bodys und des Uploads einer CSV-Datei.

Bitte mal testen, ausprobieren, und mir dann den richtigen Weg aufzeigen.

Beste Grüße
Matthias Griesbach

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: Quellcodes
Autor: Maik Borchardt (---.dip0.t-ipconnect.de)
Datum:   15.06.14 23:30

Hallo Matthias,

nur eben mal auf die schnelle.... bin grad erst heim vom Wochenende...

erstmal ein paar optische hinweise... was aber die lesbarkeit erhöht und somit die fehlersuche erleichtert


1. würde ich alle chr$(34) erstmal als einfaches ' nutzen und zum schluß
per translate$(Body$,"'",chr$(34)) ersetzen lassen
2. die chr$(13)+chr$(10) entweder im String als \r\n schreiben oder zuvor in eine Variable legen

3.Du hast beim übersetzen ein _ (Unterstrich) hinten dran gelassen...
ich mein das ist bei Autoit oder so nur als interner Zeilenumbruch gehört ganz sicherlich nicht dahin....

dein Body
 'Das BODY Element aufbauen chr$(13)+chr$(10)=Zeilenumbruch
  Body$="--AaB03x"+chr$(13)+chr$(10)+"_"
  Body$=Body$+"Content-Disposition: form-data; name="+chr$(34)+"data"+chr$(34)+"; filename="+chr$(34)+"kylt-export.csv"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
  Body$=Body$+"Content-Disposition: form-data; name="+chr$(34)+"max_file_size"+chr$(34)+"; value="+chr$(34)+"1000000"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
  Body$=Body$+"Content-Disposition: form-data; name="+chr$(34)+"userfile"+chr$(34)+"; value="+chr$(34)+"C:\\Kylt%20PCR\\kylt-export.csv"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
  'Body$=Body$+"Content-type: text/x-csv "+chr$(34)+"C:\\Kylt%20PCR\\kylt-export.csv"+chr$(34)+";"+chr$(34)+";"+chr$(13)+chr$(10)+"_"
  
  'Body ausgeben
  Print Body$
 


bei mir würder er dann so aussehen...
  'Das BODY Element aufbauen chr$(13)+chr$(10)=Zeilenumbruch
  Body$="--AaB03x\r\n"
  Body$=Body$+"Content-Disposition: form-data; name='data'; filename='kylt-export.csv';\r\n"
  Body$=Body$+"Content-Disposition: form-data; name='max_file_size'; value='1000000';\r\n"
  Body$=Body$+"Content-Disposition: form-data; name='userfile'; value='C:\\Kylt%20PCR\\kylt-export.csv';\r\n"
 Body$=translate$(body$,"'",chr$(34))
 
  'Body ausgeben
  Print Body$
 


das war erst mal das erste was mir aufgefallen ist...

dann kommt.... der Header selbst.....
ich meine das dieser Body eigentlich alles Headerinformationen sind...

also ich weiß es noch nicht genau.... schaue ich mir morgen genauer an...

am ende des headers kommt normalerweise zweimal das \r\n

dann gefolgt mit den Daten der Datei zum beispiel.....

Die datei ist eine csv datei sollte mit im header stehen

'Content-Type: text/csv'

also sollte der header in etwa wie folgt sein

Boundary: nicht vergessen am anfang und ende.....
wie gesagt das ist jetzt nur auf die schnelle ohne das ich mich damit tiefer befasst habe....



-----------------------------41184676334"+CRLF
'Content-Disposition: form-data; name="userfile"; filename="dateiname"'+CRLF
'Content-Type: text/csv'+CRLF+CRLF+inhalt der Datei+CRLF+'-----------------------------41184676334--' & CR

Xp Home
Profan 9

Beitrag beantworten
 
 Re: Quellcodes
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   16.06.14 19:23

Hallo Maik,

ich habe Deine Vorschläge/Änderungen jetzt einmal gestestet - ohne Erfolg.

Um das ganze besser zu verstehen, und auch Schritt für Schritt voranzukommen, habe ich ersteinmal getestet, ob die Header-Informationen auch beim Webserver ankommen.

Das machen Sie!

Wenn man das PHP-Script um folgende Zeilen erweitert (am Anfang)

$headers = apache_request_headers();
 foreach ($headers as $name => $value) {
     echo $name.': '.$value.'\\n';
 }


kann man schön mit weiteren Header-Angaben Experimentieren.

Z.B.: Print HttpAddHeader("Accept-Charset: ISO-8859-1,utf-8")

Soweit - so gut, aber der Body scheint, unabhängig wie er aufgebaut wird, nicht durchzukommen.

Dummerweise unterstützt mein wamp Server die PECL php_http.dll nicht. Die enthält eine Funktion, um sich den Body des Requests mittels http_get_request_body() ausgeben zu lassen.

Aber so ist das. Eigentlich habe ich gerade andere Sorgen, un kann mich jetzt ersteinmal darum kümmern. Grrr.

Beste Grüße
Matthias Griesbach

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: Quellcodes
Autor: Maik Borchardt (---.dip0.t-ipconnect.de)
Datum:   16.06.14 21:12

Hallo Matthias,


bin leider auch noch nicht zum genauer schauen gekommen.....
( :lol::lol::lol::lol: oleeee oleee ole oleee.... :lol::lol::lol::lol: )

bin mal deine INC durch gegangen...

bei Proc HttpSend ist mir etwas aufgefallen

deine PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0,widestring#, 0,0, 0)
kann so auch nicht stimmen....

erwartet wird nach widestring#, die größe von Widestring#
und danach die Totale länge

Zitat:


total_length = strlen(formdata) + filesize + strlen("\r\n------------ThIs_Is_tHe_bouNdaRY_$--\r\n\r\n");


WinHttpSendRequest( hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0,
(LPVOID)formdata, (DWORD)strlen(formdata), total_length, 0 );



also müsstest du noch anpassung vornehmen, in etwa so.....
  Total_length&=i& + filesize& + len("\r\n------------ThIs_Is_tHe_bouNdaRY_$--\r\n\r\n")
  MultiByteToWideChar(1,1,addr(Text$),len(Text$)+1,widestring#,wsize&)
    bResults& = PWinHttpSendRequest(hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0,widestring#, i&,total_length&,0);
 
 
 
 


Xp Home
Profan 9

Nachricht bearbeitet (16.06.14 21:22)

Beitrag beantworten
 
 Re: Quellcodes
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   16.06.14 21:37

Hallo Mike,

den Punkt habe ich auch schon durch.

bResults& = PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0,addr(widestring#), wsize&,wsize&, 0)


Sobald dwOptionalLength und dwTotalLength nur um ein Bayte, bzw. eine Zahl, abweichen, bleibt das Testprogramm hängen.

Vielleicht sollte man die Restriktion in Betracht ziehen, dass eine automatische Vergabe des Userfiles von Browsern geblockt wird, weil sich sich so ferngesteuert ein Datenklau machen ließe.

Ich kann eine x-beliebiege Datei angeben, und diese auf einen Webserver hochladen und dann verarbeiten. Horror - aber genau das brauch ich.

Beste Grüße
Matthias

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: Quellcodes
Autor: Maik Borchardt (---.dip0.t-ipconnect.de)
Datum:   16.06.14 22:04

ich arbeite grad dran... aber mein indianer gib nix her was ankommt....

Aber ich hab einiges schon verändert, nur kommt scheinbar bei mir beim garnichts an....

gib mir etwas Zeit, ;)

Xp Home
Profan 9

Beitrag beantworten
 
 Re: Quellcodes
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   16.06.14 22:48

Hallo Maik,
ich geb Dir alle Zeit der Welt, solange es bis morgen läuft:-P

Im Ernst - Das ist mal wieder so eine Krankheit, die nicht wirklich profan ist, aber doch mit dieser lockeren Gemeinde zusammenhängt.

Brennt es einmal, dann kann man sich nicht auf spontane Hilfe verlassen. Ich bin aber auch so ehrlich, dass ich selber nicht immer spontane Hilfe leiste, wenn es bein einem anderen Profaner gerader brennt, obwohl ich es oft könnte.

Da ist eigentlich Roland gefragt, aber der hat nach vielen Jahren wohl, und das kann ich verstehen, auch kein Bock mehr auf sein Kind. XProfan pupertiert da gerade ein Bisschen zu dolle, obwohl es ein durchaus liebes Kind ist.

Ich fühle mich da jetzt nicht gerade berufen, aber die Xprofan Community sollte doch wieder mit einem "Mehr" auftreten.

Ich kenne so einige Pappenheimer aus diesem Forum schon seit Jahren, rein virtuell, und ich muss gestehen, das da weitaus bessere Programmierer dabei sind, als das, was ich meinen Kunden so als Produkt/Dienstleistung verkaufe.

Xprofan ist einfach zu gut, um neben anderen, teuren, Entwicklungs-Umgebungen den Schwanz einzuziehen.

Stellt euch nur einfach mal vor, was XProfan leisten kann, wenn es den vollen Zugriff auf alle Web-Funktionen hat, also die WinHttp.dll.

Es ist egal, wie schwierig so eine Umsetzung wird, der Nutzen wird fantastisch sein.

Beste Grüße
Matthias

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: Quellcodes
Autor: Maik Borchardt (---.dip0.t-ipconnect.de)
Datum:   16.06.14 23:09

Hallo Matthias,

da gebe ich dir zum Teil schon recht, aber man darf nicht vergessen, dass jeder am ende auch sein eigenes Süppchen kocht, und sicherlich hat der ein oder andere garnicht das bedürfniss irgendwie auf das WEB zu greifen zu wollen/müssen.

Bei mir ist das schon etwas anderes, ich bin eigentlich mehr im Web Tätig und schreibe mir ab und an Profan Programme die mir immerwieder die Arbeit erleichtern sollen.... Sei es DMX steuerung, Midi (bin nebenbei DJ ;) Und beruflich habe ich mir auch diverse Progs geschrieben... aber eben immer für mich allein...

Nun mal zu deiner INC

ich habe beim überarbeiten ein paar sachen verändern müssen....

zum Beispiel diese Proc


  Proc HttpReceiveResponse
    Declare Size&,Downloaded&,Buff#,return$
    Dim Buff#,2048
    bResults& = PWinHttpReceiveResponse( hRequest&, 0)
    CaseNot  bResults& :Return "Receive: "+str$(~GetLastError())'+WinError$(%WinError)
    'Hier soll eigentlich Size& auf die exakte Buffergröße gesetzt werden
    'Klappt aber nicht.
 'Doch jetzt schon..... du darfst die Size& nicht direkt angeben sondern entweder als Addr(Size&) oder eine Bereich# und danach umwandeln
 'also wenn eine API einen Wert zurück geben soll
    PWinHttpQueryDataAvailable( hRequest&, buff#)
    size&=long(buff#,0)
    print "ReadSize:";format$("0",size&);"Byte"
    CLEAR buff#
    PWinHttpReadData( hRequest&, Buff#, Size&, addr(Downloaded&))
 print "DownloadedSize:";format$("0",Downloaded&);"Byte"
    return$=@Char$(Buff#,0,size&)
    Dispose Buff#
    Return return$
 EndProc
 



Ich habe auch noch ein paar andere veränderungen vorgenommen...

Header gibt mir mein Indianer auch bekannt....
Zitat:


Content-Type -> multipart/form-data; boundary=---x3f567b---
User-Agent -> HTTP Profan
Host -> localhost
Content-Length -> 2861
Connection -> Keep-Alive


allerdings ist das file noch nicht gespeichert worden.... das kommt jetzt mal in angriff

Bei Send Request habe ich 2575 Bytes (Header und boundary ect....)

wenn ich dein Originalcode benutze, habe ich garkeinen Header.... :(

Xp Home
Profan 9

Beitrag beantworten
 
 Re: Quellcodes
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   17.06.14 10:54

Hallo Maik,

dank Dir für Dein Bemühen.

Da Size& jetzt den richtigen Wert ermittelt, kann der Buffer auch richtig Dimensioniert werden. Schließlich kann ein Script auch mehr als 2048 Bytes zurückgeben.


Proc HttpReceiveResponse
     Declare Size&,Downloaded&,Buff#,Return$
     bResults& = PWinHttpReceiveResponse( hRequest&, 0)
     CaseNot  bResults& :Return "Receive: "+str$(~GetLastError())'+WinError$(%WinError)
     PWinHttpQueryDataAvailable( hRequest&, addr(size&)) 
     print "ReadSize:";format$("0",size&);"Byte"    
     Dim Buff#,Size&
     PWinHttpReadData( hRequest&, Buff#, Size&, addr(Downloaded&))
     print "DownloadedSize:";format$("0",Downloaded&);"Byte"
     Return$=String$(Buff#,0)
     Dispose Buff#
     Return Return$
  EndProc


Beste Grüße
Matthias

XProfan X2, Windows 7

Beitrag beantworten
 
 Quellcodes - WinHttp Header
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   17.06.14 22:00

Um weitere Funktionen auch mit Header-Daten nutzen zu können, gibt es eine neue WinHttp.ph

Die neuste Version befinden sich immer am Ende dieses Threads.

INTERNET_SCHEME_HTTP                   = 1;
 INTERNET_SCHEME_HTTPS                  = 2;
 INTERNET_DEFAULT_HTTP_PORT             = 80;
 INTERNET_DEFAULT_HTTPS_PORT            = 443;
  
 WINHTTP_NO_PROXY_NAME                  = 0;
 WINHTTP_NO_PROXY_BYPASS                = 0;
 WINHTTP_NO_REFERER                     = 0;
 WINHTTP_NO_HEADER_INDEX                = 0;
 WINHTTP_DEFAULT_ACCEPT_TYPES           = 0;
 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY      = 0;
 WINHTTP_HEADER_NAME_BY_INDEX           = 0;
 WINHTTP_NO_ADDITIONAL_HEADERS          = 0;
 WINHTTP_NO_REQUEST_DATA                = 0;
 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY      = 0;
 
 
 WINHTTP_FLAG_ESCAPE_PERCENT         = $00000004;
 WINHTTP_FLAG_NULL_CODEPAGE          = $00000008;
 WINHTTP_FLAG_ESCAPE_DISABLE         = $00000040;
 WINHTTP_FLAG_ESCAPE_DISABLE_QUERY   = $00000080;
 WINHTTP_FLAG_BYPASS_PROXY_CACHE     = $00000100;
 WINHTTP_FLAG_REFRESH                = $00000100;
 WINHTTP_FLAG_SECURE                 = $00800000;
 
  
 WINHTTP_AUTH_TARGET_SERVER             = 0;
 WINHTTP_AUTH_TARGET_PROXY              = 1;
  
 WINHTTP_AUTH_SCHEME_BASIC              = 1;
 WINHTTP_AUTH_SCHEME_NTLM               = 2;
 WINHTTP_AUTH_SCHEME_PASSPORT           = 4;
 WINHTTP_AUTH_SCHEME_DIGEST             = 8;
 WINHTTP_AUTH_SCHEME_NEGOTIATE          = 16;
  
 WINHTTP_OPTION_REDIRECT_POLICY                         = 88;
 WINHTTP_OPTION_REDIRECT_POLICY_NEVER                   = 0;
 WINHTTP_OPTION_REDIRECT_POLICY_DISALLOW_HTTPS_TO_HTTP  = 1;
 WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS                  = 2;
  
 WINHTTP_QUERY_STATUS_CODE              = 19;
 WINHTTP_QUERY_RAW_HEADERS_CRLF         = 22;
 WINHTTP_QUERY_CONTENT_ENCODING         = 29;
 WINHTTP_QUERY_LOCATION                 = 33;
 WINHTTP_QUERY_FLAG_NUMBER              = $20000000;
 WINHTTP_QUERY_CONTENT_LENGTH           = 5;
  
 WINHTTP_OPTION_USERNAME                = $1000;
 WINHTTP_OPTION_PASSWORD                = $1001;
  
 WINHTTP_FLAG_REFRESH                   = $00000100;
 WINHTTP_FLAG_SECURE                    = $00800000;
  
 WINHTTP_ADDREQ_FLAG_ADD                = $20000000;
 WINHTTP_ADDREQ_FLAG_ADD_IF_NEW         = $10000000;
 
 WINHTTP_RETURNTYPE_MEMORY;
 WINHTTP_RETURNTYPE_FILE;


XProfan X2, Windows 7

Beitrag beantworten
 
 WinHttp Include
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   17.06.14 22:40

Um weitere Funktionen wie HttpQueryHeaders und ReadCSV nutzen zu können, gibt es eine neue WinHttp.inc

Die neuste Version befinden sich immer am Ende dieses Threads.


'Eine Struktur aus der Vorlage, noch nicht Profan angepasst
 'Wird vermutlich nötig, wenn User und Passwort für den Zugriff benötigt werden.
 
 'Structure WinHTTP_ParametersStruc
   'URL.s
  'RequestType.s
   'ReturnHeader.i
  ' UserName.s
  ' Password.s
  ' HeaderData.s
   'OptionalData.s
   'UserAgent.s
  ' CallbackID.i
  ' *CallbackStart
  ' *CallbackProgress
  ' *CallbackEnd
  ' *Memory
  ' FilePath.s
  ' FileBufferSize.i
 'EndStructure
 
 
 'Ein paar Variablen
 Declare WinHttp&,hInternet&, hSession&, hConnect&, hRequest&, bResults&
 
 'Init Prozedur. "P" mit "*" ersetzen, und Zeile Listbox entkommentieren, um alle Funktionen anzusehen
 Proc WinHttpInit
   WinHttp&=ImportDLL("winhttp.dll", "P")
   'ListBox$("Funktionen",1)
 EndProc
 
 'Exit Prozedur
 Proc WinHttpEnd
   FreeDll WinHttp&
 EndProc
 
 'Prozedur zum Starten einer Session
 Proc HttpOpen
   Parameters name$
   Declare ansistring#,widestring#,size&,wsize&,i&,return$
   Return$="Session established"
   size&=Len(name$)+1
   Dim ansistring#,size&
   String ansistring#,0=name$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   hSession& = PWinHttpOpen(Addr(widestring#),~WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,~WINHTTP_NO_PROXY_NAME,~WINHTTP_NO_PROXY_BYPASS,0)
   CaseNot  hSession& :Return$="Session: "+str$(~GetLastError())+" - "+WinError$(%WinError)
   Dispose ansistring#
   Dispose widestring#
   Return Return$
 EndProc
 
 'Prozedur um eine Verbundung zum Webserver (Domain) herzustellen
 Proc HttpConnect
   Parameters name$
   Declare ansistring#,widestring#,size&,wsize&,i&,Return$
   Return$="Connection established"
   size&=Len(name$)+1
   Dim ansistring#,size&
   String ansistring#,0=name$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   hConnect& = PWinHttpConnect(hSession&,addr(widestring#),~INTERNET_DEFAULT_HTTP_PORT, 0)
   CaseNot  hConnect& :Return$="Connect: "+str$(~GetLastError())+" - "+WinError$(%WinError)
   Dispose ansistring#
   Dispose widestring#
   Return Return$
 EndProc
 
 'Prozedur um einen Request zu erstellen.
 Proc HttpRequest
   Parameters verb$, objekt$, types$, Return$
   Declare ansistring#,widestring#,widestring2#,size&,wsize&,wsize2&,i&
   Return$="Request opened"
   size&=Len(objekt$)+1
   Dim ansistring#,size&
   String ansistring#,0=objekt$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)+1
   Dim widestring2#,len(verb$)+1
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   Clear ansistring#
   size&=Len(verb$)+1
   Dim ansistring#,size&
   String ansistring#,0=verb$
   MultiByteToWideChar(1,1,ansistring#,size&,widestring2#,wsize&)
   hRequest& = PWinHttpOpenRequest( hConnect&, addr(widestring2#) ,addr(widestring#),0,~WINHTTP_NO_REFERER,~WINHTTP_DEFAULT_ACCEPT_TYPES,~WINHTTP_FLAG_BYPASS_PROXY_CACHE) '~NULL objekt$ addr(widestring#) addr(widestring2#)
   CaseNot  hRequest& :Return$= "Request: "+str$(~GetLastError())+" - "+WinError$(%WinError)
   Dispose ansistring#
   Dispose widestring#
   Dispose widestring2#
   Return Return$
 EndProc
 
 'Prozedur um dem Request Header Informationen hinzuzufügen
 Proc HttpAddHeader
   Parameters text$
   Declare ansistring#,widestring#,size&,wsize&,i&, Return$
   Return$= "Add Header "+text$
   text$=text$+chr$(13)+chr$(10)
   size&=Len(text$)+1
   Dim ansistring#,size&
   String ansistring#,0=text$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)'+1  
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   CaseNot PWinHttpAddRequestHeaders(hRequest&, addr(widestring#),-1,~WINHTTP_ADDREQ_FLAG_ADD):Return$="AddHeader: "+str$(~GetLastError())+WinError$(%WinError)
   Dispose ansistring#
   Dispose widestring#
   Return Return$
 EndProc
 
 Proc HttpQueryHeaders
   Declare Size&,Downloaded&,Buff#,Return$,i&
   PWinHttpQueryHeaders(hRequest&,~WINHTTP_QUERY_RAW_HEADERS_CRLF,~WINHTTP_HEADER_NAME_BY_INDEX, 0,addr(Size&),~WINHTTP_NO_HEADER_INDEX)
   Dim Buff#, Size&*2
   Print "Get Header -> Size="+str$(Size&)
   bResults& = PWinHttpQueryHeaders(hRequest&,~WINHTTP_QUERY_RAW_HEADERS_CRLF,~WINHTTP_HEADER_NAME_BY_INDEX, Addr(Buff#),addr(Size&),~WINHTTP_NO_HEADER_INDEX)
   CaseNot  bResults& :Return "Headers: "+str$(~GetLastError())+WinError$(%WinError)
   WhileNot i&=Size&*2
     Return$=Return$+Char$(Buff#,i&,1)
     inc i&
   EndWhile
   Dispose Buff# 
   Return Return$
 EndProc
 
 'Prozedur um den Request zu senden
 'Der Body Text wird hier mit übergeben.
 Proc HttpSend
   Parameters Text$
   Declare ansistring#,widestring#,size&,wsize&,i&,Return$
   size&=Len(text$)+1
   Dim ansistring#,size&
   String ansistring#,0=text$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)
   Return$="Send Request "+format$("0",wsize&)+" Byte"
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   bResults& = PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0,addr(widestring#), wsize&,wsize&, 0) '~WINHTTP_NO_REQUEST_DATA addr(widestring#)
   CaseNot  bResults& :Return$="Send: "+str$(~GetLastError())+WinError$(%WinError)
   Dispose ansistring#
   Dispose widestring#
   Return Return$
 EndProc 
 
 'Prozedur um den Request separat mit WinHttpWriteData zu senden
 'Der Body Text wird hier mit WinHttpWriteData übergeben.
 Proc HttpSendAndWrite
   Parameters Text$
   Declare ansistring#,widestring#,size&,wsize&,i&,BytesWritten&,Return$  
   size&=Len(text$)+1
   Dim ansistring#,size&
   String ansistring#,0=text$
   i&=size&*2
   Dim widestring#,i&
   wsize&=(size&*2)
   MultiByteToWideChar(1,1,ansistring#,size&,widestring#,wsize&)
   buffer#=widestring#
   bResults& = PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0,~WINHTTP_NO_REQUEST_DATA, 0,wsize&, 0) '~WINHTTP_NO_REQUEST_DATA addr(widestring#)
   Dispose ansistring#
   Dispose widestring#
   if bResults&
     bResults& = PWinHttpWriteData( hRequest&, addr(buffer#), wsize&, addr(BytesWritten&))
     Return$="Send Request "+format$("0",BytesWritten&)+" Byte"  
     CaseNot  bResults& :Return$="Write: "+str$(~GetLastError())+WinError$(%WinError)
   else
     Return$="Send: "+str$(~GetLastError())+WinError$(%WinError)
   EndIf
   Dispose ansistring#
   Dispose widestring#
   Return Return$
 EndProc
 
 'Prozedur um Darten auf den Webserver zu schreiben
 Proc HttpWriteData
   Parameters file$
   Declare BytesWritten&, Size&, Buff#,Return$
   Size&= FileSize(file$)
   Dim  Buff#, Size&
 
   BlockRead(file$, Buff#, 0, Size&) 
 
   bResults& = PWinHttpWriteData( hRequest&, addr(Buff#), Size&, addr(BytesWritten&))
   CaseNot  bResults& :Return "Write: "+str$(~GetLastError())+WinError$(%WinError)
   Return$= str$(Size&)+" Bytes written"
   Dispose Buff#
   Return Return$
 EndProc
 
 'Prozedur, um eine CSV-Datei einzulesen, und dem Body hinzuzufügen
 Proc ReadCSV
   Parameters file$
   Declare BytesWritten&, Size&, Buff#, Return$
   Size&= FileSize(file$)
   Dim  Buff#, Size&
   BlockRead(file$, Buff#, 0, Size&) 
   Return$=String$(Buff#,0)
   Dispose Buff#   
   Return Return$
 EndProc
 
 'Prozedur um die Antwort des Servers zu verarbeiten
 'Die Größe des Buffers beruht nur auf einer Annahme.
 Proc HttpReceiveResponse
     Declare Size&,Downloaded&,Buff#,Return$,Ansi#,wsize&
     bResults& = PWinHttpReceiveResponse( hRequest&, 0)
     CaseNot  bResults& :Return "Receive: "+str$(~GetLastError())'+WinError$(%WinError)
     PWinHttpQueryDataAvailable( hRequest&, addr(size&)) 
     print "ReadSize:";format$("0",size&);"Byte"    
     Dim Buff#,Size&
     PWinHttpReadData( hRequest&, Buff#, Size&, addr(Downloaded&))
     print "DownloadedSize:";format$("0",Downloaded&);"Byte"
     Return$=String$(Buff#,0)
     print "Return: "+str$(len(Return$))
     Dispose Buff#
     Assign #1,"C:\\Kylt PCR\\outfile.txt"
   Rewrite #1
   Print #1, Return$
   Close #1
     Return Return$
  EndProc
 
 'Prozedur um alle HInternet Handels freizugeben.
 Proc HttpClose
   Case hRequest& : PWinHttpCloseHandle(hRequest&)
   Case hConnect& : PWinHttpCloseHandle(hConnect&)
   Case hSession& : PWinHttpCloseHandle(hSession&)
 EndProc


XProfan X2, Windows 7

Beitrag beantworten
 
 Re: WinHttp Include
Autor: Maik Borchardt (---.dip0.t-ipconnect.de)
Datum:   17.06.14 23:12

Nabend,

bin grad zur tür rein....

lieber Matthias,....

bitte überarbeite deine Include doch nochmal richtig

bei Bereichs# variablen brauchst keine Addr(bereich#) dort genügt die Bereich# allein, bei allen anderen Variablen ist der pointer also die Addr(Vaiable$!%&) zu verwenden...

insbesondere auf die WideString.... konvertierung habe ich in der INC

Declare widestring# ' Global gemacht

Verzichte auf Ansistring# weil verwendung findet addr(text$) und len(text$)
i& und Wsize& fallen auch weg... eben wegen direkt abfrage
wie
sizeof(widestring#)



dann in den procs einfach
Dim widestring#,Len(text$)*2+1
MultiByteToWideChar(1,1,addr(text$),len(text$),widestring#,sizeof(widestring#))

Jeweiliger befehl für WinHttp.... wo Widestring# benötig wird

anschließend
Freigeben mit Dispose WideString#

Beispiel
  Proc HttpRequest
    Parameters verb$, objekt$
    Dim widestring#,Len(objekt$)*2+1
   MultiByteToWideChar(1,1,addr(objekt$),Len(objekt$)+1, widestring#, SizeOf(widestring#))
 
    Case verb$="":verb$="GET"
    Dim widestring2#,Len(verb$)*2+1
    MultiByteToWideChar(1,1,addr(verb$),len(verb$)+1, widestring2#, SizeOf(widestring2#))
 
    hRequest& = PWinHttpOpenRequest( hConnect&, widestring2# ,widestring#,0,0,~WINHTTP_DEFAULT_ACCEPT_TYPES,0)
    Dispose widestring#
    Dispose widestring2#
    CaseNot  hRequest& :Return "Request: "+str$(~GetLastError())+" - "'+WinError$(%WinError)
    Return "Request opened"
  EndProc
 


Ich empfinde es am ende Übersichtlicher bei der Fehlersuche....
Sind sicherlich nur vorschläge.

Beim überfliegen fallen mir leider immerwieder kleinigkeiten auf...
siehe...

 Proc HttpSendAndWrite
 ......
  Dispose ansistring#
    Dispose widestring#
    if bResults&
 ........
    EndIf
    Dispose ansistring#
    Dispose widestring#
    Return Return$
 


Warum 2 mal Dispose???? usw....


Ich weiß nicht in wie weit du die alte Inc Überarbeitet hast...
dort sind mir zum Teil RETURN vor Dispose aufgefallen, die nie greifen würden ect....


in deiner INC steckt leider eine ganze menge dieser kleine Fehlerteufel....

Sorry, ist nicht böse gemeint

Xp Home
Profan 9

Beitrag beantworten
 
 WinHttp.dll gibt Antworten
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   17.06.14 23:39

Nach vielen Variationen der Header und Body Daten, speichert mir der Idianer (Apache) die Daten noch immer nicht.

Die Kommunikation zwischen XProfan, der WinHttp.dll, und dem wamp Server, ist inzwischen sehr stabil, nutzt aber für mein Begehren nicht.

Ein Blick in die Log-Files (access.log) des Webservers sagt, dass das Test Programm die richtige Anfrage stellt.

127.0.0.1 - - [14/Jun/2014:16:37:00 +0200] "POST /kylt/PCR_Upload.php HTTP/1.1" 200 265


Auch das Log-File für die Fehler (apache_error.log) zeigt was ist:
[Fri Jun 13 17:35:36 2014] [error] [client 127.0.0.1] PHP Notice:  Undefined index: userfile in C:\\Program Files\\wamp\\www\\kylt\\PCR_Upload.php on line 4


Ebenso die Antwort des Indianers ist korrekt:
HTTP 1.1/ 200 OK


Auch der Aufbau des Bodys entspricht den Vorgaben.

Teste ich das ganze aber dann mit einem Webserver im Internet, dann erhalte ich eine
HTTP 1.1/ 403 Forbidden
Nachricht. Das ist ok, und sollte auch so sein, weil man sonst auf diesem Wege sich z.B. ein lokales Outlook Postfach File auf den Webserver ziehen könnte. Die NSA lässt grüssen.

Aber Browser können den Transfer auch, und mit einem lokalen Formular klappte der Upload ebenfalls.

Das muss doch irgentwie auch direkt machbar sein.

Gruß
Matthias

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: WinHttp.dll gibt Antworten
Autor: Maik Borchardt (---.dip0.t-ipconnect.de)
Datum:   17.06.14 23:48

laut meiner

php....


<?php
echo "-----------apache_request_headers------\r\n";
$head=apache_request_headers();
foreach($head as $k=>$v) echo $k . ' -> ' . $v."\r\n";
echo "-----------apache_response_headers------\r\n";
$head=apache_response_headers();
foreach($head as $k=>$v) echo $k . ' -> ' . $v."\r\n";
echo "----------------POST-------------------\r\n";
foreach($_POST as $k=>$v) echo $k . ' -> ' . $v."\r\n";
echo "----------------GET--------------------\r\n";
foreach($_GET as $k=>$v) echo $k . ' -> ' . $v."\r\n";
echo "----------------REQUEST----------------\r\n";
foreach($_REQUEST as $k=>$v) echo $k . ' -> ' . $v."\r\n";
echo "---------------------------------------------\r\n";


Hier mal meine Info vom Server!
 -----------apache_request_headers------
 Content-Type -> multipart/form-data; boundary=x3f567b
 User-Agent -> HTTP Profan
 Host -> localhost
 Content-Length -> 2876
 Connection -> Keep-Alive
 -----------apache_response_headers------
 X-Powered-By -> PHP/5.4.19
 ----------------POST-------------------
 ----------------GET--------------------
 TestGet -> GetTest
 ----------------REQUEST----------------
 TestGet -> GetTest
 ---------------------------------------------
 Notice :  Undefined index: userfile in var/www/vhosts/testpage/upload.php on line 19
 


Line 19 ist einfach nur der zugriff auf das FileArray..


Es gibt überhaupt keinem POST das beim PHp Script ankommt, ein Anhängen von ?testGet=Gettest
an die phpurl im xprofan kommt zummindest das GET an...

somit kann auch dein Webserver...

Xp Home
Profan 9

Nachricht bearbeitet (18.06.14 00:02)

Beitrag beantworten
 
 Re: WinHttp Include
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   18.06.14 00:18

Hallo Maik,

solange ich mit Variablen und Bereichen teste, ist es einfacher, addr() zu verwenden. Laut Profan-Hilfe macht es keinen Unterschied. Langfristig muss das aber weg, da hast Du recht.

Das ganze Thema MultiByteToWideChar sollte eine extra Proc bekommen, auch anders herum, wenn man HttpQueryHeaders, u.A. vernünftig nutzen will.

Solange mein Indianer (wamp) mein POST Request abe nicht annimmt, muss ich mir diese Feinheiten noch nicht aufhalsen.

Bei ein paar Versuchen mit verschiedenen Headern wie:

multipart/form-data

multipart/mixed

application/x-www-form-urlencoded


kamen die Daten aus der CSV-Datei teilweise an, und wurden im Response mit ausgegeben.

So wie es scheint, hapert es nicht an der Übertragung, sondern an der ordnungsgemäßen Verabeitung seitens PHP/Apache.

Obwohl die Datenübergabe als

127.0.0.1 - - [14/Jun/2014:16:37:00 +0200] "POST /kylt/PCR_Upload.php HTTP/1.1" 200 265


erfogt, gibt PHP keine $_POST Daten aus.

foreach ($_POST as $name => $value) {
     echo $name.': '.$value.'\\n';
 }


Ich stehe da wirklich auf dem Schlauch, und sehe den Wald vor lauter Bäumen nicht, -- Grrgh Boundary

Beste Grüße
Matthias

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: WinHttp.dll gibt Antworten
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   18.06.14 00:50

Genau das ist das Problem. Es kommen keine POST Dateb an.

Auch wenn der ApacheServer
127.0.0.1 - - [14/Jun/2014:16:37:00 +0200] "POST /kylt/PCR_Upload.php HTTP/1.1" 200 265

korrekt notiert, kann PHP damit nichts anfagen.

Selbst die verschiedenen Versuche, den BODY passend zu bestücken, sprich das Boundary Tag, Header Infos/Typen, scheinen nicht durchzukommen.

Mit einem entsprechenden Formular im IE, Google Crome, klappt es ohne Probleme. Das CSV-Fiele landet im richtigen Verzeichnis, und auch die anderen Daten des Formulars werden in $_POST bestückt.

Die WinHtp.dll muss das doch auch können!

Beste Grüße
Matthias

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: WinHttp.dll gibt Antworten
Autor: Florian Heuberger (62.159.118.---)
Datum:   18.06.14 12:46

ini_set('default_charset', 'UTF-8');

if ($_POST["POSTÜBERGABE"] == utf8_encode("ARGUMENT"))
{
}

So frage ich meine PHP-POSTS ab. oft liegt es gar nicht an der Sprache, sondern am Server/PHP.

Versuch das mal!

MfG

----------------------------------------
FLOGERSOFT - Die Taschenlampe für ihr Windows Phone!
Zur Homepage
CATS INVASION - Das Actionspiel für zwischendurch! Kostenlos.. und für ANDROID! -> im Play Store


Beitrag beantworten
 
 WinHttp.dll öffentlicher Testserver
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   20.06.14 10:12

Für alle die keinen eigenen Apache Webserver zur Verfügung haben, gibt es einen öffentlichen Server, mit dem man die Übertragung eines Post Request ausprobieren kann.

http://www.posttestserver.com/

Wie beim localen Apache klappt die Kommunikation zwischen XProfan, WinHttp.dll und dem Server, nicht aber die übergabe des Bodys / der Daten.

Gemeldet wird,
Zitat:

es wurden 0 Bytes übertragen


Aufgefallen ist mir folgendes. Übertrage ich die Datei aus dem Browser, ist die Content-Length= 6920 Bytes.

Der Unicode Body hier im Test hat 13088 Bytes. Wandel ich nicht in Unicode um und übergebe den Body String sind es 6544 Bytes.

Beides kommt nicht durch, und wird von der Dll auch nicht versendet. Das habe ich mit dem RawCap Sniffer getestet.

Hier greift wohl der Umstand, das der übergeben Wert für die Größe der Daten nicht richtig (valide) ist, und somit keine Daten gesendet werden.
Zitat:

dwOptionalLength [in]
An unsigned long integer value that contains the length, in bytes, of the optional data. This parameter can be zero if there is no optional data to send.

This parameter must contain a valid length when the lpOptional parameter is not NULL. Otherwise, lpOptional is ignored and set to NULL.

Vielleicht liegt es aber auch an dem Umstand, das XProfan keine unsigned long integer Variablen kennt.

Man kann rein vom Wert her eine Uint simulieren,
Declare Var#
   Struct Bereich = UInt&
   Dim Var#, Bereich
   Var#.Uint&=4294967295
   Print Var#.Uint&
   Print LoWord(Var#.Uint&)
   Print HiWord(Var#.Uint&)

Ob diese Konstrukt aber eine echte Uint an die Dll weiterreicht, weiß ich auch nicht.

Soweit mal zum aktuellen Stand.

Beste Grüße
Matthias

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: WinHttp.dll öffentlicher Testserver
Autor: Maik Borchardt (---.dip0.t-ipconnect.de)
Datum:   21.06.14 00:30

Nabend....

ich war die tage etwas am Tüfteln....

Irgendwie wurmt mich das ja auch....

also hab ich mir nen Code besorgt der funktionier....mit AutoIt....
Autoit installiert... Code geladen URL und File Angepasst und mir mal das ganze reingezogen....
1. Versuch: hat geklappt... Mein Server Speichert die Datei vollständig und meldet entsprechende $_GET, $_POST usw.... alls super....

2. Versuch: URL zum posttestserver.com/post.php
ups.... der sagt mir das der Content 0 Byte gewesen sei keine $_POST vorhanden.... seltsam.....

3. Versuch: auf einen anderen Webspace im WEB.... wie 1.Versuch erfolgreich

4. Versuch: wieder alles local...
Wie schaut der header aus?
 multipart/form-data; boundary="123456712534761"

Wie schaut der Body aus?
 --123456712534761
 Content-Disposition: form-data; name="inputfeld"
 
 irgend ein text
 --123456712534761
 Content-Disposition: form-data; name="fileupload"; filename="c:\\test.txt"
 Content-Type: application/octet-stream
 
 1. Zeile
 2. Zeile
 3. Zeile
 letzte Zeile
 --123456712534761--
 
 

(am ende sind wirklich 2 leer Zeilen, das Boundary besteht in der erzeugung nur aus den Zahlen, die -- werden offenbar selbst angehängt)

Aber der Body wird so nicht geschickt.... er wird mittels StringToBinary(Body$) gewandelt....
und schaut dann so aus....
Fett=Boundary
Unterstrichen=Umbruch
Zitat:


0x2D2D3132333435363731323533343736310D0A436F6E74656E742D446973706F736974696F6E3A20666F726D2D646174613B206E616D653D22696E70757466656C64220D0A697267656E642065696E207465787 40D0A2D2D3132333435363731323533343736310D0A436F6E74656E742D446973706F736974696F6E3A20666F726D2D646174613B206E616D653D2266696C6575706C6F6164223B2066696C656E616D653D22633A 5C5C746573742E747874220D0A436F6E74656E742D547970653A206170706C69636174696F6E2F6F637465742D73747265616D0D0A0D0A312E205A65696C650D0A322E205A65696C650D0A332E205A65696C650D0 A6C65747A7465205A65696C650D0A2D2D3132333435363731323533343736312D2D0D0A0D0A


also Byte für Byte in Hex$ wandeln und ein 0x vorn dran....

hab ich also alles soweit gemacht in Profan... aber da geht garnix bei keinem Server

Also nochmal alles in Widestring und dann in Hex.... das ist jetzt mein Stand der Dinge den ich aber erst morgen angehen kann...

Dachte nur das vielleicht die Erkenntniss, bzw. ein funktionierender Header und Body bekannt ist, vielleicht weiterhilft....

Gute Nacht

Xp Home
Profan 9

Nachricht bearbeitet (21.06.14 00:33)

Beitrag beantworten
 
 Content-Type: application/x-www-form-urlencoded
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   23.06.14 11:33

Ein kleiner Erfolg.
Mit dem Header Content-Type: application/x-www-form-urlencoded
Print HttpAddHeader("Accept: text/html, text/csv, */*\nAccept-Charset: ISO-8859-1,utf-8")
 Print HttpAddHeader("Content-Type: application/x-www-form-urlencoded; Charset: utf-8;")

kommen Dateien beim Webserver an, wenn man als Body
Body$="userfile=datei.name&data="

nimmt, und den Inhalt der Datei als ByteString (%21%86 etc.) anhängt.

Proc ByteString
   Parameters text$
   Declare i&, count&, new$, tmp$
   i&=len(text$)
   WhileLoop 1,i&
     tmp$=hex$(ord(mid$(text$,&loop,1)))
     Case len(tmp$)<2:tmp$="0"+tmp$
     new$=new$+"%"+tmp$
   
   EndWhile
   Return New$
 EndProc


Das klappt mit Textdateien, etc.
Bei binären Dateien wei Bilder hilft dann folgende Proc
Proc ReadBmp
   Parameters file$
   Declare BytesWritten&, Size&, Buff#, Return$, new$,tmp$,i&
   Size&= FileSize(file$)
   Dim  Buff#, Size&
   BlockRead(file$, Buff#, 0, Size&)
   WhileLoop 0,Size&
     tmp$=hex$(ord(CHar$(Buff#,&loop,1)))
     Case len(tmp$)<2:tmp$="0"+tmp$
     new$=new$+"%"+tmp$
   EndWhile  
   Dispose Buff#   
   Return New$
 EndProc


HttpSend kommt dann ohne Bereichsvariable aus und überträgt den Body sammt ByteString ohne murren. Der String muss auch nicht in einen WideString umgewandelt werden.

Proc HttpSend
   Parameters Text$
   Declare Size&, Return$
   Size&=(Len(Text$)+0)'*2
   Return$="Send Request "+format$("0",size&)+" Byte"  
   bResults& = PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0, Addr(Text$), Size&, Size&, 0) '~WINHTTP_NO_REQUEST_DATA addr(widestring#)
   CaseNot  bResults& :Return$="Send: "+str$(~GetLastError())+WinError$(%WinError)
   Return Return$
 EndProc 


Einziger Wermutstropfen ist die Beschränkung der Dateigröße. Ein BMP mit 4kB kommt ganz an, einer CSV-Datei mit 6kB fehlen am Ende einige Zeilen.

Hier noch das PHP-Script für den Server
<?PHP
 ini_set('default_charset', 'UTF-8');
 
 Echo 'Headers ->';
 $headers = apache_request_headers();
 foreach ($headers as $name => $value) {
     echo $name.': '.$value.'\\n';
 }
 
 $file = $_POST["userfile"]; 
 $somecontent = print_r($_POST["data"], TRUE); 
 $fp = fopen($file, 'w') or die('Could not open file!'); 
 fwrite($fp, $somecontent) or die('Could not write to file'); 
 fclose($fp); 
 
 Echo 'userfile='.$_POST["userfile"].'\n';
 Echo 'data='.$_POST["data"].'\n';
 ?>


Die Funktion WinHttpSendRequest aus der WinHttp.dll geht also mit Profan.
Für den Header Content-Type: multipart/form-data muss das auch noch irgendwie gehen.

Richtiger Body aufbau, und die exate Länge, dann sollte das klappen.

Beste Grüße
Matthias Griesbach

XProfan X2, Windows 7

Beitrag beantworten
 
 Re: Content-Type: application/x-www-form-urlencoded
Autor: Maik Borchardt (---.dip0.t-ipconnect.de)
Datum:   23.06.14 16:46



ein gedanke...

hast du kein boundary mehr in verwendung???

soweit ich mich durchwuschel ist immer eins gefordert....

beim ersten Bekanntgeben ist doch auch der Content-Typ mit zu schicken
ist das da auch der gleiche wie beim AddHeader???

Und dann muß, soweit ich weiß, bzw. glaube zu wissen in der Zeile

 bResults& = PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0, Addr(Text$), Size&, Size&, 0)


das Zweite Size& eine Summe der kompletten daten sein...

Also nicht nur des Contents sonder auch der Header+FileLen....

ggf. muß die Länge des StringToBinary auch angepasst werden
der String ist zwar Len(Body$) aber daten sind es dann ja nur Durch 3...

wegen dem % vor jedem Byte.... ist halt nur so ein gedanke... aber sicherlich bist du da auch schon dran rum gebastelt....

Xp Home
Profan 9

Beitrag beantworten
 
 Re: Content-Type: application/x-www-form-urlencoded
Autor: Matthias Griesbach (---.customers.d1-online.com)
Datum:   23.06.14 18:52

Hallo Mike,

das boundary ist nur bei Content-Type: multipart/form-data notwendig, um die Multiparts, also verschiede Inhalte, voneinander trennen zu können. Z.B. 3 Bilder in einem Rutsch hochladen.

Jepp - der Content-Type im Header entscheidet, wie der Body zu gestallten ist.

Bei application/x-www-form-urlencoded ist es einfach nur ein URI mit den ganzen Daten.

Bei multipart/form-data ist es dann der Body innert eines boundary

Mit der Size habe ich auch viel probiert. Die Bytes vom Header dazu addiert etc. Sobald die Werte aber nicht gleich waren, blieb mir das Programm hängen.

Soweit ich das richtig verstanden habe, ist die Angabe TotalLength das, was dann dem Header als Content-Length hinzugefügt wird.

Also Content-Length => Body


Gerade nochmal das Multiform mit folgendem Body getestet:

Body$="--7deb41813115a2\n"
 Body$=Body$+"Content-Disposition: form-data; name=\quserfile\q; filename=\qkylt-export.csv\q\n" 
 Body$=Body$+"\n--7deb41813115a2\n"
 Body$=Body$+ReadCSV("C:\\Kylt PCR\\kylt-export.csv")+"\n"
 Body$=Body$+"--7deb41813115a2--\n"


Im Header die beiden -- beim boundary weggelassen

Print HttpAddHeader("Content-Type: multipart/form-data; Charset: utf-8; boundary=7deb41813115a2")


Klappt :-)
Gleiche SendRequest Proc wie im letzen Beispiel

Proc HttpSend
   Parameters Text$
   Declare Size&, Return$
   Size&=Len(Text$)
   Return$="Send Request "+format$("0",size&)+" Byte"  
   bResults& = PWinHttpSendRequest( hRequest&,~WINHTTP_NO_ADDITIONAL_HEADERS,0, Addr(Text$), Size&, Size&, 0) '~WINHTTP_NO_REQUEST_DATA addr(widestring#)
   CaseNot  bResults& :Return$="Send: "+str$(~GetLastError())+WinError$(%WinError)
   Return Return$
 EndProc 


Bittte mal testen.

Beste Grüße
Matthias Griesbach

Edit: Natürlich erstmal nur mit Text/CSV Dateien.

XProfan X2, Windows 7

Nachricht bearbeitet (23.06.14 18:58)

Beitrag beantworten
 
 Re: Quellcodes
Autor: Stephan Sonneborn (80.156.199.---)
Datum:   21.11.19 15:14

Hallo Matthias,

ich stehe aktuell vor dem Problem, dass ist Messdaten von einer IP-Adresse
laden möchten. Um die Messung aber erst mal zu starten, muss ich den Befehl
"http:\\192.168.0.xxx\meine_messung.html?starten" per http get abschicken,
hat man mir gesagt.

Bin leider nicht firm in HTML.

Kann ich das mit deiner Routine machen?
Ich hab da was von HTTPRequest gesehen und von einer Get-Methode...

Welches ist die aktuelle Version?

Vielen Dank im Voraus!

Schöne Grüße aus Wittgenstein von
Stephan

Programmierumgebung:
| XProfan 11.2 | Win7 32 Bit | WinXP Home | AMD Athlon 2400+ | Intel P4 3,4 GHz |

Beitrag beantworten
 Foren-Liste  |  Baumstruktur   Neuerer Beitrag  |  Älteres Thema 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org