simple HTTP post support (urlencode parameters)
This commit is contained in:
		
							
								
								
									
										12
									
								
								ws/ws.cpp
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								ws/ws.cpp
									
									
									
									
									
								
							| @@ -17,7 +17,8 @@ | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
|     int ws_http_client_main(const std::string& url); | ||||
|     int ws_http_client_main(const std::string& url, | ||||
|                             const std::string& data); | ||||
|  | ||||
|     int ws_ping_pong_main(const std::string& url); | ||||
|  | ||||
| @@ -47,11 +48,13 @@ int main(int argc, char** argv) | ||||
|     std::string url("ws://127.0.0.1:8080"); | ||||
|     std::string path; | ||||
|     std::string user; | ||||
|     std::string data; | ||||
|     int port = 8080; | ||||
|  | ||||
|     CLI::App* sendApp = app.add_subcommand("send", "Send a file"); | ||||
|     sendApp->add_option("url", url, "Connection url")->required(); | ||||
|     sendApp->add_option("path", path, "Path to the file to send")->required(); | ||||
|     sendApp->add_option("path", path, "Path to the file to send") | ||||
|         ->required()->check(CLI::ExistingPath); | ||||
|  | ||||
|     CLI::App* receiveApp = app.add_subcommand("receive", "Receive a file"); | ||||
|     receiveApp->add_option("url", url, "Connection url")->required(); | ||||
| @@ -77,6 +80,8 @@ int main(int argc, char** argv) | ||||
|  | ||||
|     CLI::App* httpClientApp = app.add_subcommand("http_client", "HTTP Client"); | ||||
|     httpClientApp->add_option("url", url, "Connection url")->required(); | ||||
|     httpClientApp->add_option("-d", data, "Form data")->join(); | ||||
|     httpClientApp->add_option("-F", data, "Form data")->join(); | ||||
|  | ||||
|     CLI11_PARSE(app, argc, argv); | ||||
|  | ||||
| @@ -117,7 +122,8 @@ int main(int argc, char** argv) | ||||
|     } | ||||
|     else if (app.got_subcommand("http_client")) | ||||
|     { | ||||
|         return ix::ws_http_client_main(url); | ||||
|         std::cout << "data: " << data << std::endl; | ||||
|         return ix::ws_http_client_main(url, data); | ||||
|     } | ||||
|  | ||||
|     return 1; | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| // | ||||
| // Simple chat program that talks to the node.js server at | ||||
| // websocket_chat_server/broacast-server.js | ||||
| //  | ||||
| // | ||||
| #include <iostream> | ||||
| #include <sstream> | ||||
| #include <queue> | ||||
|   | ||||
| @@ -10,11 +10,51 @@ | ||||
|  | ||||
| namespace ix | ||||
| { | ||||
|     void ws_http_client_main(const std::string& url) | ||||
|     // | ||||
|     // Useful endpoint to test HTTP post | ||||
|     // https://postman-echo.com/post | ||||
|     // | ||||
|     HttpParameters parsePostParameters(const std::string& data) | ||||
|     { | ||||
|         HttpParameters httpParameters; | ||||
|  | ||||
|         // Split by ; | ||||
|         std::string token; | ||||
|         std::stringstream tokenStream(data); | ||||
|  | ||||
|         while (std::getline(tokenStream, token)) | ||||
|         { | ||||
|             std::size_t pos = token.rfind('='); | ||||
|  | ||||
|             // Bail out if last '.' is found | ||||
|             if (pos == std::string::npos) continue; | ||||
|  | ||||
|             auto key = token.substr(0, pos); | ||||
|             auto val = token.substr(pos+1); | ||||
|  | ||||
|             std::cout << key << ": " << val << std::endl; | ||||
|             httpParameters[key] = val; | ||||
|         } | ||||
|  | ||||
|         return httpParameters; | ||||
|     } | ||||
|  | ||||
|     int ws_http_client_main(const std::string& url, | ||||
|                             const std::string& data) | ||||
|     { | ||||
|         HttpParameters httpParameters = parsePostParameters(data); | ||||
|  | ||||
|         HttpClient httpClient; | ||||
|         bool verbose = true; | ||||
|         auto out = httpClient.get(url, verbose); | ||||
|         HttpResponse out; | ||||
|         if (data.empty()) | ||||
|         { | ||||
|             out = httpClient.get(url, verbose); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             out = httpClient.post(url, httpParameters, verbose); | ||||
|         } | ||||
|         auto errorCode = std::get<0>(out); | ||||
|         auto headers = std::get<1>(out); | ||||
|         auto payload = std::get<2>(out); | ||||
| @@ -32,5 +72,7 @@ namespace ix | ||||
|         } | ||||
|  | ||||
|         std::cout << "payload: " << payload << std::endl; | ||||
|  | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user