interne funktion aus filterrequest

Xb2.Net von Boris Borzic

Moderator: Moderatoren

Antworten
Elvis
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 34
Registriert: Mi, 13. Dez 2006 11:00
Wohnort: Hamburg

interne funktion aus filterrequest

Beitrag von Elvis »

Hallo,

ich spiele mal wieder etwas mit dem xb2.net rum und habe da ein kleines Problem.

Ich möchte beim aufruf dieser Seite
laser-plus.com/drucker_test
intern den Aufruf abfangen und dann die Funktion prodinfo3 aufrufen.

Das habe ich über den Filterrequest gelöst, aber ich ich bekommen den Aufruf irgendwie nicht durch.

So sieht mein code im filterrequest aus

Code: Alles auswählen

if corigPath = "/drucker_test" 
		 cWebFunction := 'prodinfo3'
		 cPath := "/" + cWebFunction
		 oClient:HTTPRequest:setVar('artnr','18365')
		 oClient:HTTPRequest:Path(cPath)		   		   
		 return .T.
		 endif
Alledring bekomme ich immer einen Access Error bzw. Bad http Request im log.
= ACCESS ERROR ==========
Date: 20210218 23:58:18, IP: 149.224.149.180
Bad HTTP request:
GET /prodinfo3?artnr=18365 HTTP/1.1
Host: www.laser-plus.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cookie: _SID=37%2A7883561; _ga=GA1.2.1488836633.1613681763; _gid=GA1.2.1060471996.1613681763; selectedOpt=

Ich habe schon alles mögliche probiert und habe mich auch an einen alten Post von Martin gehalten, bei dem es Anscheinend geklappt hat, aber bei mir leider nicht.

Ich habe auch mal diese Zeile mit eingebungen

Code: Alles auswählen

oClient:HTTPRequest:StartLine += "?"
Das hat leider auch nicht geholfen.

Irgendwie scheint die Anfrage nicht richtig in den HTTPHandler zu laufen.

Vielleicht habt Ihr eine Idee. Oder jemand hat schon auf eine andere Weise Webseiten ohne .html eingebunden. Tipps wäre klasse

Gruß

Rene
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: interne funktion aus filterrequest

Beitrag von Martin Altmann »

Moin Rene,
bist Du Dir sicher, dass die Ursache im filterrequest liegt? Sieht für mich soweit OK aus (vorausgesetzt du gibst am Ende der Funktion immer ein .t. zurück und nur in besonderen Fällen ein .f.).
Wie sieht denn Dein :onPost/:onGet aus (bzw. die dort aufgerufene Funktion)? Wie übergibst Du Deinen Parameter beim Umwandeln an die eigentliche Funktion prodinfo3?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: interne funktion aus filterrequest

Beitrag von ramses »

Hast du deine Funktion als "Web-Funktion" angelegt? Du kannst über HTTP nur speziell markierte Funktionen aufrufen.
Also so:
Function WEB_prodinfo3()
Valar Morghulis

Gruss Carlo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: interne funktion aus filterrequest

Beitrag von Martin Altmann »

Wobei Web_ als Präfix nicht vorgeschrieben ist (ist der default - man kann es auch ändern oder ganz weglassen).
Ist ein Feature von Boris - hat man nichts an der entsprechenden Konfiguration geändert, lautet der Präfix WEB_

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: interne funktion aus filterrequest

Beitrag von ramses »

Hallo Martin

den Präfix wegzulassen ist dann aber wie eine brennende Zündschnur ...... eröffnet dies doch die Möglichkeit in einem Request jede beliebige Funktion aufzurufen .....
Valar Morghulis

Gruss Carlo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: interne funktion aus filterrequest

Beitrag von Martin Altmann »

Schon klar :!:
Ich wollte auch nicht davon abraten, sondern nur darauf hinweisen, dass nicht zwangsweise WEB_ davor stehen muss!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: interne funktion aus filterrequest

Beitrag von Tom »

Wenn man allerdings von Boris' Beispielen abgeleitet hat und die Direktiven (WEBPROCEDURE/WEBPROC) verwendet, hat man das automatisch.
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: interne funktion aus filterrequest

Beitrag von Martin Altmann »

Sofern man nicht den HTTPHandler anpasst - ja!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Elvis
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 34
Registriert: Mi, 13. Dez 2006 11:00
Wohnort: Hamburg

Re: interne funktion aus filterrequest

Beitrag von Elvis »

Moin,

danke für die schnellen Antworten.
Ich habe vielleicht etwas untertrieben, als ich gesagt habe ich spiele damit etwas rum.
Es ist der 2 Webshop und das Drittte umfangreiche Update von einem 8)

Die Funktion existiert und läuft ganz normal, ich benutze diese sehr häufig direkt aus dem Browser
So sieht die URL aus.
https://www.laser-plus.com/prodinfo3?artnr=18365
Die Parameter werden normal via getvar übergeben.

Es scheint gar nicht erst im HTTPHandler zu landen, sondern im :Onnotfound.

Folgendes scheint vermutlich der Weg durch das prg zu sein.

Da es kein GET oder POST request ist, geht es auch nicht in den HTTPHandler.
Daher bekomme ich einen Bad HTTP request, weil die angeforderte Datei drucker_test nicht exisitert.

Wenn ich diese Zeile im filterrequest hinzufüge

Code: Alles auswählen

oClient:HTTPRequest:StartLine += "?"
Dann wird wohl für das prg daraus ein GET request und läuft korrekt in den HTTPHandler.

Wenn ich im HTTPHandler allerdings httprequest:path() abfrage, dann ist der Inhalt /drucker_test

Es scheint also :path wird nicht richtig überschrieben oder irgendwo zurückgesetzt. Da bin ich dann wieder mit meinem Latein am Ende.

