void HTTPResponseTest::testWrite1() { HTTPResponse response; std::ostringstream ostr; response.write(ostr); std::string s = ostr.str(); assert (s == "HTTP/1.0 200 OK\r\n\r\n"); }
void DataSender::makeRequest() { HTTPClientSession session(_address); //s.setProxy("localhost", srv.port()); HTTPRequest request(HTTPRequest::HTTP_POST, "/TSPResults.json"); // This will have to change request.setContentType("application/json"); request.setKeepAlive(true); session.sendRequest(request) << generateRequestPOSTString(); HTTPResponse response; std::istream& rs = session.receiveResponse(response); // Output the HTTP response message and the content of the message response.write(cout) ; Poco::StreamCopier::copyStream(rs, cout); }
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; }
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; }