#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <map>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
const int PORT = 8080;
// Function to parse query string into key-value pairs
std::map<std::string, std::string> parseQueryString(const std::string& query) {
std::map<std::string, std::string> params;
std::stringstream ss(query);
std::string param;
while (std::getline(ss, param, '&')) {
size_t pos = param.find('=');
if (pos != std::string::npos) {
std::string key = param.substr(0, pos);
std::string value = param.substr(pos + 1);
params[key] = value;
}
}
return params;
}
// Function to generate HTML response
std::string generateHtmlResponse(const std::map<std::string, std::string>& params) {
std::stringstream html;
html << "HTTP/1.1 200 OK\r\n";
html << "Content-Type: text/html\r\n";
html << "Connection: close\r\n";
html << "\r\n";
html << "<!DOCTYPE html>\n";
html << "<html>\n";
html << "<head><title>Query String Info</title></head>\n";
html << "<body>\n";
html << "<h1>Query String Parameters</h1>\n";
if (params.empty()) {
html << "<p>No query parameters found.</p>\n";
} else {
html << "<table border='1'>\n";
html << "<tr><th>Parameter</th><th>Value</th></tr>\n";
for (const auto& param : params) {
html << "<tr><td>" << param.first << "</td><td>" << param.second << "</td></tr>\n";
}
html << "</table>\n";
}
html << "</body>\n";
html << "</html>\n";
return html.str();
}
int main() {
// Create socket
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
std::cerr << "Socket creation failed" << std::endl;
return 1;
}
// Set socket options
int opt = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// Configure server address
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// Bind socket
if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
std::cerr << "Bind failed" << std::endl;
return 1;
}
// Listen for connections
if (listen(server_fd, 3) < 0) {
std::cerr << "Listen failed" << std::endl;
return 1;
}
std::cout << "Server running on port " << PORT << std::endl;
std::cout << "Access via: http://localhost:" << PORT << std::endl;
while (true) {
// Accept incoming connection
int addrlen = sizeof(address);
int client_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen);
if (client_socket < 0) {
std::cerr << "Accept failed" << std::endl;
continue;
}
// Read request
char buffer[1024] = {0};
read(client_socket, buffer, 1024);
// Parse the request line
std::string request(buffer);
size_t getPos = request.find("GET ");
if (getPos != std::string::npos) {
size_t pathEnd = request.find(" ", getPos + 4);
std::string path = request.substr(getPos + 4, pathEnd - (getPos + 4));
// Extract query string
std::string query;
size_t queryPos = path.find('?');
if (queryPos != std::string::npos) {
query = path.substr(queryPos + 1);
}
// Parse query parameters
auto params = parseQueryString(query);
// Generate and send response
std::string response = generateHtmlResponse(params);
write(client_socket, response.c_str(), response.length());
}
// Close client connection
close(client_socket);
}
// Close server socket (unreachable in this example)
close(server_fd);
return 0;
}