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; }
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; }
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; }
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; }