Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support extra protocol headers for requests #27

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion ext/rhoconnect-client/RhoConnectClient.rb
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,13 @@ def self.getSourceNameById( sourceId )
nil
end


def self.setOIDCToken( token )
setProtocolExtras(
{
'headers' => { 'Authorization' => "Bearer #{token}" }
}
)
end

# vvv DEPRECATED vvv

Expand Down
12 changes: 12 additions & 0 deletions ext/rhoconnect-client/ext/RhoConnectClient.xml
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,18 @@ Be sure to review the [Ruby API Usage](/guide/api_ruby) guide for important info
</PARAMS>
<RETURN type="STRING"/>
</METHOD>

<METHOD name="setProtocolExtras" generateDoc="false">
<DESC>Sets extras to be added to protocol requests.</DESC>
<PARAMS>
<PARAM name="extras" type="HASH">
<DESC>Hash of extras</DESC>
<PARAM name="extra" type="HASH">
</PARAM>
</PARAM>
</PARAMS>
</METHOD>

</METHODS>

<VER_INTRODUCED>1.0.0</VER_INTRODUCED>
Expand Down
24 changes: 24 additions & 0 deletions ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,30 @@ void RhoConnectClientImpl::login( const rho::String& login, const rho::String&

handleSyncResult(oResult);
}

void RhoConnectClientImpl::setProtocolExtras( const rho::Hashtable<rho::String, rho::String>& extras, rho::apiGenerator::CMethodResult& oResult) {

rho::sync::CSyncEngine::ProtocolExtras parsedExtras;

for ( auto it = extras.begin(); it != extras.end(); ++it ) {

rho::Hashtable< rho::String, rho::String > parsedExtra;

rho::json::CJSONEntry json( it->second.c_str() );
if ( json.isObject() ) {
for( rho::json::CJSONStructIterator jobj( json ); !jobj.isEnd(); jobj.next()) {
if ( jobj.getCurValue().isString()) {
parsedExtra.put( jobj.getCurKey(), jobj.getCurString() );
}
}
}

parsedExtras.put( it->first, parsedExtra );

}

getSyncThread()->addQueueCommand(new sync::CSyncThread::CSyncSetProtoExtrasCommand( parsedExtras ));
}