Kurze Info zur Umgebung, wir verwenden noch die XB2.net Version 1.9

Gruß

Rene
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: interne funktion aus filterrequest

Beitrag von Martin Altmann »

Wie sieht denn Dein httphandler aus?
drucker_test ist bei Dir doch eine funktion (namens WEB_drucker_test() ) - richtig?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Elvis
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 34
Registriert: Mi, 13. Dez 2006 11:00
Wohnort: Hamburg

Re: interne funktion aus filterrequest

Beitrag von Elvis »

Hallo Martin,

ich vergleiche mal meinen HTTP Handler mit einem aktuellen von Boriz, danke für den Hinweis.

Nein /drucker_test gibt es nicht als funktion oder als webpage. Es ist ein fiktiver Name.

Derzeit sieht ein call auf meiner Website so aus:
https://www.laser-plus.com/prodinfo3?artnr=18365
Artnr ist meine Artikelnummer, also etwa 60k verschiedene Artikel möglich.

Das ist aber google Suche technisch schwach.
Daher möchte ich das optimieren und "virtuelle" Websiten erstellen, die im Hintergrund dann zusammen gebastelt werden und dann an den Client übertragen

Der oben genannte Link wird in Zukunft (sofern ich es lösen kann) so lauten
https://www.laser-plus.com/brother_tn2220
Im filterrequest wird das dann abgefangen und daraus "/prodinfo3?artnr=18365" gemacht.

Aber wie gesagt klappt es noch nicht ganz.

Gruß

Rene
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: interne funktion aus filterrequest

Beitrag von Martin Altmann »

Achso!
Gut, dann musst Du einfach in Deiner httphandler testen, ob es sich bei den Angaben um eine vorhandene Funktion handelt oder um eine vorhandene Seite im Filesystem.
Falls beides nicht der Fall ist, musst Du die Anfrage entsprechend umstricken auf prodinfo3 und den passenden Parametern.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: interne funktion aus filterrequest

Beitrag von ramses »

Hallo Rene

das geht schon. Aber du musst im Filterblock alle Variablen in oClient:HTTPRequest so bearbeiten dass diese und die Parameter deiner gewünschten Funktion entsprechen. Nur ein ? an die Startlinie anzufügen reicht nicht da ganz und gar nicht mehr.

Weil das ganze HTTPRequest Objekt bereits bestückt ist und die Verarbeitung (xbHTTPThread:Execute()) bereits schon läuft.
Valar Morghulis

Gruss Carlo
Elvis
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 34
Registriert: Mi, 13. Dez 2006 11:00
Wohnort: Hamburg

Re: interne funktion aus filterrequest

Beitrag von Elvis »

Hallo Carlo,

danke für den Hinweis. So etwas habe ich mir schon gedacht.
Hast Du einen Tipp für mich, wo ich herausfinden kann was ich alles anpassen müsste?

Gruß

Rene
Elvis
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 34
Registriert: Mi, 13. Dez 2006 11:00
Wohnort: Hamburg

Re: interne funktion aus filterrequest

Beitrag von Elvis »

Yuhuu!!

Teilweise geschafft.

Als ich HTTP:Request:Startline mit einer komplett angepassten Startline überschrieben habe, öffnet sich zumindet jetzt korrekt die über die Funktion angesteuerte Seite.

Startline vorher GET /drucker_test HTTP/1.1.
Startline verändert GET /prodinfo3?artnr=18365

Warum?!? Keine Ahnung. Ich schreibe mal eine Message in Boris Forum, eventuell kann er mehr Hintergrundinfos dazu geben.
Ich schreibe das dann auch hier rein.

Vielen Dank für die ganzen Hinweise

@Martin Ich habe mir die neue prg von Boris geholt, aber der HTTPHandler ist jetzt nicht mehr Teil der offnen prg. Man kann nur noch einen komplett eigenen machen.

schönes Wochenende

Rene
Zuletzt geändert von Elvis am Di, 23. Feb 2021 13:16, insgesamt 1-mal geändert.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: interne funktion aus filterrequest

Beitrag von ramses »

Hallo Rene

angenommen ich will den Aufruf /test auf /dologin?USER=plant&PSW=plant umleiten geht dies im Filtercodeblock mit:

Code: Alles auswählen

 
          oClient:HTTPRequest:path      := strtran( oClient:HTTPRequest:path, "/test", "/dologin" )
          oClient:HTTPRequest:dpath     := strtran( oClient:HTTPRequest:dpath, "/test", "/dologin" )
          oClient:HTTPRequest:Message   := strtran( oClient:HTTPRequest:Message, "/test", "/dologin?USER=plant&PSW=plant" )
          oClient:HTTPRequest:startline := strtran( oClient:HTTPRequest:StartLine, "/test", "/dologin?USER=plant&PSW=plant" )
          oClient:HTTPRequest:eQuery    := "USER=plant&PSW=plant"
          oClient:HTTPRequest:setVar("USER","plant")
          oClient:HTTPRequest:setVar("PSW","plant")
Damit sind etwa alle nötigen Felder gefüllt.
Valar Morghulis

Gruss Carlo
Elvis
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 34
Registriert: Mi, 13. Dez 2006 11:00
Wohnort: Hamburg

Re: interne funktion aus filterrequest

Beitrag von Elvis »

Hallo Carlo,

vielen Dank.

zusätzlich hat Boris mir folgendes geschrieben:

The server needs to determine if the request is dynamic (eg. a function
call) or static (eg. a file). The following make the request dynamic:

- the :HttpRequest:StartLine contains a question mark "?"
- the :Path is empty and no index file is defined
- the :Path ends with ".PRG" or ".DLL"
- the :Path contains brackets "(" and ")"

Vielen Dank für Eure ganze Hilfe

Rene
Antworten