Skip to content

Commit

Permalink
[XrdCl] Implement FollowRedirects property for files
Browse files Browse the repository at this point in the history
  • Loading branch information
ljanyst committed Mar 19, 2014
1 parent 18272ca commit fbb5a34
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 19 deletions.
5 changes: 3 additions & 2 deletions src/XrdCl/XrdClFile.hh
Expand Up @@ -355,8 +355,9 @@ namespace XrdCl
//! Set file property
//!
//! File properties:
//! ReadRecovery [true/false] - enable/disable read recovery
//! WriteRecovery [true/false] - enable/disable write recovery
//! ReadRecovery [true/false] - enable/disable read recovery
//! WriteRecovery [true/false] - enable/disable write recovery
//! FollowRedirects [true/false] - enable/disable following redirections
//------------------------------------------------------------------------
bool SetProperty( const std::string &name, const std::string &value );

Expand Down
50 changes: 33 additions & 17 deletions src/XrdCl/XrdClFileStateHandler.cc
Expand Up @@ -185,22 +185,6 @@ namespace
XRDCL_SMART_PTR_T<AnyObject> responsePtr( response );
pSendParams.hostList = hostList;

//----------------------------------------------------------------------
// We have been sent out elsewhere, and we can handle it
//----------------------------------------------------------------------
if( !status->IsOK() && status->code == errRedirect )
{
std::string root = "root", xroot = "xroot";
std::string msg = status->GetErrorMessage();
if( !msg.compare( 0, root.size(), root ) ||
!msg.compare( 0, xroot.size(), xroot ) )
{
pStateHandler->OnStateRedirection( msg, pMessage, this,
pSendParams );
return;
}
}

//----------------------------------------------------------------------
// Houston we have a problem...
//----------------------------------------------------------------------
Expand Down Expand Up @@ -254,7 +238,8 @@ namespace XrdCl
pOpenFlags( 0 ),
pSessionId( 0 ),
pDoRecoverRead( true ),
pDoRecoverWrite( true )
pDoRecoverWrite( true ),
pFollowRedirects( true )
{
pFileHandle = new uint8_t[4];
ResetMonitoringVars();
Expand Down Expand Up @@ -373,6 +358,7 @@ namespace XrdCl
XRootDTransport::SetDescription( msg );
OpenHandler *openHandler = new OpenHandler( this, handler );
MessageSendParams params; params.timeout = timeout;
params.followRedirects = pFollowRedirects;
MessageUtils::ProcessSendParams( params );

Status st = MessageUtils::SendMessage( *pFileUrl, msg, openHandler, params );
Expand Down Expand Up @@ -840,6 +826,12 @@ namespace XrdCl
else pDoRecoverWrite = false;
return true;
}
else if( name == "FollowRedirects" )
{
if( value == "true" ) pFollowRedirects = true;
else pFollowRedirects = false;
return true;
}
return false;
}

Expand All @@ -862,6 +854,12 @@ namespace XrdCl
else value = "false";
return true;
}
else if( name == "FollowRedirects" )
{
if( pFollowRedirects ) value = "true";
else value = "false";
return true;
}
else if( name == "DataServer" && pDataServer )
{ value = pDataServer->GetHostId(); return true; }
else if( name == "LastURL" && pDataServer )
Expand Down Expand Up @@ -1016,6 +1014,24 @@ namespace XrdCl
ResponseHandler *userHandler,
MessageSendParams &sendParams )
{
//--------------------------------------------------------------------------
// It may be a redirection
//--------------------------------------------------------------------------
if( !status->IsOK() && status->code == errRedirect && pFollowRedirects )
{
std::string root = "root", xroot = "xroot";
std::string msg = status->GetErrorMessage();
if( !msg.compare( 0, root.size(), root ) ||
!msg.compare( 0, xroot.size(), xroot ) )
{
OnStateRedirection( msg, message, userHandler, sendParams );
return;
}
}

//--------------------------------------------------------------------------
// Handle error
//--------------------------------------------------------------------------
Log *log = DefaultEnv::GetLog();
XrdSysMutexHelper scopedLock( pMutex );
pInTheFly.erase( message );
Expand Down
1 change: 1 addition & 0 deletions src/XrdCl/XrdClFileStateHandler.hh
Expand Up @@ -413,6 +413,7 @@ namespace XrdCl
uint64_t pSessionId;
bool pDoRecoverRead;
bool pDoRecoverWrite;
bool pFollowRedirects;

//------------------------------------------------------------------------
// Monitoring variables
Expand Down

0 comments on commit fbb5a34

Please sign in to comment.