@@ -67,6 +67,7 @@ gboolean mapserverapi_invoke(const gchar *mapfile_content, const gchar *query_st
6767 g_assert (query_string != NULL );
6868 g_assert (strlen (query_string ) > 0 );
6969 gboolean res ;
70+ gsize i ;
7071 gchar * mapfile_path = get_tmpfilename ();
7172 res = g_file_set_contents (mapfile_path , mapfile_content , -1 , NULL );
7273 if (!res ) {
@@ -78,7 +79,7 @@ gboolean mapserverapi_invoke(const gchar *mapfile_content, const gchar *query_st
7879 g_string_append_printf (gs , "MAP=%s" , mapfile_path );
7980 gs = g_string_append_c (gs , '&' );
8081 if (query_string [0 ] == '?' ) {
81- gs = g_string_append (gs , query_string + sizeof ( gchar ) );
82+ gs = g_string_append (gs , query_string + 1 );
8283 } else {
8384 gs = g_string_append (gs , query_string );
8485 }
@@ -100,43 +101,46 @@ gboolean mapserverapi_invoke(const gchar *mapfile_content, const gchar *query_st
100101 g_free (mapserver_qs );
101102 return FALSE;
102103 }
103- if (strncasecmp ((const char * ) mapserver_buffer , "Content-type: " , 14 ) != 0 ) {
104- g_warning ("bad reply from mapserver for query_string = %s (no Content-Type)" , mapserver_qs );
105- g_free (mapserver_qs );
106- return FALSE;
107- }
108- int end_of_ct = 13 ;
109- while ((end_of_ct + 1 < mapserver_buffer_length ) && (((char * )mapserver_buffer )[end_of_ct + 1 ] != 10 )) {
110- end_of_ct ++ ;
104+ gsize last_i = 0 ;
105+ gchar * ct = NULL ;
106+ const char * mb = (char * ) mapserver_buffer ;
107+ for (i = 0 ; i < mapserver_buffer_length - 1 ; i ++ ) {
108+ if (i > 100 ) {
109+ break ;
110+ }
111+ if ((mb [i ] == '\r' ) && (mb [i + 1 ] == '\n' )) {
112+ if (i == last_i ) {
113+ last_i = i + 2 ;
114+ break ;
115+ }
116+ if (strncmp (mb + last_i , "Content-Type: " , 14 ) == 0 ) {
117+ ct = g_malloc (i - last_i - 14 + 1 );
118+ ct [i - last_i - 14 ] = '\0' ;
119+ memcpy (ct , mapserver_buffer + (last_i + 14 ), i - last_i - 14 );
120+ }
121+ last_i = i + 2 ;
122+ }
111123 }
112- if (end_of_ct + 1 = = mapserver_buffer_length ) {
113- g_warning ("bad reply from mapserver for query_string = %s (bad Content-Type )" , query_string );
124+ if (i > = mapserver_buffer_length ) {
125+ g_message ("bad reply from mapserver for query_string = %s (no body found )" , mapserver_qs );
114126 g_free (mapserver_qs );
115127 return FALSE;
116128 }
117- int start_of_data = end_of_ct + 2 ;
118- while ((start_of_data < mapserver_buffer_length ) && (((char * )mapserver_buffer )[start_of_data ] != 10 )) {
119- start_of_data ++ ;
120- }
121- if (start_of_data == mapserver_buffer_length ) {
122- g_warning ("bad reply from mapserver for query_string = %s (corrupt Content-Type)" , mapserver_qs );
129+ if (ct == NULL ) {
130+ g_message ("bad reply from mapserver for query_string = %s (no Content-Type found)" , mapserver_qs );
123131 g_free (mapserver_qs );
124132 return FALSE;
125133 }
126- start_of_data ++ ;
127- gchar * ct = g_malloc ((end_of_ct - 14 + 2 ) * sizeof (gchar ));
128- memcpy (ct , mapserver_buffer + 14 * sizeof (gchar ), sizeof (gchar ) * (end_of_ct - 14 + 2 ));
129- ct [end_of_ct - 14 + 1 ] = '\0' ;
130134 if (content_type != NULL ) {
131- * content_type = g_strstrip ( ct ) ;
135+ * content_type = ct ;
132136 } else {
133137 g_free (ct );
134138 }
135139 if (body != NULL ) {
136- * body = mapserver_buffer + start_of_data * sizeof ( gchar ) ;
140+ * body = mapserver_buffer + last_i ;
137141 }
138142 if (body_length != NULL ) {
139- * body_length = mapserver_buffer_length - start_of_data ;
143+ * body_length = mapserver_buffer_length - last_i ;
140144 }
141145 g_free (mapserver_qs );
142146 return res ;
0 commit comments