Exemplo n.º 1
0
/**
    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> &copy; 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;
}
Exemplo n.º 2
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;
}