Salome HOME
fix syntax error: do POST instead of PUT
[modules/gde.git] / projects / GDE_API_CPP / api / src / HttpConnection.cpp
1 #include "HttpConnection.hpp"
2 #include "JsonFormatter.hpp"
3
4 #include <iostream>
5 #include <fstream>
6 #include <sstream>
7
8 #include <Poco/StreamCopier.h>
9 #include <Poco/Net/HTTPResponse.h>
10
11 using namespace Poco::Net;
12
13 gde::HttpConnection::HttpConnection(Poco::URI uri)
14   : _path("/")
15 {
16   try {
17     _session.setHost(uri.getHost());
18     _session.setPort(uri.getPort());
19     //_session.setProxy(machine, port);
20   } catch (Poco::Exception& e) {
21     std::cerr << e.displayText() << std::endl;
22     return;
23   }
24
25   _path = uri.getPathAndQuery();
26   if (_path.empty())
27     _path = "/";
28 }
29
30 gde::HttpConnection::~HttpConnection()
31 {
32 }
33
34 // Workflow:
35 // 1. request (json) --> CommandTO object
36 // 2. command data (json) from CommandTO --> <something>TO
37 // 3. call DAO with <something>TO and obtain another <something>TO
38 // 4. latter <something>TO --> (json) CommandResultTO data
39 // 5. set CommandResultTO code
40 // 6. CommandResultTO --> (json) response
41
42 gde::CommandResultTO
43 gde::HttpConnection::_processRequest(const HTTPRequest& request,
44                                      const std::string& requestBody)
45 {
46   int code = CommandResultTO::OK;
47   std::string message = "";
48   std::string data = "";
49
50   std::cout << "processRequest: body = " << requestBody << std::endl;
51
52   try {
53     std::cout << "Sending request...\n";
54     std::ostream& os = _session.sendRequest((HTTPRequest&)request);
55     // Send request body, if any
56     if (!requestBody.empty()) {
57       std::istringstream iss(requestBody);
58       Poco::StreamCopier::copyStream((std::istream&)iss, os);
59     }
60
61     std::cout << "Getting response...\n";
62     // Get response
63     HTTPResponse response;
64     std::istream& rs = _session.receiveResponse(response);
65     std::cout << response.getStatus() << " " << response.getReason() << std::endl;
66     std::ostringstream responseBody;
67     Poco::StreamCopier::copyStream(rs, responseBody);
68     // responseBody contains a CommandResultTO in json format
69     std::cout << "Returning result...\n";
70     return CommandResultTO::fromJson(responseBody.str());
71   } catch (Poco::Exception& e) {
72     std::cerr << e.displayText() << std::endl;
73     return CommandResultTO(CommandResultTO::ERROR);
74   }
75 }
76
77 gde::CommandResultTO
78 gde::HttpConnection::doGet(const CommandTO& cto)
79 {
80   HTTPRequest request(HTTPRequest::HTTP_GET, _path, HTTPMessage::HTTP_1_1);
81   return _processRequest(request, cto.getData());
82 }
83
84 gde::CommandResultTO
85 gde::HttpConnection::doPost(const CommandTO& cto)
86 {
87   HTTPRequest request(HTTPRequest::HTTP_POST, _path, HTTPMessage::HTTP_1_1);
88   return _processRequest(request, cto.getData());
89 }