Universal Content Broker : des requêtes HTTP POST sont émises en HTTP PUT

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

demi solution : cette version est obsolète et devrait-être mise à jour, ce qui résoudra le problème…

Certes, mais je n’ai pas de contrôle sur les versions des utilisateurs, et aucun moyen de les contraindre à se mettre à jour …

effectivement c’est pas strictement du http.

pourquoi pas + simplement du GET via Documentation/Calc Functions/WEBSERVICE - The Document Foundation Wiki

GET limite la taille des données transmises au serveur. De plus, les réponses de mon serveur sont des données complexes et pas faites pour être affichées dans une cellule

Il s’agit d’un bug connu (Bug 153039 sur https://bugs.documentfoundation.org) qui a été corrigé en janvier 2023. La correction a été intégrée à partir de la version 7.5 (ou 7.6, les commentaires des développeurs sont ambigus)

1 Like

tdf#153039
ça devrait même être ok en 7.4.6
image