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