Exemplo n.º 1
0
std::vector<std::pair<std::string, std::string> >* Object::getExistingMetaData() {
  SwiftResult<int*>* metadata = this->swiftShowMetadata(nullptr, false);
  if (metadata == nullptr){
    delete metadata;
    metadata = nullptr;
    return nullptr;
  }
  if (metadata->getResponse() == nullptr){
    delete metadata;
    metadata = nullptr;
    return nullptr;
  }

  std::vector<std::pair<std::string, std::string> >* result = new std::vector<
      std::pair<std::string, std::string> >();
  NameValueCollection::ConstIterator it = metadata->getResponse()->begin();

  while (it != metadata->getResponse()->end()) {
    string key = it->first;
    if (it->first.find("X-Object-Meta-") != string::npos) {
      key = it->first.substr(strlen("X-Object-Meta-"));
      result->push_back(make_pair(key, it->second));
    }
    ++it;
  }

  delete metadata;
  metadata = nullptr;

  return result;
}
Exemplo n.º 2
0
inline SwiftResult<T>* returnNullError(const string &whatsNull) {
  SwiftResult<T> *result = new SwiftResult<T>();
  SwiftError error(SwiftError::SWIFT_FAIL, whatsNull + " is NULL");
  result->setError(error);
  result->setResponse(nullptr);
  result->setPayload(nullptr);
  return result;
}
Exemplo n.º 3
0
Completion *CompletionBuilder::finish() {
  SwiftResult base = current;
  llvm::SmallString<64> nameStorage;
  StringRef name = getOriginalName();
  if (modified) {
    // We've modified the original result, so build a new one.
    auto opKind = CodeCompletionOperatorKind::None;
    if (current.isOperator())
      opKind = current.getOperatorKind();

    if (current.getKind() == SwiftResult::Declaration) {
      base = SwiftResult(
          semanticContext, current.getNumBytesToErase(), completionString,
          current.getAssociatedDeclKind(), current.getModuleName(),
          isNotRecommended, notRecommendedReason, current.getBriefDocComment(),
          current.getAssociatedUSRs(), current.getDeclKeywords(), opKind);
    } else {
      base = SwiftResult(current.getKind(), semanticContext,
                         current.getNumBytesToErase(), completionString,
                         current.getExpectedTypeRelation(), opKind);
    }

    llvm::raw_svector_ostream OSS(nameStorage);
    getFilterName(base.getCompletionString(), OSS);
    name = OSS.str();
  }

  llvm::SmallString<64> description;
  {
    llvm::raw_svector_ostream OSS(description);
    getDescription(&base, OSS, /*leadingPunctuation*/ true);
  }

  auto *result = new (sink.allocator)
      Completion(std::move(base), copyString(sink.allocator, name),
                 copyString(sink.allocator, description));
  result->moduleImportDepth = moduleImportDepth;
  result->popularityFactor = popularityFactor;
  result->opaqueCustomKind = customKind;
  return result;
}
Exemplo n.º 4
0
SwiftResult<HTTPClientSession*>* Object::swiftCreateReplaceObject(std::ostream* &outputStream,
    std::vector<HTTPHeader>* _uriParams, std::vector<HTTPHeader>* _reqMap) {
  //Check Container
  if (container == nullptr)
    return returnNullError<HTTPClientSession*>("container");

  if (container->getAccount() == nullptr)
    return returnNullError<HTTPClientSession*>("account");
  Endpoint* swiftEndpoint =
      container->getAccount()->getSwiftService()->getFirstEndpoint();
  if (swiftEndpoint == nullptr)
    return returnNullError<HTTPClientSession*>("SWIFT Endpoint");

  //Create parameter map
  vector<HTTPHeader> reqParamMap;
  //Add authentication token
  string tokenID = container->getAccount()->getToken()->getId();
  HTTPHeader authHeader("X-Auth-Token", tokenID);
  reqParamMap.push_back(authHeader);
  //Push Chuncked Encoding
  HTTPHeader encHeader("Transfer-Encoding", "chunked");
  reqParamMap.push_back(encHeader);
  //Add rest of request Parameters
  if (_reqMap != nullptr && _reqMap->size() > 0) {
    for (uint i = 0; i < _reqMap->size(); i++) {
      reqParamMap.push_back(_reqMap->at(i));
    }
  }

  //Path
  string path = container->getName() + "/" + name;
  URI uri(swiftEndpoint->getPublicUrl());
  string encoded;
  URI::encode(path,"",encoded);
  path = encoded;
  uri.setPath(uri.getPath() + "/" + path);

  if (_uriParams != nullptr && _uriParams->size() > 0) {
    //Create appropriate URI
    ostringstream queryStream;
    for (uint i = 0; i < _uriParams->size(); i++) {
      if (i > 0)
        queryStream << ",";
      queryStream << _uriParams->at(i).getQueryValue();
    }
    uri.setQuery(queryStream.str());
    //cout << uri.toString() << endl;
  }

  //Creating HTTP Session
  HTTPClientSession *httpSession = nullptr;
  try {
    /** This operation does not accept a request body. **/
    httpSession = doHTTPIO(uri, HTTPRequest::HTTP_PUT, &reqParamMap, outputStream);
    //Now we should increase number of calls to SWIFT API
    container->getAccount()->increaseCallCounter();
  } catch (Exception &e) {
    SwiftResult<HTTPClientSession*> *result = new SwiftResult<HTTPClientSession*>();
    SwiftError error(SwiftError::SWIFT_EXCEPTION, e.displayText());
    result->setError(error);
    //Try to set HTTP Response as the payload
    result->setSession(httpSession);
    result->setResponse(nullptr);
    result->setPayload(nullptr);
    return result;
  }

  //Everything seems fine
  SwiftResult<HTTPClientSession*> *result = new SwiftResult<HTTPClientSession*>();
  result->setError(SWIFT_OK);
  result->setSession(httpSession);
  result->setResponse(nullptr);
  result->setPayload(httpSession);
  return result;
}
Exemplo n.º 5
0
SwiftResult<vector<Object>*>* Container::swiftGetObjects(bool _newest) {
  SwiftResult<istream*> *objectList = this->swiftListObjects(HEADER_FORMAT_APPLICATION_JSON,nullptr,_newest);
  SwiftResult<vector<Object>*> *result = new SwiftResult<vector<Object>*>();
  result->setError(objectList->getError());
  result->setResponse(nullptr);
  result->setSession(nullptr);

  //Check error
  if(objectList->getError().code != SWIFT_OK.code) {
    result->setPayload(nullptr);
    delete objectList;
    return result;
  }

  //Parse JSON
  Json::Value root;   // will contains the root value after parsing.
  Json::Reader reader;
  bool parsingSuccessful = reader.parse(*objectList->getPayload(), root, false);
  if (!parsingSuccessful) {
    SwiftError error(SwiftError::SWIFT_JSON_PARSE_ERROR,
        reader.getFormattedErrorMessages());
    result->setError(error);
    result->setPayload(nullptr);
    delete objectList;
    return result;
  }

  //Allocate containers
  vector<Object>*objects = new vector<Object>();
  //Successful parse
  for(unsigned int i=0;i<root.size();i++) {
    string name = root[i].get("name","").asString();
    size_t length = root[i].get("bytes", -1).asInt64();
    string content_type = root[i].get("content_type","").asString();
    string hash = root[i].get("hash","").asString();
    string last_modified = root[i].get("last_modified","").asString();
    //Create new object
    Object object(this,name,length,content_type,hash,last_modified);
    objects->push_back(object);
  }

  //Set payload
  result->setPayload(objects);
  delete objectList;
  return result;
}
Exemplo n.º 6
0
SwiftResult<T>* doSwiftTransaction(Account *_account, std::string &_uriPath,
    const std::string &_method, std::vector<HTTPHeader>* _uriParams,
    std::vector<HTTPHeader>* _reqMap, std::vector<int> *_httpValidCodes,
    const char *bodyReqBuffer, ulong size, std::string *contentType) {
  //Start locking
  lock_guard<recursive_mutex> guard(transactionMutex);
  //Start of function
  if (_account == nullptr)
    return returnNullError<T>("account");
  Endpoint* swiftEndpoint = _account->getSwiftService()->getFirstEndpoint();
  if (swiftEndpoint == nullptr)
    return returnNullError<T>("SWIFT Endpoint");

  //Create parameter map
  vector<HTTPHeader> reqParamMap;
  //Add authentication token
  string tokenID = _account->getToken()->getId();
  HTTPHeader authHeader("X-Auth-Token", tokenID);
  reqParamMap.push_back(authHeader);
  //Add rest of request Parameters
  if (_reqMap != nullptr && _reqMap->size() > 0) {
    for (uint i = 0; i < _reqMap->size(); i++) {
      reqParamMap.push_back(_reqMap->at(i));
    }
  }

  URI uri(swiftEndpoint->getPublicUrl());
  string encoded;
  URI::encode(_uriPath,"",encoded);
  _uriPath = encoded;
  if (uri.getPath().size() > 0)
    uri.setPath(uri.getPath() + "/" + _uriPath);
  else
    uri.setPath(_uriPath);

  if (_uriParams != nullptr && _uriParams->size() > 0) {
    //Create appropriate URI
    ostringstream queryStream;
    //queryStream << "?";
    for (uint i = 0; i < _uriParams->size(); i++) {
      if (i > 0)
        queryStream << ",";
      queryStream << _uriParams->at(i).getQueryValue();
    }
    uri.setQuery(queryStream.str());
  }

  //Creating HTTP Session
  HTTPResponse *httpResponse = new HTTPResponse();
  HTTPClientSession *httpSession = nullptr;
  istream* resultStream = nullptr;

  try {
    /** This operation does not accept a request body. **/
    if (bodyReqBuffer == nullptr)
      httpSession = doHTTPIO(uri, _method, &reqParamMap);
    else {
      if (contentType != nullptr)
        httpSession = doHTTPIO(uri, _method, &reqParamMap, bodyReqBuffer, size,
            *contentType);
      else
        httpSession = doHTTPIO(uri, _method, &reqParamMap, bodyReqBuffer, size,"");
    }

    //Now we should increase number of calls to SWIFT API
    _account->increaseCallCounter();
    if (std::is_same<T, std::istream*>::value)
      resultStream = &httpSession->receiveResponse(*httpResponse);
    else
    	httpSession->receiveResponse(*httpResponse);
  } catch (Exception &e) {
    SwiftResult<T> *result = new SwiftResult<T>();
    SwiftError error(SwiftError::SWIFT_EXCEPTION, e.displayText());
    result->setError(error);
    //Try to set HTTP Response as the payload
    result->setSession(httpSession);
    result->setResponse(httpResponse);
    result->setPayload(nullptr);
    return result;
  }

  /**
   * Check HTTP return code
   */
  bool valid = false;
  for (uint i = 0; i < _httpValidCodes->size(); i++)
    if (_httpValidCodes->at(i) == httpResponse->getStatus()) {
      valid = true;
      break;
    }

  if (!valid) {
  	cout<<"Invalid Return code:";
    httpResponse->write(cout);
    if(httpResponse->getStatus() == 200)
    	cerr<<"bullshit"<<endl;
    if(httpResponse->getStatus() == HTTPResponse::HTTP_UNAUTHORIZED) {
      if(_account->reAuthenticate()) {
        delete httpSession;httpSession = nullptr;
        delete httpResponse;httpResponse = nullptr;
        return doSwiftTransaction<T>(_account, _uriPath,_method, _uriParams,
            _reqMap, _httpValidCodes, bodyReqBuffer, size, contentType);
      }
    }
    SwiftResult<T> *result = new SwiftResult<T>();
    string errorText = "Code:";
    errorText+= httpResponse->getStatus()+"\tReason:"+httpResponse->getReason();
    SwiftError error(SwiftError::SWIFT_HTTP_ERROR, errorText);
    result->setError(error);
    result->setSession(httpSession);
    result->setResponse(httpResponse);
    result->setPayload(nullptr);
    return result;
  }

  //Everything seems fine
  SwiftResult<T> *result = new SwiftResult<T>();
  result->setError(SWIFT_OK);
  result->setSession(httpSession);
  result->setResponse(httpResponse);
  result->setPayload((T)resultStream);
  //Cleanup
  return result;
}
Exemplo n.º 7
0
int main(int argc, char** argv) {
  AuthenticationInfo info;
  info.username = "******";
  info.password = "******";
  info.authUrl = "http://10.42.0.83:5000/v2.0/tokens";
  info.tenantName = "kos";
  info.method = AuthenticationMethod::KEYSTONE;

  //Account Test cases
  SwiftResult<Account*>* authenticateResult = Account::authenticate(info);
  cout << "Account Test case:\n" << authenticateResult->getPayload()->toString()
      << endl << endl;

  //Get account details
  SwiftResult<istream*>* accountDetails =
      authenticateResult->getPayload()->swiftAccountDetails(
          HEADER_FORMAT_APPLICATION_JSON);
  StreamCopier::copyStream(*accountDetails->getPayload(), cout);
  cout << endl << endl;
  delete accountDetails;

  //Create account metadata
  vector<pair<string, string> > accountMetaData;
  accountMetaData.push_back(make_pair("Key1", "Value1"));
  //accountMetaData.push_back(make_pair("Key 2", "Value 2"));
  SwiftResult<int*>* accountMetaDataRes =
      authenticateResult->getPayload()->swiftCreateMetadata(accountMetaData);
  accountMetaDataRes->getResponse()->write(cout);
  cout << endl << endl;
  delete accountMetaDataRes;

  //Show account metadata
	accountMetaDataRes = authenticateResult->getPayload()->swiftShowMetadata();
	accountMetaDataRes->getResponse()->write(cout);
	cout << endl << endl;
	delete accountMetaDataRes;

  //delete account metadata
  vector<string> accountMetaDataDeleteKeys;
  accountMetaDataDeleteKeys.push_back("Key 2");
  accountMetaDataRes = authenticateResult->getPayload()->swiftDeleteMetadata(
      accountMetaDataDeleteKeys);
  accountMetaDataRes->getResponse()->write(cout);
  cout << endl << endl;
  delete accountMetaDataRes;

  //Update account metadata
  accountMetaData.clear();
  accountMetaData.push_back(make_pair("Key 1", "Value 1 updated"));
  accountMetaDataRes = authenticateResult->getPayload()->swiftUpdateMetadata(
      accountMetaData);
  accountMetaDataRes->getResponse()->write(cout);
  cout << endl << endl;
  delete accountMetaDataRes;

  //Show account metadata
  accountMetaDataRes = authenticateResult->getPayload()->swiftShowMetadata();
  accountMetaDataRes->getResponse()->write(cout);
  cout << endl << endl;
  delete accountMetaDataRes;

  //List containers
  SwiftResult<vector<Container>*>* containerListRes = authenticateResult->getPayload()->swiftGetContainers();
  cout<<"Num of Container:"<<containerListRes->getPayload()->size()<<endl;;
  if(containerListRes->getError().code == SWIFT_OK.code)
    for(auto it=containerListRes->getPayload()->begin();it!=containerListRes->getPayload()->end();++it)
      cout<<"Container:"<<(*it).getName()<<endl;
  cout<<endl;
  delete containerListRes;

  //Container Test Cases
  Container container(authenticateResult->getPayload(), "Container2");

  //Create container
  SwiftResult<int*>* containerRes = container.swiftCreateContainer();
  containerRes->getResponse()->write(cout);
  cout << endl << endl;
  delete containerRes;

  //Container list objects test
  Container container2(authenticateResult->getPayload(), "Container2");
  SwiftResult<vector<Object>*>* objects = container2.swiftGetObjects(true);
  if(objects->getError().code == SwiftError::SWIFT_OK)
    for (uint i = 0; i < objects->getPayload()->size(); i++) {
      cout << objects->getPayload()->at(i).getName() << "\tLength:"
          << objects->getPayload()->at(i).getLength() << "\tType:"
          << objects->getPayload()->at(i).getContentType() << "\tHash:"
          << objects->getPayload()->at(i).getHash() << "\tLastModiefied:"
          << objects->getPayload()->at(i).getLastModified() << endl;
    }
  delete objects;

  //Delete container
  containerRes = container.swiftDeleteContainer();
  containerRes->getResponse()->write(cout);
  cout << endl << endl;
  delete containerRes;

  //Create Again
  SwiftResult<int*>*createRes = container.swiftCreateContainer();
  delete createRes;

  //Get objects of an existing container
  container.setName("Container2");
  SwiftResult<istream*>* containerResult = container.swiftListObjects();
  if(containerResult->getError().code == SwiftError::SWIFT_OK)
    StreamCopier::copyStream(*containerResult->getPayload(), cout);
  cout << endl << endl;
  delete containerResult;

  //Create Container metadata
  vector<pair<string, string> > containerMetaData;
  containerMetaData.push_back(make_pair("Key 1", "Container Value 1"));
  containerMetaData.push_back(make_pair("Key 2", "container Value 2"));
  containerRes = container.swiftCreateMetadata(containerMetaData);
  containerRes->getResponse()->write(cout);
  cout << endl << endl;
  delete containerRes;

  //Delete Container metadata
  vector<string> containerMetaDataDeleteKeys;
  containerMetaDataDeleteKeys.push_back("Key 2");
  containerRes = container.swiftDeleteMetadata(containerMetaDataDeleteKeys);
  containerRes->getResponse()->write(cout);
  cout << endl << endl;
  delete containerRes;

  //Update Container metadata
  containerMetaData.clear();
  containerMetaData.push_back(make_pair("Key 1", "Container Value 1 updated"));
  containerRes = container.swiftUpdateMetadata(containerMetaData);
  containerRes->getResponse()->write(cout);
  cout << endl << endl;
  delete containerRes;

  //Show Container metadata
  containerRes = container.swiftShowMetadata();
  containerRes->getResponse()->write(cout);
  cout << endl << endl;
  delete containerRes;

  //Object Test case
  Object object(&container, "Object2 with space");
  string data = "Hello crappy World :)";
  SwiftResult<int*> *objResult = object.swiftCreateReplaceObject(data.c_str(),
      data.length(), true);
  objResult->getResponse()->write(cout);
  cout << endl << endl;
  delete objResult;

  //Object get content
  SwiftResult<istream*>* objReadResult = object.swiftGetObjectContent();
  if(objReadResult->getError().code == SwiftError::SWIFT_OK)
    StreamCopier::copyStream(*objReadResult->getPayload(), cout);
  cout << endl << endl;
  delete objReadResult;

  Object chucnkedObject(&container, "output-@#$%");
  ostream *outStream = nullptr;
  SwiftResult<HTTPClientSession*> *chunkedResult =
      chucnkedObject.swiftCreateReplaceObject(outStream);

  ulong max = INT_MAX / 100000;
  for (ulong i = 0; i < max; i++) {
    *outStream << i << "\n";
    if (i % 1000 == 0) {
      double id = i;
      cout << (id / (double) max) * 100 << " %" << endl;
    }
  }
  HTTPResponse response;
  chunkedResult->getPayload()->receiveResponse(response);
  response.write(cout);
  cout << endl << endl;
  delete chunkedResult;

  //Object get content
  SwiftResult<istream*> *readResult = chucnkedObject.swiftGetObjectContent();
  //StreamCopier::copyStream(*readResult->getPayload(),cout);cout<<endl<<endl;
  int bufSize = 1000000;
  char buf[bufSize];
  while (!readResult->getPayload()->eof())
    readResult->getPayload()->read(buf, bufSize);
  delete readResult;

  //Copy Object
  SwiftResult<int*>* copyResult = chucnkedObject.swiftCopyObject(
      "CopyStreamObject", container);
  copyResult->getResponse()->write(cout);
  cout << endl << endl;
  delete copyResult;

  //Delete Object
  Object copyStreamObject(&container, "CopyStreamObject");
  SwiftResult<istream*>* deleteResult = copyStreamObject.swiftDeleteObject();
  if(deleteResult->getError().code == SWIFT_OK.code)
    StreamCopier::copyStream(*deleteResult->getPayload(), cout);
  cout << endl << endl;
  delete deleteResult;

  //Object create Metadata
  map<string, string> metaDataMap;
  metaDataMap.insert(make_pair("Key1", "metaData stream object Value 1"));
  SwiftResult<istream*>* createMetaResult = chucnkedObject.swiftCreateMetadata(
      metaDataMap);
  createMetaResult->getResponse()->write(cout);
  if (createMetaResult->getPayload() != nullptr)
    StreamCopier::copyStream(*createMetaResult->getPayload(), std::cout);
  cout << endl << endl;
  delete createMetaResult;

  //Object show Metadata
  cout << endl << endl << "MetaDataResult:" << endl;
  SwiftResult<int*>* metaDataShowResult = chucnkedObject.swiftShowMetadata();
  metaDataShowResult->getResponse()->write(cout);
  cout << endl << endl;
  delete metaDataShowResult;

  //Add More Metadata
  metaDataMap.clear();
  metaDataMap.insert(make_pair("Key2", "metaData Value 2"));
  metaDataMap.insert(make_pair("Key 3", "metaData Value 3"));
  SwiftResult<std::istream*>* objMetaRes = chucnkedObject.swiftCreateMetadata(metaDataMap);
  delete objMetaRes;


  //Update Metadata
  metaDataMap.clear();
  metaDataMap.insert(make_pair("Key2", "Updated metaData Gholi Value 2"));
  objMetaRes = chucnkedObject.swiftUpdateMetadata(metaDataMap);
  delete objMetaRes;

  //Delete metadata
  vector<string> keysToDelete;
  keysToDelete.push_back("Key 3");
  objMetaRes = chucnkedObject.swiftDeleteMetadata(keysToDelete);
  delete objMetaRes;

  //Object show Metadata
  cout << endl << endl << "MetaDataResult:" << endl;
  metaDataShowResult = chucnkedObject.swiftShowMetadata();
  metaDataShowResult->getResponse()->write(cout);
  cout << endl << endl;
  delete metaDataShowResult;

  //Total number of calls to the api
  cout << "Total Number of Calls to the api:"
      << authenticateResult->getPayload()->getNumberOfCalls() << endl;

  delete authenticateResult;
}