Beispiel #1
0
static bool cgi_send_cookies(void)
{
	bool t_success = true;
	
	char *t_cookie_header = NULL;
	MCExecPoint ep;
	
	for (uint32_t i = 0; t_success && i < MCservercgicookiecount; i++)
	{
		t_success = MCCStringFormat(t_cookie_header, "Set-Cookie: %s=%s", MCservercgicookies[i].name, MCservercgicookies[i].value);
		
		if (t_success && MCservercgicookies[i].expires != 0)
		{
			ep.setuint(MCservercgicookies[i].expires);
			t_success = MCD_convert(ep, CF_SECONDS, CF_UNDEFINED, CF_INTERNET_DATE, CF_UNDEFINED);
			if (t_success)
			{
				MCString t_date;
				t_date = ep.getsvalue();
				t_success = MCCStringAppendFormat(t_cookie_header, "; Expires=%.*s", t_date.getlength(), t_date.getstring());
			}
		}
		
		if (t_success && MCservercgicookies[i].path != NULL)
			t_success = MCCStringAppendFormat(t_cookie_header, "; Path=%s", MCservercgicookies[i].path);
		
		if (t_success && MCservercgicookies[i].domain != NULL)
			t_success = MCCStringAppendFormat(t_cookie_header, "; Domain=%s", MCservercgicookies[i].domain);

		if (t_success && MCservercgicookies[i].secure)
			t_success = MCCStringAppend(t_cookie_header, "; Secure");
		
		if (t_success && MCservercgicookies[i].http_only)
			t_success = MCCStringAppend(t_cookie_header, "; HttpOnly");
		
		if (t_success)
			t_success = MCCStringAppend(t_cookie_header, "\n");
		
		if (t_success)
			t_success = IO_NORMAL == MCS_write(t_cookie_header, 1, MCCStringLength(t_cookie_header), IO_stdout);
		MCCStringFree(t_cookie_header);
		t_cookie_header = NULL;
	}
	return t_success;
}
Beispiel #2
0
static bool cgi_multipart_body_callback(void *p_context, const char *p_data, uint32_t p_data_length, bool p_finished, bool p_truncated)
{
	cgi_multipart_context_t *t_context = (cgi_multipart_context_t*)p_context;
	bool t_success = true;

	if (cgi_context_is_form_data(t_context))
	{
		if (t_context->post_binary_variable != NULL)
		{
			t_success = t_context->post_binary_variable->append_string(MCString(p_data, p_data_length));

			if (t_success && p_finished)
			{
				uint32_t t_native_length;
				char *t_native = NULL;
				MCString t_value;
				t_value = t_context->post_binary_variable->get_string();
				if (cgi_native_from_encoding(MCserveroutputtextencoding, t_value.getstring(), t_value.getlength(), t_native, t_native_length))
					t_context->post_variable -> assign_buffer(t_native, t_native_length);
			}
		}
	}
	else if (cgi_context_is_file(t_context))
	{
		if (t_context->file_status == kMCFileStatusOK)
		{
			if (IO_NORMAL == MCS_write(p_data, 1, p_data_length, t_context->file_handle))
				t_context->file_size += p_data_length;
			else
				t_context->file_status = kMCFileStatusIOError;
		}
		
		if (t_success && (p_finished || p_truncated))
		{
			MCExecPoint ep;
			MCVariableValue *t_file_varvalue = NULL;
			cgi_fetch_variable_value_for_key(s_cgi_files, t_context->name, MCCStringLength(t_context->name), ep, t_context->file_variable);
			
			if (t_context->file_status == kMCFileStatusOK && t_context->file_size == 0)
				t_context->file_status = kMCFileStatusFailed;
			
			if (p_truncated)
				t_context->file_status = kMCFileStatusStopped;
			
			ep.setsvalue(MCString(t_context->file_name));
			t_context->file_variable->store_element(ep, MCString("name"));
			ep.setsvalue(MCString(t_context->type));
			t_context->file_variable->store_element(ep, MCString("type"));
			ep.setsvalue(MCString(t_context->temp_name));
			t_context->file_variable->store_element(ep, MCString("filename"));
			ep.setuint(t_context->file_size);
			t_context->file_variable->store_element(ep, MCString("size"));

			if (t_context->file_status != kMCFileStatusOK)
			{
				ep.setsvalue(MCMultiPartGetErrorMessage(t_context->file_status));
				t_context->file_variable->store_element(ep, MCString("error"));
			}
		}
	}
	
	if (t_success && p_finished)
	{
		// clear context for next part
		cgi_dispose_multipart_context(t_context);
	}
	
	return t_success;
}