Page 2 sur 2

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 18:08
par Marc56
Effectivement, ça complique. De plus il est possible que le PHP fasse d'autres vérifications avant d'accepter le fichier.

Autre solution: As-tu essayé avec Curl ? (à invoquer avec RunProgram)

Re: Communiquer avec un formulaire

Publié : mar. 10/janv./2023 21:09
par Bmld76
Merci, je vais regarder.

[RESOLU] Communiquer avec un formulaire

Publié : jeu. 19/janv./2023 13:02
par Bmld76
Bonjour,

Après de nombreuse recherches et de lecture de doc, j'ai sortie l'artillerie soit Postman, pour la création de requêtes et Wireshark pour capturer la communication.

Sur les forum purebasic, j'ai trouvé des pistes, mais rien ne fonctionnait avec PB 6.0.
Avec Postman, j'ai validé la structure de la métope POST. Il la présente dans la console au format raw, c'est très pratique
Avec Wireshark, J'ai observé que SendNetworkData ouvre une connexion TCP mais ne fait pas de transmission HTTP d'ou l'erreur en réponse.
La solution, Je l'ai remplacé par SendNetworkString qui fait bien une connexion HTTP.

Cela m'a permis de bien corriger ma requête préparé en PB et le tout fonctionne à merveille. J'ai un doute sur le calcul du paramètre 'Content-Length' car différent de celui créer par Postman mais ca fonctionne. Je n'ai pas trouvé de documentation (même dans la RFC2616 ou autre).
Si vous avez une info, je suis preneur.
J'ai laissé mon site test ouvert pour les curieux. et voici le code du test un peu documenté. J'ai ajusté les buffer et les temps pour optimiser la com.

Code : Tout sélectionner

;sources
;https://www.purebasic.fr/english/viewtopic.php?t=19714
;https://www.purebasic.fr/french/viewtopic.php?t=14753
;https://www.pierre-giraud.com/http-reseau-securite-cours/requete-reponse-session/
Procedure.s SendPost()
  
  Debug SetCurrentDirectory("/Users/bertrand/Mon Drive/PureBasic/Lagardere" )
  Debug "repertoire actuel "+ GetCurrentDirectory()
  
  FullFileName$ = "test.xml" ; Full path+filename, choose your own path
  OpenFile(1,FullFileName$)
  Repeat
    Text$ = ReadString(1)
    FILE$ + Text$ + #CRLF$
  Until Eof(1)
  ;Debug ">"+FILE$ + " >>> "+Len(file$)
  
  
  LenString$=Str(Len(PostData$))
  port.i = 80
  Timeout = 100 ; à ajuster pour assurer un retour complet
  server$ = "bmaillard.free.fr"
  QT$=Chr(34)

  com$ = "POST /greg/envoyer.php HTTP/1.1"+#CRLF$
  com$ + "User-Agent: PostmanRuntime/7.30.0"+#CRLF$
  com$ + "Accept: */*"+#CRLF$
  com$ + "Postman-Token: ce034460-714f-40db-99ba-df45516d14ed"+#CRLF$
  com$ + "Host: bmaillard.free.fr"+#CRLF$
  com$ + "Accept-Encoding: gzip, deflate, br"+#CRLF$
  com$ + "Connection: keep-alive"+#CRLF$
  com$ + "Content-Type: multipart/form-data; boundary=--------------------------329524634601592690113207"+#CRLF$
  
  
  PostData$ = "----------------------------329524634601592690113207"+#CRLF$  
  PostData$ + "Content-Disposition: form-data; name="+QT$+"Nameparameter"+QT$+"; filename="+QT$+"test.xml"+QT$+#CRLF$
  PostData$ + #CRLF$
  PostData$ + file$
  PostData$ + "----------------------------329524634601592690113207"+#CRLF$
  PostData$ + "Content-Disposition: form-data; name="+QT$+"testpost1"+QT$+#CRLF$
  PostData$ + #CRLF$
  PostData$ + "12345"+#CRLF$
  PostData$ + "----------------------------329524634601592690113207"+#CRLF$
  PostData$ + "Content-Disposition: form-data; name="+QT$+"testpost2"+QT$+#CRLF$
  PostData$ + #CRLF$
  PostData$ + "54321"+#CRLF$  
  PostData$ + "----------------------------329524634601592690113207--"+#CRLF$
  
  
  com$ + "Content-Length:"+Len(PostData$)+#CRLF$  ; je ne suis pas sur de ce parametre , mais il fonctionne
  com$ + #CRLF$
  com$ + PostData$
  
  ;Debug  ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+ Len(com1$)
  
  ConnectionID = OpenNetworkConnection(Server$, port.i,#PB_Network_TCP)
  If ConnectionID
    
    ;Res = SendNetworkData(ConnectionID,@com$,Len(com$)) ; pas de HTTP ?
    Res= SendNetworkString(ConnectionID, com$ ,#PB_Ascii) ;  HTTP
    
    Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> début requete méthode POST >>>>>>>>>>>>>>>>>>>>>>"
    Debug com$
    Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Fin de requète >>>>>>>>>>>>>>>>>>>>>>"
    
    Delay(100)  ; attende de la réponse
    r$ = Space(8000) ; max UDP 65000 évite de gérer un buffer plus petit
    d = ElapsedMilliseconds()
    
    ; lit la reception jusqu'a timeout et retour la réponse
    Repeat
      Result = NetworkClientEvent(ConnectionID)
      If result
        receivLen = ReceiveNetworkData(ConnectionID,@r$,Len(r$))
        If receivLen < 0   ; probleme lors de la connexion 
          ProcedureReturn "Un problème est survenu"
        EndIf
        If receivLen > 0 And receivLen <= Len(r$)
          d = ElapsedMilliseconds()
          buffer$ + PeekS(@r$, receivLen, #PB_UTF8|#PB_ByteLength) ; lecture correcte du retour
        EndIf
      EndIf
      
      Tm = ElapsedMilliseconds()-d
    Until Tm > Timeout  ; garantir fin de transmission
    CloseNetworkConnection(ConnectionID)
    ProcedureReturn buffer$
  EndIf
  
EndProcedure

retour.s = SendPost()
Debug ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  Retour "
Debug retour.s

End
en réponse, on peut observer la bonne interprétation des variable :
<pre>post<br />Array
(
[testpost1] => 12345
[testpost2] => 54321
)
get<br />Array
(
)
file<br />Array
(
[Nameparameter] => Array
(
[name] => test.xml
[type] =>
[tmp_name] => /mnt/108/sdb/e/e/bmaillard/phpwkQ4Z5
[error] => 0
[size] => 6
)

)


Merci de votre aide