/* * Spdylay - SPDY Library * * Copyright (c) 2012 Tatsuhiro Tsujikawa * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef SPDYLAY_SSL_H #define SPDYLAY_SSL_H #include "spdylay_config.h" #include #include #include #include #include #include #include #include namespace spdylay { extern bool ssl_debug; class Spdylay { public: Spdylay(int fd, SSL *ssl, uint16_t version, const spdylay_session_callbacks *callbacks, void *user_data); ~Spdylay(); int recv(); int send(); ssize_t send_data(const uint8_t *data, size_t len, int flags); ssize_t recv_data(uint8_t *data, size_t len, int flags); bool want_read(); bool want_write(); bool finish(); int fd() const; int submit_request(const std::string& hostport, const std::string& path, const std::map& headers, uint8_t pri, void *stream_user_data); int submit_settings(int flags, spdylay_settings_entry *iv, size_t niv); bool would_block(int r); void* user_data(); private: int fd_; SSL *ssl_; uint16_t version_; spdylay_session *session_; void *user_data_; bool want_write_; bool debug_; }; int connect_to(const std::string& host, uint16_t port); int make_listen_socket(const std::string& host, uint16_t port, int family); int make_non_block(int fd); int set_tcp_nodelay(int fd); ssize_t send_callback(spdylay_session *session, const uint8_t *data, size_t len, int flags, void *user_data); ssize_t recv_callback(spdylay_session *session, uint8_t *data, size_t len, int flags, void *user_data); void print_nv(char **nv); void on_ctrl_recv_callback (spdylay_session *session, spdylay_frame_type type, spdylay_frame *frame, void *user_data); void on_invalid_ctrl_recv_callback (spdylay_session *session, spdylay_frame_type type, spdylay_frame *frame, uint32_t status_code, void *user_data); void on_ctrl_recv_parse_error_callback(spdylay_session *session, spdylay_frame_type type, const uint8_t *head, size_t headlen, const uint8_t *payload, size_t payloadlen, int error_code, void *user_data); void on_unknown_ctrl_recv_callback(spdylay_session *session, const uint8_t *head, size_t headlen, const uint8_t *payload, size_t payloadlen, void *user_data); void on_ctrl_send_callback (spdylay_session *session, spdylay_frame_type type, spdylay_frame *frame, void *user_data); void on_data_recv_callback (spdylay_session *session, uint8_t flags, int32_t stream_id, int32_t length, void *user_data); void on_data_send_callback (spdylay_session *session, uint8_t flags, int32_t stream_id, int32_t length, void *user_data); void ctl_poll(pollfd *pollfd, Spdylay *sc); int select_next_proto_cb(SSL* ssl, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg); void setup_ssl_ctx(SSL_CTX *ssl_ctx, void *next_proto_select_cb_arg); int ssl_handshake(SSL *ssl, int fd); void reset_timer(); void get_timer(timeval *tv); void print_timer(); } // namespace spdylay #endif // SPDYLAY_SSL_H