Code:
int handleHttpRequest(void* socketNum){
char* response; //Holds response
char* request=readClientRequest(socketNum); //Holds request
if (request==NULL){
response=composeHttpResponse(INTERNAL_SERVER_ERR);
sendResponse(socketNum, response);
closeAndDestroy(socketNum, 0, NULL, response, NULL, NULL);
return 0;
}
.
.
//Some more code...
.
.
//Send request to destination server
struct sockaddr_in destSrvr;
int destSrvrFd;
//Create the socket
if ((destSrvrFd=socket(AF_INET,SOCK_STREAM,0))==-1){
response=composeHttpResponse(INTERNAL_SERVER_ERR);
sendResponse(socketNum, response);
closeAndDestroy(socketNum, 0, request, response, host, path);
return 0;
}
//Connection settings
destSrvr.sin_family = AF_INET; //use the Internet address family
destSrvr.sin_port = htons(80); //set port to 80
destSrvr.sin_addr.s_addr = ((struct in_addr*)(hostInfo->h_addr))->s_addr;
//Connect
if (connect(destSrvrFd, (struct sockaddr*) &destSrvr, sizeof(destSrvr)) < 0){
response=composeHttpResponse(INTERNAL_SERVER_ERR);
sendResponse(socketNum, response);
closeAndDestroy(socketNum, destSrvrFd, request, response, host, path);
return 0;
}
//Write client request to destination server
int nbytes=0;
while (nbytes < strlen(request))
if ( (nbytes=write(destSrvrFd, request, strlen(request))) < 0){
response=composeHttpResponse(INTERNAL_SERVER_ERR);
sendResponse(socketNum, response);
closeAndDestroy(socketNum, destSrvrFd, request, response, host, path);
return 0;
}
//Read response from destination server
const int BUFFER_SIZE=512;
char rBuffer[BUFFER_SIZE];
response=(char*)malloc(BUFFER_SIZE+1);
if (response==NULL){
response=composeHttpResponse(INTERNAL_SERVER_ERR);
sendResponse(socketNum, response);
closeAndDestroy(socketNum, destSrvrFd, request, response, host, path);
return 0;
}
nbytes=0;
if ((nbytes = read(destSrvrFd, rBuffer, BUFFER_SIZE)) < 0){
response=composeHttpResponse(INTERNAL_SERVER_ERR);
sendResponse(socketNum, response);
closeAndDestroy(socketNum, destSrvrFd, request, response, host, path);
return 0;
}
rBuffer[BUFFER_SIZE]='\0';
strcpy(response,rBuffer);
while (nbytes!=0){
if ((nbytes = read(destSrvrFd, rBuffer, BUFFER_SIZE)) < 0){
response=composeHttpResponse(INTERNAL_SERVER_ERR);
sendResponse(socketNum, response);
closeAndDestroy(socketNum, destSrvrFd, request, response, host, path);
return 0;
}
rBuffer[BUFFER_SIZE]='\0';
response=realloc(response, strlen(response) + BUFFER_SIZE+1);
strcat(response,rBuffer);
}
//Write server response back to client
//sendResponse(socketNum, response);
nbytes=0;
while (nbytes < strlen(request))
if ( (nbytes=write(*(int*)socketNum, response, strlen(response))) < 0){
response=composeHttpResponse(INTERNAL_SERVER_ERR);
sendResponse(socketNum, response);
closeAndDestroy(socketNum, destSrvrFd, request, response, host, path);
return 0;
}
//Close connections with client and destination server and free memory
closeAndDestroy(socketNum, destSrvrFd, request, response, host, path);
return 0;
}
Code:
//Reads client request. Returns request on success, NULL otherwise
char* readClientRequest(void* socketNum){
int fd=*(int*)socketNum, nbytes=0;
const int BUFFER_SIZE=4096;
char buf[BUFFER_SIZE+1]; //Reading buffer
char* req=(char*)malloc(BUFFER_SIZE+1); //Holds request
if (req==NULL)
return NULL;
//Read request from client
if ((nbytes = read(fd, buf, BUFFER_SIZE)) < 0){
printf("%d\n", fd);
perror("error: read \n"); return NULL;
}
buf[BUFFER_SIZE]='\0';
strcpy(req,buf);
while ( strstr(req,"\r\n\r\n")==NULL ){
if ((nbytes = read(fd, buf, BUFFER_SIZE)) < 0){
perror("error: read\n"); return NULL;
}
buf[BUFFER_SIZE]='\0';
req=realloc(req, strlen(req) + BUFFER_SIZE);
strcat(req,buf);
}
return req;
}