2019-05-21 22:33:26 -05:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project .
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License , v . 2.0 . If a copy of the MPL was not distributed with this
* file , You can obtain one at http : //mozilla.org/MPL/2.0/.
*/
# include <config.h>
# include <WopiTestServer.hpp>
# include <Log.hpp>
# include <Unit.hpp>
# include <UnitHTTP.hpp>
# include <helpers.hpp>
# include <Poco/Net/HTTPRequest.h>
class UnitWOPITemplate : public WopiTestServer
{
enum class Phase
{
LoadTemplate ,
SaveDoc ,
CloseDoc ,
Polling
} _phase ;
public :
UnitWOPITemplate ( ) :
_phase ( Phase : : LoadTemplate )
{
}
virtual bool handleHttpRequest ( const Poco : : Net : : HTTPRequest & request , Poco : : MemoryInputStream & /*message*/ , std : : shared_ptr < StreamSocket > & socket ) override
{
Poco : : URI uriReq ( request . getURI ( ) ) ;
LOG_INF ( " Fake wopi host request: " < < uriReq . toString ( ) < < " method " < < request . getMethod ( ) ) ;
// CheckFileInfo
if ( request . getMethod ( ) = = " GET " & & uriReq . getPath ( ) = = " /wopi/files/10 " )
{
LOG_INF ( " Fake wopi host request, handling CheckFileInfo: " < < uriReq . getPath ( ) ) ;
Poco : : LocalDateTime now ;
Poco : : JSON : : Object : : Ptr fileInfo = new Poco : : JSON : : Object ( ) ;
fileInfo - > set ( " BaseFileName " , " test.odt " ) ;
2020-01-21 03:00:52 -06:00
fileInfo - > set ( " TemplateSource " , std : : string ( " http://127.0.0.1: " ) + std : : to_string ( ClientPortNumber ) + " /test.ott " ) ; // must be http, otherwise Neon in the core complains
2019-07-25 00:58:19 -05:00
fileInfo - > set ( " Size " , getFileContent ( ) . size ( ) ) ;
2019-05-21 22:33:26 -05:00
fileInfo - > set ( " Version " , " 1.0 " ) ;
fileInfo - > set ( " OwnerId " , " test " ) ;
fileInfo - > set ( " UserId " , " test " ) ;
fileInfo - > set ( " UserFriendlyName " , " test " ) ;
fileInfo - > set ( " UserCanWrite " , " true " ) ;
fileInfo - > set ( " PostMessageOrigin " , " localhost " ) ;
2019-09-27 11:56:16 -05:00
fileInfo - > set ( " LastModifiedTime " , Util : : getIso8601FracformatTime ( getFileLastModifiedTime ( ) ) ) ;
2019-05-21 22:33:26 -05:00
fileInfo - > set ( " EnableOwnerTermination " , " true " ) ;
std : : ostringstream jsonStream ;
fileInfo - > stringify ( jsonStream ) ;
std : : string responseString = jsonStream . str ( ) ;
const std : : string mimeType = " application/json; charset=utf-8 " ;
std : : ostringstream oss ;
oss < < " HTTP/1.1 200 OK \r \n "
2019-09-27 11:56:16 -05:00
< < " Last-Modified: " < < Util : : getHttpTime ( getFileLastModifiedTime ( ) ) < < " \r \n "
2019-05-21 22:33:26 -05:00
< < " User-Agent: " < < WOPI_AGENT_STRING < < " \r \n "
< < " Content-Length: " < < responseString . size ( ) < < " \r \n "
< < " Content-Type: " < < mimeType < < " \r \n "
< < " \r \n "
< < responseString ;
socket - > send ( oss . str ( ) ) ;
socket - > shutdown ( ) ;
return true ;
}
else if ( ( request . getMethod ( ) = = " OPTIONS " | | request . getMethod ( ) = = " HEAD " | | request . getMethod ( ) = = " PROPFIND " ) & & uriReq . getPath ( ) = = " /test.ott " )
{
std : : ostringstream oss ;
oss < < " HTTP/1.1 200 OK \r \n "
< < " Allow: GET \r \n "
< < " User-Agent: " < < WOPI_AGENT_STRING < < " \r \n "
< < " \r \n " ;
socket - > send ( oss . str ( ) ) ;
socket - > shutdown ( ) ;
return true ;
}
// Get the template
else if ( request . getMethod ( ) = = " GET " & & uriReq . getPath ( ) = = " /test.ott " )
{
LOG_INF ( " Fake wopi host request, handling template GetFile: " < < uriReq . getPath ( ) ) ;
Poco : : Net : : HTTPResponse response ;
HttpHelper : : sendFile ( socket , TDOC " /test.ott " , " " , response ) ;
socket - > shutdown ( ) ;
return true ;
}
// Save template
else if ( request . getMethod ( ) = = " POST " & & uriReq . getPath ( ) = = " /wopi/files/10/contents " )
{
LOG_INF ( " Fake wopi host request, handling PutFile: " < < uriReq . getPath ( ) ) ;
std : : streamsize size = request . getContentLength ( ) ;
2020-01-20 10:45:53 -06:00
LOK_ASSERT ( size > 0 ) ;
2019-05-21 22:33:26 -05:00
std : : ostringstream oss ;
oss < < " HTTP/1.1 200 OK \r \n "
< < " User-Agent: " < < WOPI_AGENT_STRING < < " \r \n "
< < " \r \n "
2019-09-27 11:56:16 -05:00
< < " { \" LastModifiedTime \" : \" " < < Util : : getHttpTime ( getFileLastModifiedTime ( ) ) < < " \" } " ;
2019-05-21 22:33:26 -05:00
socket - > send ( oss . str ( ) ) ;
socket - > shutdown ( ) ;
2020-01-20 10:45:53 -06:00
LOK_ASSERT_EQUAL ( static_cast < int > ( Phase : : SaveDoc ) , static_cast < int > ( _phase ) ) ;
2019-05-21 22:33:26 -05:00
_phase = Phase : : CloseDoc ;
return true ;
}
return false ;
}
void invokeTest ( ) override
{
constexpr char testName [ ] = " UnitWOPITemplate " ;
switch ( _phase )
{
case Phase : : LoadTemplate :
{
initWebsocket ( " /wopi/files/10?access_token=anything " ) ;
2019-07-25 00:58:19 -05:00
helpers : : sendTextFrame ( * getWs ( ) - > getLOOLWebSocket ( ) , " load url= " + getWopiSrc ( ) , testName ) ;
2019-05-21 22:33:26 -05:00
SocketPoll : : wakeupWorld ( ) ;
_phase = Phase : : SaveDoc ;
break ;
}
case Phase : : CloseDoc :
{
2019-07-25 00:58:19 -05:00
helpers : : sendTextFrame ( * getWs ( ) - > getLOOLWebSocket ( ) , " closedocument " , testName ) ;
2019-05-21 22:33:26 -05:00
_phase = Phase : : Polling ;
break ;
}
case Phase : : Polling :
{
exitTest ( TestResult : : Ok ) ;
break ;
}
case Phase : : SaveDoc :
{
break ;
}
}
}
} ;
UnitBase * unit_create_wsd ( void )
{
return new UnitWOPITemplate ( ) ;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */