|  | @@ -2059,6 +2059,8 @@ enum {
 | 
											
												
													
														|  |  	ACCESS_CONTROL_ALLOW_ORIGIN,
 |  |  	ACCESS_CONTROL_ALLOW_ORIGIN,
 | 
											
												
													
														|  |  	ACCESS_CONTROL_ALLOW_METHODS,
 |  |  	ACCESS_CONTROL_ALLOW_METHODS,
 | 
											
												
													
														|  |  	ACCESS_CONTROL_ALLOW_HEADERS,
 |  |  	ACCESS_CONTROL_ALLOW_HEADERS,
 | 
											
												
													
														|  | 
 |  | +	ACCESS_CONTROL_EXPOSE_HEADERS,
 | 
											
												
													
														|  | 
 |  | +	ACCESS_CONTROL_ALLOW_CREDENTIALS,
 | 
											
												
													
														|  |  	ERROR_PAGES,
 |  |  	ERROR_PAGES,
 | 
											
												
													
														|  |  #if !defined(NO_CACHING)
 |  |  #if !defined(NO_CACHING)
 | 
											
												
													
														|  |  	STATIC_FILE_MAX_AGE,
 |  |  	STATIC_FILE_MAX_AGE,
 | 
											
										
											
												
													
														|  | @@ -2222,6 +2224,8 @@ static const struct mg_option config_options[] = {
 | 
											
												
													
														|  |      {"access_control_allow_origin", MG_CONFIG_TYPE_STRING, "*"},
 |  |      {"access_control_allow_origin", MG_CONFIG_TYPE_STRING, "*"},
 | 
											
												
													
														|  |      {"access_control_allow_methods", MG_CONFIG_TYPE_STRING, "*"},
 |  |      {"access_control_allow_methods", MG_CONFIG_TYPE_STRING, "*"},
 | 
											
												
													
														|  |      {"access_control_allow_headers", MG_CONFIG_TYPE_STRING, "*"},
 |  |      {"access_control_allow_headers", MG_CONFIG_TYPE_STRING, "*"},
 | 
											
												
													
														|  | 
 |  | +    {"access_control_expose_headers", MG_CONFIG_TYPE_STRING, ""},
 | 
											
												
													
														|  | 
 |  | +    {"access_control_allow_credentials", MG_CONFIG_TYPE_STRING, ""},
 | 
											
												
													
														|  |      {"error_pages", MG_CONFIG_TYPE_DIRECTORY, NULL},
 |  |      {"error_pages", MG_CONFIG_TYPE_DIRECTORY, NULL},
 | 
											
												
													
														|  |  #if !defined(NO_CACHING)
 |  |  #if !defined(NO_CACHING)
 | 
											
												
													
														|  |      {"static_file_max_age", MG_CONFIG_TYPE_NUMBER, "3600"},
 |  |      {"static_file_max_age", MG_CONFIG_TYPE_NUMBER, "3600"},
 | 
											
										
											
												
													
														|  | @@ -4195,6 +4199,45 @@ send_cors_header(struct mg_connection *conn)
 | 
											
												
													
														|  |  		                       cors_orig_cfg,
 |  |  		                       cors_orig_cfg,
 | 
											
												
													
														|  |  		                       -1);
 |  |  		                       -1);
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	const char *cors_cred_cfg =
 | 
											
												
													
														|  | 
 |  | +	    conn->dom_ctx->config[ACCESS_CONTROL_ALLOW_CREDENTIALS];
 | 
											
												
													
														|  | 
 |  | +	if (cors_cred_cfg && *cors_cred_cfg && origin_hdr && *origin_hdr) {
 | 
											
												
													
														|  | 
 |  | +		/* Cross-origin resource sharing (CORS), see
 | 
											
												
													
														|  | 
 |  | +		 * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials */
 | 
											
												
													
														|  | 
 |  | +		mg_response_header_add(conn,
 | 
											
												
													
														|  | 
 |  | +		                       "Access-Control-Allow-Credentials",
 | 
											
												
													
														|  | 
 |  | +		                       cors_cred_cfg,
 | 
											
												
													
														|  | 
 |  | +		                       -1);
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	const char *cors_hdr_cfg =
 | 
											
												
													
														|  | 
 |  | +	    conn->dom_ctx->config[ACCESS_CONTROL_ALLOW_HEADERS];
 | 
											
												
													
														|  | 
 |  | +	if (cors_hdr_cfg && *cors_hdr_cfg) {
 | 
											
												
													
														|  | 
 |  | +	   mg_response_header_add(conn,
 | 
											
												
													
														|  | 
 |  | +	                          "Access-Control-Allow-Headers",
 | 
											
												
													
														|  | 
 |  | +	                          cors_hdr_cfg,
 | 
											
												
													
														|  | 
 |  | +	                          -1);
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	const char *cors_exphdr_cfg =
 | 
											
												
													
														|  | 
 |  | +	      conn->dom_ctx->config[ACCESS_CONTROL_EXPOSE_HEADERS];
 | 
											
												
													
														|  | 
 |  | +	if (cors_exphdr_cfg && *cors_exphdr_cfg) {
 | 
											
												
													
														|  | 
 |  | +	   mg_response_header_add(conn,
 | 
											
												
													
														|  | 
 |  | +	                          "Access-Control-Expose-Headers",
 | 
											
												
													
														|  | 
 |  | +	                          cors_exphdr_cfg,
 | 
											
												
													
														|  | 
 |  | +	                          -1);
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +	const char *cors_meth_cfg =
 | 
											
												
													
														|  | 
 |  | +	      conn->dom_ctx->config[ACCESS_CONTROL_ALLOW_METHODS];
 | 
											
												
													
														|  | 
 |  | +	if (cors_meth_cfg && *cors_meth_cfg) {
 | 
											
												
													
														|  | 
 |  | +	   mg_response_header_add(conn,
 | 
											
												
													
														|  | 
 |  | +	                          "Access-Control-Allow-Methods",
 | 
											
												
													
														|  | 
 |  | +	                          cors_meth_cfg,
 | 
											
												
													
														|  | 
 |  | +	                          -1);
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -14992,7 +15035,23 @@ handle_request(struct mg_connection *conn)
 | 
											
												
													
														|  |  			          ((cors_meth_cfg[0] == '*') ? cors_acrm : cors_meth_cfg),
 |  |  			          ((cors_meth_cfg[0] == '*') ? cors_acrm : cors_meth_cfg),
 | 
											
												
													
														|  |  			          suggest_connection_header(conn));
 |  |  			          suggest_connection_header(conn));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -			if (cors_acrh != NULL) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +			const char *cors_cred_cfg =
 | 
											
												
													
														|  | 
 |  | +			      conn->dom_ctx->config[ACCESS_CONTROL_ALLOW_CREDENTIALS];
 | 
											
												
													
														|  | 
 |  | +			if (cors_cred_cfg && *cors_cred_cfg) {
 | 
											
												
													
														|  | 
 |  | +			   mg_printf(conn,
 | 
											
												
													
														|  | 
 |  | +			             "Access-Control-Allow-Credentials: %s\r\n",
 | 
											
												
													
														|  | 
 |  | +			             cors_cred_cfg);
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +			const char *cors_exphdr_cfg =
 | 
											
												
													
														|  | 
 |  | +			      conn->dom_ctx->config[ACCESS_CONTROL_EXPOSE_HEADERS];
 | 
											
												
													
														|  | 
 |  | +			if (cors_exphdr_cfg && *cors_exphdr_cfg) {
 | 
											
												
													
														|  | 
 |  | +			   mg_printf(conn,
 | 
											
												
													
														|  | 
 |  | +			             "Access-Control-Expose-Headers: %s\r\n",
 | 
											
												
													
														|  | 
 |  | +			             cors_exphdr_cfg);
 | 
											
												
													
														|  | 
 |  | +			}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +			if (cors_acrh || (cors_cred_cfg && *cors_cred_cfg)) {
 | 
											
												
													
														|  |  				/* CORS request is asking for additional headers */
 |  |  				/* CORS request is asking for additional headers */
 | 
											
												
													
														|  |  				const char *cors_hdr_cfg =
 |  |  				const char *cors_hdr_cfg =
 | 
											
												
													
														|  |  				    conn->dom_ctx->config[ACCESS_CONTROL_ALLOW_HEADERS];
 |  |  				    conn->dom_ctx->config[ACCESS_CONTROL_ALLOW_HEADERS];
 |