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; }
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; }