1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
int server::start()
{
if((socket_server = socket(AF_INET, SOCK_STREAM, 0)) < 0){
std::cout<<"Socket creation error !\n"<<std::endl;
return EXIT_FAILURE;
}
if(bind(socket_server,
(struct sockaddr*)&sockaddr_server,
server_len
) < 0){
std::cout<<"Socket bind error !\n"<<std::endl;
return EXIT_FAILURE;
}
if(listen(socket_server, 50) < 0){
std::cout<<"Socket listen error !\n"<<std::endl;
return EXIT_FAILURE;
}
while (1){
PSOCKET_GROUP socketGroup;
struct sockaddr_in sockaddIn;
unsigned int sockaddrLen;
pthread_t threadSender, threadReceiver;
sigset_t sig_mask;
sockaddrLen = sizeof(sockaddIn);
socketGroup = (PSOCKET_GROUP) malloc ( sizeof(SOCKET_GROUP) );
socketGroup->socketToClient = accept(socket_server,
(struct sockaddr *)&sockaddIn,
&sockaddrLen
);
socketGroup->socketToServer=-1;
sigaddset(&sig_mask, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &sig_mask, NULL);
pthread_create(&threadReceiver,
NULL,
proxyThread,
( void* ) socketGroup
);
}
}
void* server::proxyThread( void* socketAdress )
{
BUFFER buff, buff2, tmp, allReceive;
int port, socketToHost, len;
long int receivedLen=0;
PSOCKET_GROUP sockG;
sockG = static_cast<PSOCKET_GROUP>(socketAdress);
buff = (BUFFER) malloc (100*MAX_RECEIVE*sizeof(char));
buff2 = (BUFFER) malloc (1000*MAX_RECEIVE*sizeof(char));
allReceive = (BUFFER) malloc (1000*MAX_RECEIVE*sizeof(char));
Connection* con = new Connection ();
len=con->receiveData( sockG->socketToClient, buff );
buff[len]=0;
shutdown(sockG->socketToClient,0);
if ((tmp=strstr(buff,"keep-alive\r\n"))) {
strncpy(tmp, "close\r\n", 7);
strcpy(tmp + 7, tmp + strlen("keep-alive\r\n"));
}
sockG->socketToServer =con->sendData( "",
3128,
buff,
len
);
free(buff);
while((len=read(sockG->socketToServer, buff2, 100*MAX_RECEIVE*sizeof(char)))>0){
memcpy(allReceive+receivedLen, buff2, len);
receivedLen+=len;
}
free(buff2);
char *document=NULL, *header=NULL, *docType=NULL;
Text text;
long int docLength, i;
header = HTTPParser::getHeader(allReceive);
docLength = HTTPParser::getDocumentLength(header);
if (docLength>200){
docType = HTTPParser::getDocumentType(header);
if(strncmp(docType, "image/jpeg", strlen("image/jpeg"))==0||
strncmp(docType, "image/png", strlen("image/png"))==0||
strncmp(docType, "image/tiff", strlen("image/tiff"))==0
){
Compression *comp = new Compression(1, sockG->threadContext);
document = HTTPParser::getDocument(allReceive);
int j = strlen(text.getStrInt(docLength));
Magick::Blob* blob = new Magick::Blob((const void *)document, docLength);
Magick::Blob retBlob = comp->getCompressedImage(blob);
i = text.getStrPos(header, "Content-Length: ", 0)+strlen("Content-Length: ");
char *newHeader = text.strReplace(header,
text.getStrInt(docLength),
i,
j
);
memset(allReceive, 0, 1000*MAX_RECEIVE*sizeof(char));
memcpy(allReceive, newHeader, strlen(header));
memcpy(allReceive + strlen(header), (char *)retBlob.data(), retBlob.length());
receivedLen = retBlob.length() + strlen(header);
delete comp;
free(newHeader);
free(header);
}
}
write(sockG->socketToClient, allReceive, receivedLen);
free(allReceive);
delete con;
shutdown(sockG->socketToClient, 2);
close(sockG->socketToClient);
shutdown(sockG->socketToServer, 2);
close(sockG->socketToServer);
pthread_exit(NULL);
} |