salut tout le monde comme indiqué dans le titre, j'ai programme qui foire de tout les cotés et il va pas tarder a foutre ma cervelle en l'air

apres des semaines de recherche, de debogage, de demande d'aide sur d'autre forum je commence a me dire que c'est un bug dans ImageMagick (c'est mieux que de n'avoir aucun coupable !), mais bon je poste le code au cas ou un connaisseur passe par la, qu'il soit gentil de lire tout le code et qu'il soit super gentil de me repondre.

il s'agit d'un proxy qui compresse les images jpg, png et tiff
classe Server :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
}
classe HTTPParser :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
BUFFER HTTPParser::getDocument( BUFFER buff )
{
	int taille;
	char * ret;
	taille = getDocumentLength( buff );
	ret = (char *) malloc (taille*sizeof(char));
	memcpy(ret, strstr(buff, "\r\n\r\n")+sizeof("\r\n\r\n")-1, taille);
	return ret;
}
 
BUFFER HTTPParser::getHeader( BUFFER buff )
{
	char * buffer;
	int ind;
 
	for (ind=0; buff[ind]!='\r'||buff[ind+1]!='\n'||buff[ind+2]!='\r'||buff[ind+3]!='\n'; ind+=1);
	buffer = (char*) malloc ((ind+5)*sizeof(char));
	strncpy(buffer, buff, (ind+4)*sizeof(char));
	return buffer;
}
 
int HTTPParser::getDocumentLength(BUFFER header)
{
	if (!strstr(header, "Content-Length: "))return -1;
	return atoi(strstr(header, "Content-Length: ")+strlen("Content-Length: "));
}
 
BUFFER HTTPParser::getDocumentType( BUFFER header )
{
	char *buff, *tmp;
	int ind;
	Text text;
	tmp = strstr(header, "Content-Type: ")+strlen("Content-Type: ");
	ind = text.getCharPos(tmp, '\r');
	buff = (char*) malloc ((ind+1)*sizeof(char));
	strncpy(buff, tmp, ind);
	return buff;
}
classe Compression
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
Magick::Blob Compression::getCompressedImage( Magick::Blob *blob )
{
	Magick::Image* image = new Magick::Image(*blob);
	Magick::Blob retBlob;
 
	image->magick( "JPEG" );
	image->quality(this->getQuality());
	image->write(&retBlob);
	delete image;
	return retBlob;
}
classe Text :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
int Text::getStrPos(char* str, char* c, int searchStart)
{
	int i;
 
	for ( i = searchStart; str[i]; i++)
		if (strncmp( str+i, c, strlen(c) )==0)break;
	if(!str[i]) return -1;
	return i;
}
 
char* Text::getStrInt(int val)
{
	char *retVal;
 
	std::stringstream ss;
	std::string str;
	ss << val;
	ss >> str;
	retVal = (char *) calloc (str.size()+1, sizeof(char));
	strcpy(retVal, str.c_str());
	return retVal;
}
 
int Text::getCharPos(char* str, char c)
{
	int i;
 
	for (i=0; str[i]!=c; i++);
	return i;
}
 
char* Text::strReplace(char* dest, char* replacement, int pos, int offset)
{
	char* retStr;
 
	retStr = (char*) calloc (strlen(dest), sizeof(char));
	strncpy(retStr, dest, pos);
	strncpy(retStr+pos, replacement, strlen(replacement));
	strncpy(retStr+pos+strlen(replacement), dest+pos+offset, strlen(dest+pos+offset));
	if (strstr(retStr, "\r\n\r\n"))
		*(strstr(retStr, "\r\n\r\n")+strlen("\r\n\r\n"))=0;
	return retStr;
}
voila le main contient juste un
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
Server serv=new Server(8080);
server->start();
avec firefox configuré, j'ai qulques images affichées avant la grande fête ; l'erreur survient à la ligne "image(blob)"de la classe Compression.

voila mesdames et messieurs, merci pour votre attention et à la prochaine .