21 #include "nonblocking_string.h"
25 #include <sys/types.h>
26 #include <sys/socket.h>
29 #include "glog/logging.h"
34 using std::unique_ptr;
37 NonblockingStringReader::NonblockingStringReader(shared_ptr<SocketWrapperInterface> socket_wrapper,
size_t size, unique_ptr<const string> &s)
38 : socket_wrapper_(socket_wrapper), size_(size), s_(s), buf_(new char[size]), bytes_read_(0) {}
40 NonblockingStringReader::~NonblockingStringReader() {
44 NonblockingStringStatus NonblockingStringReader::Read() {
45 while (bytes_read_ < size_) {
47 if(socket_wrapper_->getSSL()){
48 status = SSL_read(socket_wrapper_->getSSL(), buf_ + bytes_read_, size_ - bytes_read_);
50 else status = read(socket_wrapper_->fd(), buf_ + bytes_read_, size_ - bytes_read_);
59 if (errno == EAGAIN || errno == EWOULDBLOCK) {
65 bytes_read_ += status;
68 CHECK_EQ(bytes_read_, size_);
70 unique_ptr<const string> p(
new string(buf_, size_));
75 NonblockingStringWriter::NonblockingStringWriter(shared_ptr<SocketWrapperInterface> socket_wrapper,
const shared_ptr<const string> s)
76 : socket_wrapper_(socket_wrapper), s_(s), bytes_written_(0) {}
78 NonblockingStringStatus NonblockingStringWriter::Write() {
79 while (bytes_written_ < s_->size()) {
84 flags |= MSG_NOSIGNAL;
91 if (fstat(socket_wrapper_->fd(), &statbuf)) {
92 PLOG(ERROR) <<
"Unable to fstat socket";
96 if (S_ISSOCK(statbuf.st_mode)) {
97 if(socket_wrapper_->getSSL())
98 status = SSL_write(socket_wrapper_->getSSL(), s_->data() + bytes_written_, s_->size() - bytes_written_);
101 socket_wrapper_->fd(),
102 s_->data() + bytes_written_,
103 s_->size() - bytes_written_,
106 if(socket_wrapper_->getSSL())
107 status = SSL_write(socket_wrapper_->getSSL(), s_->data() + bytes_written_, s_->size() - bytes_written_);
109 status = write(socket_wrapper_->fd(), s_->data() + bytes_written_, s_->size() - bytes_written_);
115 if (errno == EINTR) {
118 if (errno == EAGAIN || errno == EWOULDBLOCK) {
123 bytes_written_ += status;
126 CHECK_EQ(bytes_written_, s_->size());