|  | @@ -50,6 +50,7 @@ struct mg_form_data_handler {
 | 
											
												
													
														|  |  	void *user_data;
 |  |  	void *user_data;
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  int mg_handle_form_data(struct mg_connection *conn,
 |  |  int mg_handle_form_data(struct mg_connection *conn,
 | 
											
												
													
														|  |                          struct mg_form_data_handler *fdh);
 |  |                          struct mg_form_data_handler *fdh);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -65,7 +66,6 @@ url_encoded_field_found(const char *key,
 | 
											
												
													
														|  |                          size_t path_len,
 |  |                          size_t path_len,
 | 
											
												
													
														|  |                          struct mg_form_data_handler *fdh)
 |  |                          struct mg_form_data_handler *fdh)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  | -	/* Call callback */
 |  | 
 | 
											
												
													
														|  |  	char key_dec[1024];
 |  |  	char key_dec[1024];
 | 
											
												
													
														|  |  	char filename_dec[1024];
 |  |  	char filename_dec[1024];
 | 
											
												
													
														|  |  	int key_dec_len;
 |  |  	int key_dec_len;
 | 
											
										
											
												
													
														|  | @@ -100,24 +100,41 @@ url_encoded_field_found(const char *key,
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  static int
 |  |  static int
 | 
											
												
													
														|  |  url_encoded_field_get(const char *key,
 |  |  url_encoded_field_get(const char *key,
 | 
											
												
													
														|  | -                      size_t keylen,
 |  | 
 | 
											
												
													
														|  | 
 |  | +                      size_t key_len,
 | 
											
												
													
														|  |                        const char *filename,
 |  |                        const char *filename,
 | 
											
												
													
														|  | 
 |  | +                      size_t filename_len,
 | 
											
												
													
														|  |                        const char *value,
 |  |                        const char *value,
 | 
											
												
													
														|  | -                      size_t valuelen,
 |  | 
 | 
											
												
													
														|  | 
 |  | +                      size_t value_len,
 | 
											
												
													
														|  |                        struct mg_form_data_handler *fdh)
 |  |                        struct mg_form_data_handler *fdh)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |  	char key_dec[1024];
 |  |  	char key_dec[1024];
 | 
											
												
													
														|  | -	char *value_dec = mg_malloc(valuelen + 1);
 |  | 
 | 
											
												
													
														|  | 
 |  | +	char filename_dec[1024];
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	char *value_dec = mg_malloc(value_len + 1);
 | 
											
												
													
														|  | 
 |  | +	int value_dec_len;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  	if (!value_dec) {
 |  |  	if (!value_dec) {
 | 
											
												
													
														|  |  		/* TODO: oom */
 |  |  		/* TODO: oom */
 | 
											
												
													
														|  |  		return FORM_DISPOSITION_ABORT;
 |  |  		return FORM_DISPOSITION_ABORT;
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	mg_url_decode(key, (size_t)keylen, key_dec, (int)sizeof(key_dec), 1);
 |  | 
 | 
											
												
													
														|  | -	mg_url_decode(value, (size_t)valuelen, value_dec, (int)valuelen + 1, 1);
 |  | 
 | 
											
												
													
														|  | 
 |  | +	mg_url_decode(key, (size_t)key_len, key_dec, (int)sizeof(key_dec), 1);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	if (filename) {
 | 
											
												
													
														|  | 
 |  | +		mg_url_decode(filename,
 | 
											
												
													
														|  | 
 |  | +		              (size_t)filename_len,
 | 
											
												
													
														|  | 
 |  | +		              filename_dec,
 | 
											
												
													
														|  | 
 |  | +		              (int)sizeof(filename_dec),
 | 
											
												
													
														|  | 
 |  | +		              1);
 | 
											
												
													
														|  | 
 |  | +	} else {
 | 
											
												
													
														|  | 
 |  | +		filename_dec[0] = 0;
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	value_dec_len = mg_url_decode(
 | 
											
												
													
														|  | 
 |  | +	    value, (size_t)value_len, value_dec, (int)value_len + 1, 1);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	return fdh->field_get(
 |  |  	return fdh->field_get(
 | 
											
												
													
														|  | -	    key, keylen, filename, value_dec, strlen(value_dec), fdh->user_data);
 |  | 
 | 
											
												
													
														|  | 
 |  | +	    key, filename, value_dec, value_dec_len, fdh->user_data);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -203,7 +220,7 @@ mg_handle_form_data(struct mg_connection *conn,
 | 
											
												
													
														|  |  			if (disposition == FORM_DISPOSITION_GET) {
 |  |  			if (disposition == FORM_DISPOSITION_GET) {
 | 
											
												
													
														|  |  				/* Call callback */
 |  |  				/* Call callback */
 | 
											
												
													
														|  |  				url_encoded_field_get(
 |  |  				url_encoded_field_get(
 | 
											
												
													
														|  | -				    data, (size_t)keylen, NULL, val, (size_t)vallen, fdh);
 |  | 
 | 
											
												
													
														|  | 
 |  | +				    data, (size_t)keylen, NULL, 0, val, (size_t)vallen, fdh);
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
												
													
														|  |  			if (disposition == FORM_DISPOSITION_STORE) {
 |  |  			if (disposition == FORM_DISPOSITION_STORE) {
 | 
											
												
													
														|  |  				/* Store the content to a file */
 |  |  				/* Store the content to a file */
 |