void Socket::onInput(StreamBuffer& sb) { log_debug("onInput"); sb.endRead(); if (sb.in_avail() == 0 || sb.device()->eof()) { close(); return; } while (sb.in_avail() > 0) { if (_responder.advance(sb.sbumpc())) { _responder.finalize(_stream); buffer().beginWrite(); onOutput(sb); return; } } sb.beginRead(); }
void ClientImpl::onInput(StreamBuffer& sb) { try { try { log_trace("ClientImpl::onInput; readHeader=" << _readHeader); _errorPending = false; sb.endRead(); if (sb.device()->eof()) throw IOError("end of input"); _reconnectOnError = false; if (_readHeader) { processHeaderAvailable(sb); } else { processBodyAvailable(sb); } } catch (const IOError& e) { // after writing the request, the first read request may // detect, that the server has already closed the connection, // so check it here if (_readHeader && _reconnectOnError && _request != 0) { log_debug("reconnect on error"); _socket.close(); _reconnectOnError = false; reexecuteBegin(*_request); return; } throw; } } catch (const std::exception& e) { _errorPending = true; _client->replyFinished(*_client); if (_errorPending) throw; } }
void RpcClientImpl::onInput(StreamBuffer& sb) { try { _exceptionPending = false; sb.endRead(); if (sb.device()->eof()) throw IOError("end of input"); while (_stream.buffer().in_avail()) { char ch = StreamBuffer::traits_type::to_char_type(_stream.buffer().sbumpc()); if (_scanner.advance(ch)) { _scanner.finish(); IRemoteProcedure* proc = _proc; _proc = 0; proc->onFinished(); return; } } if (!_stream) { close(); throw std::runtime_error("reading result failed"); } sb.beginRead(); } catch (const std::exception&) { IRemoteProcedure* proc = _proc; cancel(); if (!proc) throw; _exceptionPending = true; proc->onFinished(); if (_exceptionPending) throw; } }
void Socket::onInput(StreamBuffer& sb) { log_debug("onInput"); sb.endRead(); if (sb.in_avail() == 0 || sb.device()->eof()) { close(); return; } if (_responder.onInput(_stream)) { sb.beginWrite(); onOutput(sb); } else { sb.beginRead(); } }
void Socket::onInput(StreamBuffer& sb) { log_debug("onInput"); sb.endRead(); if (sb.in_avail() == 0 || sb.device()->eof()) { close(); return; } _timer.start(_server.readTimeout()); if ( _responder == 0 ) { _parser.advance(sb); if (_parser.fail()) { _responder = _server.getDefaultResponder(_request); _responder->replyError(_reply.body(), _request, _reply, std::runtime_error("invalid http header")); _responder->release(); _responder = 0; sendReply(); onOutput(sb); return; } if (_parser.end()) { log_info("request " << _request.method() << ' ' << _request.header().query() << " from client " << getPeerAddr()); _responder = _server.getResponder(_request); try { _responder->beginRequest(_stream, _request); } catch (const std::exception& e) { _reply.setHeader("Connection", "close"); _responder->replyError(_reply.body(), _request, _reply, e); _responder->release(); _responder = 0; sendReply(); onOutput(sb); return; } _contentLength = _request.header().contentLength(); log_debug("content length of request is " << _contentLength); if (_contentLength == 0) { _timer.stop(); doReply(); return; } } else { sb.beginRead(); } } if (_responder) { if (sb.in_avail() > 0) { try { std::size_t s = _responder->readBody(_stream); assert(s > 0); _contentLength -= s; } catch (const std::exception& e) { _reply.setHeader("Connection", "close"); _responder->replyError(_reply.body(), _request, _reply, e); _responder->release(); _responder = 0; sendReply(); onOutput(sb); return; } } if (_contentLength <= 0) { _timer.stop(); doReply(); } else { sb.beginRead(); } } }