System_http_session::System_http_session(Move<Unique_file> socket, boost::shared_ptr<const Http::Authentication_context> auth_ctx) : Http::Session(STD_MOVE(socket)) , m_auth_ctx(STD_MOVE(auth_ctx)) , m_initialized(false), m_decoded_uri(), m_servlet() { POSEIDON_LOG_INFO("System_http_session constructor: remote = ", get_remote_info()); }
int main(int argc, char *argv[]) { char *domainname; char *hostname = NULL; char *inmap, *master; int order; int c, r, tcp = 0; (void)yp_get_default_domain(&domainname); while ((c = getopt(argc, argv, "Th:d:")) != -1) { switch (c) { case 'T': tcp = 1; break; case 'd': domainname = optarg; break; case 'h': hostname = optarg; break; default: usage(); /*NOTREACHED*/ } } if (domainname == NULL) errx(1, "YP domain name not set"); argc -= optind; argv += optind; if (argc != 1) usage(); inmap = argv[0]; if (hostname != NULL) r = get_remote_info(domainname, inmap, hostname, &order, &master, tcp); else { r = yp_order(domainname, inmap, &order); if (r == 0) r = yp_master(domainname, inmap, &master); } if (r != 0) errx(1, "no such map %s. Reason: %s", inmap, yperr_string(r)); (void)printf("Map %s has order number %d. %s", inmap, order, ctime((void *)&order)); (void)printf("The master server is %s.\n", master); return 0; }
void System_http_session::initialize_once(const Http::Request_headers &request_headers){ POSEIDON_PROFILE_ME; if(m_initialized){ return; } const AUTO(user, Http::check_authentication_simple(m_auth_ctx, false, get_remote_info(), request_headers)); POSEIDON_LOG_INFO("System_http_session authentication succeeded: remote = ", get_remote_info(), ", user = "******", URI = ", request_headers.uri, ", headers = ", request_headers.headers); Buffer_istream bis; bis.set_buffer(Stream_buffer(request_headers.uri)); Http::url_decode(bis, m_decoded_uri); POSEIDON_THROW_UNLESS(!m_decoded_uri.empty(), Http::Exception, Http::status_bad_request); POSEIDON_THROW_UNLESS(m_decoded_uri[0] == '/', Http::Exception, Http::status_bad_request); POSEIDON_LOG_DEBUG("Decoded request URI: ", m_decoded_uri); switch(request_headers.verb){ case Http::verb_options: break; case Http::verb_get: case Http::verb_head: case Http::verb_post: for(;;){ m_servlet = System_http_server::get_servlet(m_decoded_uri.c_str()); if(m_servlet){ break; } if(*m_decoded_uri.rbegin() == '/'){ POSEIDON_LOG_WARNING("System_http_session URI not handled: ", m_decoded_uri); POSEIDON_THROW(Http::Exception, Http::status_not_found); } m_decoded_uri.push_back('/'); POSEIDON_LOG_DEBUG("Retrying: ", m_decoded_uri); } break; default: POSEIDON_THROW(Http::Exception, Http::status_method_not_allowed); } m_initialized = true; }
void on_read_avail(Poseidon::StreamBuffer data) override { LOG_POSEIDON_INFO("Connection read avail: remote = ", get_remote_info(), ", data = ", data.dump()); Poseidon::StreamBuffer buffer; buffer.put("[Response from echo server] "); buffer.splice(data); send(std::move(buffer)); set_timeout(g_keep_alive_timeout); }
void on_close(int err_code) noexcept override { LOG_POSEIDON_INFO("Connection error: remote = ", get_remote_info(), ", err_code = ", err_code, ", desc = ", Poseidon::get_error_desc(err_code)); }
void on_read_hup() noexcept override { LOG_POSEIDON_INFO("Connection read hup: remote = ", get_remote_info()); }
void on_connect() override { LOG_POSEIDON_INFO("Connection established: remote = ", get_remote_info()); }
explicit Session(Poseidon::UniqueFile socket) : Poseidon::TcpSessionBase(std::move(socket)) { get_remote_info(); // 这样后面 get_remote_info() 都不会抛出异常。 }
System_http_session::~System_http_session(){ POSEIDON_LOG_INFO("System_http_session destructor: remote = ", get_remote_info()); }