Advertisement
Guest User

Untitled

a guest
Nov 17th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <fcntl.h>
  7. #include <bits/stdc++.h>
  8. #include <arpa/inet.h>
  9. #include <signal.h>
  10. #include <pthread.h>
  11. #include <unistd.h>
  12. #include "Request.h"
  13.  
  14. //#define ROOT "/home/karfass/Networks/SimpleHTTPClient-Sever"
  15.  
  16. #define BUFFER_SIZE 1024
  17. const std::string OK_MSG = "HTTP/1.1 200 OK";
  18. const std::string CONTENT_TYPE = "Content-Type:";
  19. const std::string CONTENT_LEN = "Content-length:";
  20. const std::string NOT_FOUND = "HTTP/1.1 404 Not Found";
  21. const std::string CONNECTION = "Connection: Keep-Alive";
  22. const std::string END = "\r\n";
  23. std::string ROOT;
  24.  
  25. using namespace std;
  26.  
  27. void message(const char* msg, bool exi) {
  28. perror(msg);
  29. if (exi) exit(-1);
  30. }
  31.  
  32. int openServer(const int portNumber) {
  33.  
  34. struct sockaddr_in serverAddress;
  35. int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
  36. if (serverSocket < 0) {
  37. message("Error in creating socket", true);
  38. }
  39. bzero(&serverAddress, sizeof(serverAddress));
  40. serverAddress.sin_family = AF_INET;
  41. serverAddress.sin_addr.s_addr = INADDR_ANY;
  42. serverAddress.sin_port = htons(portNumber);
  43. if (bind(serverSocket, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) {
  44. message("Error in binding", true);
  45. }
  46. if (listen(serverSocket, 300) < 0) {
  47. message("Problem in listening in server socket", true);
  48. }
  49. return serverSocket;
  50. }
  51.  
  52.  
  53. void handleGetRequest(Request request, int client) {
  54. std::string fileName = request.getField(FILE_NAME);
  55. std::string extension = utility::getExtension(fileName);
  56. char buffer[BUFFER_SIZE];
  57. bzero(buffer, sizeof(buffer));
  58. if(!utility::isFileExists(ROOT + fileName)) {
  59. strcpy(buffer, (NOT_FOUND + END + CONTENT_LEN + " " + "0" + END + CONNECTION + END + END).c_str());
  60. send(client, buffer, sizeof(buffer), 0);
  61. return;
  62. }
  63. std::string fileContent = utility::readFile(ROOT + fileName);
  64. std::string response = OK_MSG + END + CONTENT_TYPE + " " + extension + END + CONTENT_LEN + " " +
  65. std::to_string(fileContent.size()) + END + CONNECTION + END + END + fileContent;
  66. int i = 0;
  67. while(i < response.size()) {
  68. if(i % BUFFER_SIZE == 0 && i != 0) {
  69. send(client, buffer, sizeof(buffer), 0);
  70. bzero(buffer, sizeof(buffer));
  71. }
  72. buffer[i % BUFFER_SIZE] = response[i];
  73. i++;
  74. }
  75. send(client, buffer, sizeof(buffer), 0);
  76. }
  77.  
  78. void handlePostRequest(Request request, int client){
  79. std::string fileName = request.getField(FILE_NAME);
  80. std::ofstream outputFile(ROOT + fileName);
  81. char buffer[BUFFER_SIZE];
  82. strcpy(buffer, OK_MSG.c_str());
  83. send(client, buffer, sizeof(buffer), 0);
  84. int size = utility::extractNumber(utility::trim(request.getField(CONTENT_LEN)));
  85. while(size > 0) {
  86. int sizeRead = recv(client, buffer, sizeof(buffer), 0);
  87. size -= sizeRead;
  88. outputFile.write(buffer, size);
  89. }
  90. }
  91.  
  92.  
  93. void* serve(void* clientAddr) {
  94. // time_t lastTimeEvoked = time(0);
  95. // tm *ltm = localtime(&lastTimeEvoked);
  96. // time_t current = time(0);
  97. // tm *ctm = localtime(&current);
  98. int client = *((int *) clientAddr);
  99. fd_set readfds;
  100. struct timeval tv;
  101. FD_ZERO(&readfds);
  102. FD_SET(client, &readfds);
  103. tv.tv_sec = 20;
  104. tv.tv_usec = 500000;
  105.  
  106. while (true) {
  107.  
  108. int rv = select(client + 1, &readfds, NULL, NULL, &tv);
  109. // cout<<"still after select connected\n";
  110. char buffer[BUFFER_SIZE];
  111. bzero(buffer, sizeof(buffer));
  112. if (rv == -1) {
  113. cout<<"error\n";
  114. perror("select"); // error occurred in select()
  115. } else if (rv == 0) {
  116. printf("Timeout occurred! No data after 20.5 seconds.\n");
  117. break;
  118. } else {
  119. // one or both of the descriptors have data
  120. if (FD_ISSET(client, &readfds)) {
  121. int bytes_read = recv(client, buffer, sizeof buffer, 0);
  122. cout<< bytes_read << endl;
  123. if (bytes_read > 0) {
  124. std::string requestStr(buffer);
  125. Request request(requestStr);
  126. if (request.getRequestType() == "GET") {
  127. handleGetRequest(request, client);
  128. } else if (request.getRequestType() == "POST") {
  129. handlePostRequest(request, client);
  130. }
  131. } else if (bytes_read < 0) {
  132. message("Problem with recv call", false);
  133. }
  134. }
  135.  
  136. }
  137. // int bytes_read = recv(client, buffer, sizeof(buffer), MSG_DONTWAIT);
  138. // cout<<"still\n";
  139. }
  140. cout<<"finish"<<endl;
  141. int rc = close(client);
  142. pthread_exit(0);
  143. }
  144.  
  145.  
  146. int main(int arg, char** argv) {
  147. struct sockaddr_in clientAddress;
  148. socklen_t size = sizeof(clientAddress);
  149. int portNumber = 8000;
  150. if (arg < 2) {
  151. ROOT = "/home/karfass/Networks/SimpleHTTPClient-Sever";
  152.  
  153. } else {
  154. ROOT = argv[1];
  155. portNumber = atoi(argv[2]);
  156. }
  157. int sock = openServer(portNumber);
  158. while (true) {
  159. int client = accept(sock, (struct sockaddr *) &clientAddress, &size);
  160. cout << "accept" << endl;
  161. if (client < 0) {
  162. message("Problem accepting client", true);
  163. }
  164. pthread_t tid;
  165. int flag = pthread_create(&tid, NULL, serve, &client);
  166. if (flag < 0) {
  167. message("Problem creating thread", false);
  168. }
  169. }
  170. return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement