Bonsoir,
J’utilise LibreOffice (Calc) comme client lourd d’un serveur PHP. Les requêtes au serveur sont envoyées en HTTP POST en utilisant l’UCB. Le même fichier Calc est utilisé par plusieurs personnes, sous Linux ou Windows. Pour certains utilisateurs sous Linux, l’UCB transforme les requêtes en HTTP PUT, ce qui a comme conséquence désagréable que le serveur PHP ne décode pas les variables reçues dans son tableau $_POST. C’est le cas avec LibreOffice 7.3.7.2 sous Ubuntu 22.04.4, alors que les POST sont émis normalement par LibreOffice 7.5.2.2 sous Ubuntu 04.2.
Je joins ci-dessous le code complet d’un module de test avec lequel le problème peut être observé.
Je serai ravi si quelqu’un connaît un moyen pour forcer l’émission POST en interdisant les PUT, ce qui m’évitera de devoir décoder moi même en PHP les données reçues.
Merci d’avance. Salutations.
'==============================================================================
’ Main() uses UCB to send a HTTP POST REQUEST.
'==============================================================================
CONST POST_URL = “http://mco.s2hnh.org/”
CONST POST_BODY = “A=varA&B=VarB”
DIM gResponseStream As Object 'com.sun.star.io.SequenceInputStreamService
DIM gCommandListener as Object 'com.sun.star.ucb.XWebDAVCommandEnvironment
DIM gResponseListener as Object 'com.sun.star.io.XActiveDataSink
DIM gInteractionListener as Object 'com.sun.star.task.XInteractionHandler
DIM gProgressListener as Object 'com.sun.star.ucb.XProgressHandler
Sub Main
On local ERR GoTo Err
gCommandListener = CreateUnoListener(“XCommandEnv_”, “com.sun.star.ucb.XWebDAVCommandEnvironment”)
gResponseListener = CreateUnoListener(“XActiveDataSink_”, “com.sun.star.io.XActiveDataSink”)
gInteractionListener = CreateUnoListener(“XInteractionHandle_”, “com.sun.star.task.XInteractionHandler”)
gProgressListener = CreateUnoListener(“XProgressHandle_”, “com.sun.star.ucb.XProgressHandler”)
broker = createUnoService("com.sun.star.ucb.UniversalContentBroker")
contentID = broker.createContentIdentifier(POST_URL)
ucbContent = broker.queryContent(contentID) 'com.sun.star.comp.ucb.WebDAVContent -> com.sun.star.ucb.XContent
'POST body send through two streams : TextOutputStream -> Pipe
'-------------------------------------------------------------
postStream = CreateUnoService("com.sun.star.io.Pipe")
textOutputStream = CreateUnoService("com.sun.star.io.TextOutputStream")
textOutputStream.setOutputStream(postStream)
textOutputStream.writeString(POST_BODY)
textOutputStream.closeOutput()
'Sending POST command to UCB content
'-----------------------------------
DIM postCommand as new com.sun.star.ucb.Command
postCommand.Name = "post"
postCommand.Handle = -1
postArgs = CreateUnoStruct("com.sun.star.ucb.PostCommandArgument2")
postArgs.Source = postStream
postArgs.Sink = gResponseListener 'to retrieve response stream
postArgs.MediaType = "application/x-www-form-urlencoded" 'HTTP Header Content-Type
postArgs.Referer = ""
postCommand.Argument = postArgs
ucbContent.execute(postCommand, 0, gCommandListener)
'Waiting for response
'--------------------
responseStream = gResponseListener.getInputStream()
textStream = CreateUnoService("com.sun.star.io.TextInputStream")
textStream.setInputStream (responseStream)
textStream.setEncoding ("UTF8")
DIM delimiters() as String 'To read until EOF
postAnswer = textStream.readString(delimiters, False)
textStream.closeInput()
MsgBox("Answer : " & postAnswer)
ucbContent.dispose()
Exit Sub
Err: MsgBox(“UCB error”)
End Sub
'==============================================================================
’ Interface com.sun.star.io.XActiveDataSink
'==============================================================================
Function XActiveDataSink_setInputStream(inputStream As Variant)
gResponseStream = inputStream 'Called by UCB to register the response stream
End Function
Function XActiveDataSink_getInputStream() As Variant
XActiveDataSink_getInputStream = gResponseStream
End Function
'==============================================================================
’ Interface com.sun.star.ucb.XWebDAVCommandEnvironment
'==============================================================================
Function XCommandEnv_getUserRequestHeaders(uri as String, method as Variant)
Dim headers(1) as New com.sun.star.beans.StringPair
headers(0).First = “Accept-Language”
headers(0).Second = “*”
headers(1).First = “Cookie”
headers(1).Second = “XDEBUG_SESSION=netbeans-xdebug”
XCommandEnv_getUserRequestHeaders = headers
End Function
Function XCommandEnv_getInteractionHandler()
MsgBox(“XCommandEnv_getInteractionHandler”) ’ UCB encounter an error
XCommandEnv_getInteractionHandler = gInteractionListener
End Function
Function XCommandEnv_getProgressHandler()
MsgBox(“XCommandEnv_getProgressHandler”)
XCommandEnv_getProgressHandler = gProgressListener
End Function
'==============================================================================
’ Interface com.sun.star.task.XInteractionHandler
’ Reçoit un objet request avec les propriétés :
’ - Request : indique la classe d’erreur et l’URL concernée
’ - Continuations : Array de XInteractionContinuation définissant les différentes
’ continuations que l’on peut choisir
'==============================================================================
Sub XInteractionHandle_handle(request as Object)
MsgBox(“XInteractionHandle_handle”)
End sub
'==============================================================================
’ Interface com.sun.star.ucb.XProgressHandler
'==============================================================================
Sub XProgressHandle_push (status as Variant) : MsgBox(“XProgressHandle_push”) : End Sub
Sub XProgressHandle_update(status as Variant) : MsgBox(“XProgressHandle_update”) : End Sub
Sub XProgressHandle_pop() : MsgBox(“XProgressHandle_pop”) : End Sub