void RhoConnectClientImpl::handleSyncResult(rho::apiGenerator::CMethodResult& oResult) {
if ( getSyncEngine().isNoThreadedMode() ) {
Expand Down
1 change: 1 addition & 0 deletions ext/rhoconnect-client/ext/shared/RhoConnectClientImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class RhoConnectClientImpl : public CRhoConnectClientSingletonBase
virtual void getLastSyncObjectCount( const rho::String& sourceName, rho::apiGenerator::CMethodResult& oResult);
virtual void setSourceProperty( const rho::String& sourceName, const rho::String& propertyName, const rho::String& propertyValue, rho::apiGenerator::CMethodResult& oResult);
virtual void getSourceProperty( const rho::String& sourceName, const rho::String& propertyName, rho::apiGenerator::CMethodResult& oResult);
virtual void setProtocolExtras( const rho::Hashtable<rho::String, rho::String>& extras, rho::apiGenerator::CMethodResult& oResult);

private:
void handleSyncResult(rho::apiGenerator::CMethodResult& oResult);
Expand Down
24 changes: 22 additions & 2 deletions ext/rhoconnect-client/ext/shared/sync/SyncEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1078,15 +1078,25 @@ void CSyncEngine::login(String name, String password, const CSyncNotification& o
//try {
loadAllSources();

NetResponse resp = getNet().pullCookies( getProtocol().getLoginUrl(), getProtocol().getLoginBody(name, password), this );
Hashtable<String,String> reqHeaders;
alterRequestHeaders(reqHeaders);
NetResponse resp = getNet().doRequest( "POST", getProtocol().getLoginUrl(), getProtocol().getLoginBody(name,password), this, &reqHeaders );

String strSession = "";

if ( resp.getRespCode() == 200 )
{
strSession = resp.getCookies().c_str();
}


int nErrCode = RhoAppAdapter.getErrorFromResponse(resp);
if ( nErrCode != RhoAppAdapter.ERR_NONE )
{
getNotify().callLoginCallback(oNotify, nErrCode, resp.getCharData());
return;
}

String strSession = resp.getCharData();
if ( strSession.length() == 0 )
{
LOG(ERROR) + "Return empty session.";
Expand Down Expand Up @@ -1203,6 +1213,16 @@ String CSyncEngine::getSyncServer() const {
return RHOCONF().getString("syncserver");
}

void CSyncEngine::alterRequestHeaders( Hashtable<String,String>& headers )
{
if ( m_protocolExtras.containsKey("headers") ) {
const Hashtable<String,String>& extraHeaders = m_protocolExtras.get("headers");
for ( auto it = extraHeaders.begin(); it != extraHeaders.end(); ++it ) {
headers.put(it->first,it->second);
}
}
}


static String getHostFromUrl( const String& strUrl )
{
Expand Down
8 changes: 8 additions & 0 deletions ext/rhoconnect-client/ext/shared/sync/SyncEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ class CSyncEngine : public net::IRhoSession
void clearProperties();
};

typedef rho::Hashtable< rho::String, rho::Hashtable< rho::String, rho::String >> ProtocolExtras;

private:
VectorPtr<CSyncSource*> m_sources;
NetRequest m_NetRequest, m_NetRequestClientID;
Expand All @@ -112,6 +114,8 @@ class CSyncEngine : public net::IRhoSession

net::CNetRequestWrapper getNetClientID(){ return getNetRequest(&m_NetRequestClientID); }

ProtocolExtras m_protocolExtras;

public:
CSyncEngine();
~CSyncEngine(void){}
Expand Down Expand Up @@ -185,6 +189,10 @@ class CSyncEngine : public net::IRhoSession
void setNonThreadedMode(boolean b){m_bNoThreaded = b;}

void applyChangedValues(db::CDBAdapter& db);

void setProtocolExtras( const ProtocolExtras& e ) { m_protocolExtras = e; }
void alterRequestHeaders( Hashtable<String,String>& headers );

private:

bool recoverSearch( const String& strUrl, const String& strBody, int& errorCode, String& strError, int nProgressStep );
Expand Down
3 changes: 3 additions & 0 deletions ext/rhoconnect-client/ext/shared/sync/SyncSource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,8 @@ void CSyncSource::doSyncClientChanges()
{
Hashtable<String, String> reqHeaders;
reqHeaders.put(getProtocol().getClientIDHeader(), getSync().getClientID());
getSync().alterRequestHeaders(reqHeaders);

if ( m_arMultipartItems.size() > 0 )
{
CMultipartItem* pItem = new CMultipartItem();
Expand Down Expand Up @@ -644,6 +646,7 @@ void CSyncSource::syncServerChanges()
String strUrl = getProtocol().getServerQueryUrl(getName(), getSync().getClientID(), getSync().getSyncPageSize());
Hashtable<String, String> reqHeaders;
reqHeaders.put(getProtocol().getClientIDHeader(), getSync().getClientID());
getSync().alterRequestHeaders(reqHeaders);

if ( !m_bTokenFromDB && getToken() > 1 )
strUrl += "&token=" + convertToStringA(getToken());
Expand Down
50 changes: 27 additions & 23 deletions ext/rhoconnect-client/ext/shared/sync/SyncThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,37 +184,39 @@ void CSyncThread::checkShowStatus(CSyncCommand& oSyncCmd)
void CSyncThread::processCommand(IQueueCommand* pCmd)
{
CSyncCommand& oSyncCmd = *((CSyncCommand*)pCmd);
switch(oSyncCmd.m_nCmdCode)
checkShowStatus(oSyncCmd);
oSyncCmd.executeForSyncEngine( m_oSyncEngine );
}

void CSyncThread::CSyncCommand::executeForSyncEngine( CSyncEngine& sync )
{
switch(m_nCmdCode)
{
case scSyncAll:
checkShowStatus(oSyncCmd);
m_oSyncEngine.doSyncAllSources(oSyncCmd.m_strQueryParams,oSyncCmd.m_bSyncOnlyChangedSources);
break;
case scSyncOne:
{
checkShowStatus(oSyncCmd);
m_oSyncEngine.doSyncSource(CSyncEngine::CSourceID(oSyncCmd.m_nCmdParam,oSyncCmd.m_strCmdParam), oSyncCmd.m_strQueryParams );
}
break;
case scSearchOne:
{
checkShowStatus(oSyncCmd);
m_oSyncEngine.doSearch( ((CSyncSearchCommand&)oSyncCmd).m_arSources, oSyncCmd.m_strCmdParam, ((CSyncSearchCommand&)oSyncCmd).m_strFrom,
((CSyncSearchCommand&)oSyncCmd).m_bSyncChanges,
oSyncCmd.m_nCmdParam);
}
sync.doSyncAllSources(m_strQueryParams,m_bSyncOnlyChangedSources);
break;
case scLogin:
{
CSyncLoginCommand& oLoginCmd = (CSyncLoginCommand&)oSyncCmd;

checkShowStatus(oSyncCmd);
m_oSyncEngine.login(oLoginCmd.m_strName, oLoginCmd.m_strPassword, *oLoginCmd.m_pNotify );
}
case scSyncOne:
sync.doSyncSource(CSyncEngine::CSourceID(m_nCmdParam,m_strCmdParam), m_strQueryParams );
break;
}
}

void CSyncThread::CSyncSearchCommand::executeForSyncEngine(CSyncEngine &sync)
{
sync.doSearch( m_arSources, m_strCmdParam, m_strFrom, m_bSyncChanges, m_nCmdParam);
}

void CSyncThread::CSyncLoginCommand::executeForSyncEngine(CSyncEngine &sync)
{
sync.login(m_strName, m_strPassword, *m_pNotify );
}

void CSyncThread::CSyncSetProtoExtrasCommand::executeForSyncEngine(CSyncEngine &sync)
{
sync.setProtocolExtras( m_extras );
}

void CSyncThread::setPollInterval(int nInterval)
{
// if ( nInterval == 0 )
Expand Down Expand Up @@ -272,6 +274,8 @@ String CSyncThread::CSyncCommand::toString()
return "Login";
case scSearchOne:
return "Search";
case scSetProtoExtras:
return "SetProtoExtras";
}

return "Unknown; Code : " + convertToStringA(m_nCmdCode);
Expand Down
25 changes: 23 additions & 2 deletions ext/rhoconnect-client/ext/shared/sync/SyncThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ namespace sync {
class CSyncThread : public common::CThreadQueue
{
public:
enum ESyncCommands{ scNone = 0, scSyncAll, scSyncOne, scLogin, scSearchOne};
enum ESyncCommands{ scNone = 0, scSyncAll, scSyncOne, scLogin, scSearchOne, scSetProtoExtras };

private:

Expand Down Expand Up @@ -126,6 +126,8 @@ class CSyncThread : public common::CThreadQueue

virtual String toString();

virtual void executeForSyncEngine( CSyncEngine& sync );

};

class CSyncLoginCommand : public CSyncCommand
Expand All @@ -140,6 +142,8 @@ class CSyncThread : public common::CThreadQueue
m_strPassword = password;
m_pNotify = pNotify;
}

virtual void executeForSyncEngine( CSyncEngine& sync );
};

class CSyncSearchCommand : public CSyncCommand
Expand All @@ -149,12 +153,29 @@ class CSyncThread : public common::CThreadQueue
boolean m_bSyncChanges;
rho::Vector<rho::String> m_arSources;

CSyncSearchCommand(String from, String params, const rho::Vector<rho::String>& arSources, boolean sync_changes, int nProgressStep) : CSyncCommand(CSyncThread::scSearchOne,params,nProgressStep, false, "")
CSyncSearchCommand(String from, String params, const rho::Vector<rho::String>& arSources, boolean sync_changes, int nProgressStep) :
CSyncCommand(CSyncThread::scSearchOne,params,nProgressStep, false, "")
{
m_strFrom = from;
m_bSyncChanges = sync_changes;
m_arSources = arSources;
}

virtual void executeForSyncEngine( CSyncEngine& sync );
};

class CSyncSetProtoExtrasCommand : public CSyncCommand
{
CSyncEngine::ProtocolExtras m_extras;
public:
CSyncSetProtoExtrasCommand( const CSyncEngine::ProtocolExtras& extras ) :
CSyncCommand(CSyncThread::scSetProtoExtras,"",false,"",false),
m_extras(extras)
{

}

virtual void executeForSyncEngine( CSyncEngine& sync );
};

private:
Expand Down