Code:
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>
#include <string.h>
/********************************************************
* Multithreaded HTTP Web Proxy coded in C *
* *
* Authors: Alexander Hollis, Isaias Delgado *
* *
* Purpose: Demonstration of a Multi-Thread Proxy in C *
* *
* Usage: *
* Refer to included manual for proper usage. *
********************************************************/
int main() {
char response[] = "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html; charset=UTF-8\r\n\r\n"
"<doctype !html>\r\n";
char error[] = "HTTP/1.1 404 Not Found\r\n"
"Content-Type: text/html; charset=UTF-8\r\n\r\n"
"<doctype !html><html><head><title>HTML Generator Sample Page</title>"
"</head><body><h2>404: Page Not Found</h2><p>The page you requested was not able to be located, please check your address!</p>"
"</body></html>\r\n\n";
char buffer[256], *token;
char tokens [256][25];
int one = 1, client_fd;
struct sockaddr_in svr_addr, cli_addr, out_addr;
socklen_t sin_len = sizeof(cli_addr);
int sock = socket(AF_INET, SOCK_STREAM, 0);
int remote;
if (sock < 0)
err(1, "can't open socket");
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));
//setsockopt(remote, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));
int port = 8083;
svr_addr.sin_family = AF_INET;
svr_addr.sin_addr.s_addr = INADDR_ANY;
svr_addr.sin_port = htons(port);
out_addr.sin_family = AF_INET;
out_addr.sin_addr.s_addr = INADDR_ANY;
out_addr.sin_port = htons(80);
if (bind(sock, (struct sockaddr *) &svr_addr, sizeof(svr_addr)) == -1) {
close(sock);
err(1, "Can't bind");
}
listen(sock, 5);
int bytesread, byteswritten;
char *url;
//struct hostent *h;
struct addrinfo hints, *res, *p;
int remote_fd;
char page[2000];
char *html;
int err;
char get[] = "GET /index.html HTTP/1.0\r\n\r\n";
while(1) {
bytesread =0;
byteswritten=0;
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;
client_fd = accept(sock, (struct sockaddr *) &cli_addr, &sin_len);
read(client_fd, buffer, 256);
//write(client_fd, error, sizeof(error));
//send(client_fd, &error, sizeof(error)-1, 0);
int x=0;
for(token = strtok(buffer, " "); token!=NULL; token = strtok(NULL, " ") )
{
strcpy(tokens[x],token);
x++;
}
url = tokens[1] +1;
//strcat(get,url);
//strcat(get,"/index.html HTTP/1.0\n\n");
//printf("GET: %s\n",get);
if(strcmp(url, "index.html") != 0) {
//h = gethostbyname(url);
if((err = getaddrinfo(url, "http", &hints, &res)) != 0) printf("Error finding address, addrinfo returned %d.\n",err);
//out_addr.s_addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr;
//bcopy ( (char *)res->ai_addr, (char *)&(out_addr.sin_addr.s_addr), res->ai_addrlen);
for(p = res; p!= NULL; p = p->ai_next) {
if((remote_fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
perror("socket");
continue;
}
if(connect(remote_fd, p->ai_addr, p->ai_addrlen) == -1) {
close(remote);
perror("connect");
continue;
}
break;
}
while (1) {
printf("url: %s\n", url);
//if(remote_fd = connect(remote, (struct sockaddr *) &out_addr, sizeof(out_addr)) < 0) printf("Connection Failed!\n");
//printf("remote_fd = %d\n",remote_fd);
if(send(remote_fd, get, sizeof(get),0) < 0) printf("Send Failed!\n");
bytesread = recv(remote_fd, page, 2000,0);
if(bytesread > 0) printf("Receiving Data from Host...\n\n\n");
puts(page);
/*html = (char *)malloc(sizeof(char) * bytesread);
int k=0;
for(k=0; k< bytesread; k++) {
html[k] = page[k];
printf("%c",html[k]);
}
printf("\n");
printf("page[3]=%c\n",page[3]);
*/
//clearwrite(client_fd, response, sizeof(response)-1);
write(client_fd, page, sizeof(page));
break;
}
}
}
}