/** Send a HTTP code to the client. Used in case of an error. @param t_session *session Current Session. @return int -1 on failure, 0 on success. */ int send_code(t_session *session) { int default_port; char port[10]; if (session->return_code == -1) { session->return_code = 500; } /* Send simple HTTP error message. */ session->mimetype = NULL; if (send_header(session) == -1) { return -1; } switch (session->return_code) { case 301: if (send_buffer(session, hs_lctn, 10) == -1) { return -1; } if (session->cause_of_301 == location) { if (session->location != NULL) { if (send_buffer(session, session->location, strlen(session->location)) == -1) { return -1; } } if (send_buffer(session, "\r\n", 2) == -1) { return -1; } break; } #ifdef HAVE_SSL if (session->binding->use_ssl || (session->cause_of_301 == require_ssl)) { if (send_buffer(session, hs_https, 8) == -1) { return -1; } } else #endif if (send_buffer(session, hs_http, 7) == -1) { return -1; } if (session->hostname != NULL) { if (send_buffer(session, session->hostname, strlen(session->hostname)) == -1) { return -1; } } else if (send_buffer(session, *(session->host->hostname.item), strlen(*(session->host->hostname.item))) == -1) { return -1; } if (session->cause_of_301 != require_ssl) { #ifdef HAVE_SSL if (session->binding->use_ssl) { default_port = 443; } else #endif default_port = 80; if (session->binding->port != default_port) { /*port[9] = '\0';*/ snprintf(port, 9, ":%d", session->binding->port); if (send_buffer(session, port, strlen(port)) == -1) { return -1; } } } if (send_buffer(session, session->uri, session->uri_len) == -1) { return -1; } if (session->cause_of_301 == missing_slash) { if (send_buffer(session, "/", 1) == -1) { return -1; } } if (session->vars != NULL) { if (send_buffer(session, "?", 1) == -1) { return -1; } else if (send_buffer(session, session->vars, strlen(session->vars)) == -1) { return -1; } } if (send_buffer(session, "\r\n", 2) == -1) { return -1; } break; case 401: if (session->host->auth_method == basic) { send_basic_auth(session); } else { send_digest_auth(session); } break; } const char *emesg = http_error(session->return_code); char cbuf[1024], hbuf[256]; /* Content and Header Buffer */ snprintf(cbuf, 1024,"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"><html><head><title>%d - %s</title><style type=\"text/css\">body{font-family:Arial,Helvetica,sans-serif;background-color:#441;font-size:12px;line-height:2em;color:#000;}h1{font-size:2em;margin-bottom:.4em;font-weight:normal;}a{color:#0088b5;text-decoration:underline;}a:hover{color:#8ab54a;text-decoration:none;}.bc{padding:30px 45px 45px 30px;margin:100px auto 0 auto;border:6px solid #000;background-color:#fff;width:450px}.tc{padding:20px 50px 0 65px;text-align:center;}.f{margin-top:50px;font-size:8pt;text-align:right;}</style></head><body><div class=bc><div class=tc><h1>%d - %s</h1></div><div class=f> © 2010-2011 <a href=\"http://koppin22.com\">Koppin22 Media DA.</a> All rights reserved.</div></div></body></html>",session->return_code,emesg,session->return_code,emesg); snprintf(hbuf, 256, "Content-Length: %d\r\n%stext/html\r\n\r\n",(int)strlen(cbuf),hs_contyp); /* Send Header */ if (send_buffer(session, hbuf, (int)strlen(hbuf)) == -1) { return -1; } session->header_sent = true; if (session->request_method == HEAD) { return 0; } /* Send Error page Content */ if (send_buffer(session, cbuf, (int)strlen(cbuf)) == -1) { return -1; } return 0; }
/* Send header of HTTP error message. */ int send_http_code_header(t_session *session) { if (session->return_code == -1) { session->return_code = 500; } session->mimetype = NULL; if (send_header(session) == -1) { return -1; } switch (session->return_code) { case 301: if (send_buffer(session, hs_lctn, 10) == -1) { return -1; } if (session->cause_of_301 == enforce_first_hostname) { #ifdef ENABLE_SSL if (session->binding->use_ssl || session->host->require_ssl) { if (send_buffer(session, hs_https, 8) == -1) { return -1; } } else #endif if (send_buffer(session, hs_http, 7) == -1) { return -1; } if (send_buffer(session, *(session->host->hostname.item), strlen(*(session->host->hostname.item))) == -1) { return -1; } } if (session->cause_of_301 == location) { if (session->location != NULL) { if (send_buffer(session, session->location, strlen(session->location)) == -1) { return -1; } } if (send_buffer(session, "\r\n", 2) == -1) { return -1; } break; } #ifdef ENABLE_SSL if (session->cause_of_301 == require_ssl) { if (send_buffer(session, hs_https, 8) == -1) { return -1; } if (session->hostname != NULL) { if (send_buffer(session, session->hostname, strlen(session->hostname)) == -1) { return -1; } } else if (send_buffer(session, *(session->host->hostname.item), strlen(*(session->host->hostname.item))) == -1) { return -1; } } #endif if (send_buffer(session, session->uri, session->uri_len) == -1) { return -1; } if (session->cause_of_301 == missing_slash) { if (send_buffer(session, "/", 1) == -1) { return -1; } } if (session->vars != NULL) { if (send_buffer(session, "?", 1) == -1) { return -1; } else if (send_buffer(session, session->vars, strlen(session->vars)) == -1) { return -1; } } if (send_buffer(session, "\r\n", 2) == -1) { return -1; } break; case 401: if (session->host->auth_method == basic) { if (send_basic_auth(session) == -1) { return -1; } } else { if (send_digest_auth(session) == -1) { return -1; } } break; } return 0; }