blob: 9b79d6199bdc0a1f108ae2e45bb0da12d83772ba [file] [log] [blame]
// Copyright 2012 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVTOOLS_GOMA_CLIENT_TLS_DESCRIPTOR_H_
#define DEVTOOLS_GOMA_CLIENT_TLS_DESCRIPTOR_H_
#include <memory>
#include "basictypes.h"
#include "descriptor.h"
#include "http_util.h"
#include "tls_engine.h"
#include "worker_thread_manager.h"
namespace devtools_goma {
class Closure;
class SocketDescriptor;
class TLSDescriptor : public Descriptor {
public:
struct Options {
Options() : use_proxy(false) {}
string dest_host_name;
int dest_port;
bool use_proxy;
};
// It doesn't take ownership of e and wm.
// It keep desc inside but desc should be deleted by WorkerThreadManager.
TLSDescriptor(SocketDescriptor* desc,
TLSEngine* e,
Options options,
WorkerThreadManager* wm);
~TLSDescriptor() override;
// To be deleted by WorkerThreadManager.
SocketDescriptor* socket_descriptor() override { return d_; }
void NotifyWhenReadable(std::unique_ptr<PermanentClosure> closure) override;
void NotifyWhenWritable(std::unique_ptr<PermanentClosure> closure) override;
void ClearWritable() override;
void NotifyWhenTimedout(double timeout, OneshotClosure* closure) override;
void ChangeTimeout(double timeout) override;
ssize_t Read(void* ptr, size_t len) override;
ssize_t Write(const void* ptr, size_t len) override;
bool NeedRetry() const override;
bool CanReuse() const override;
// TODO: implement the same feature with shutdown(2) for SSL.
string GetLastErrorMessage() const override;
void StopRead() override;
void StopWrite() override;
void Init();
private:
void PutClosuresInRunQueue() const;
// TransportLayerReadable/Writable are called back when a socket get ready.
void TransportLayerReadable();
void TransportLayerWritable();
// Suspend to wait writable.
void SuspendTransportWritable();
void ResumeTransportWritable();
// Stop / restart notification from transport layer.
void StopTransportLayer();
void RestartTransportLayer();
// HTTP request to ask proxy to connect the server.
string CreateProxyRequestMessage();
SocketDescriptor* d_;
TLSEngine* engine_;
WorkerThreadManager* wm_;
WorkerThreadManager::ThreadId thread_;
std::unique_ptr<PermanentClosure> readable_closure_;
std::unique_ptr<PermanentClosure> writable_closure_;
char network_read_buffer_[kNetworkBufSize];
string network_write_buffer_;
size_t network_write_offset_;
// Shows application read/write failed because TLS engine needs more work.
bool ssl_pending_;
// Shows readable_closure_ can be callable.
bool active_read_;
// Shows writable_closure_ can be callable.
bool active_write_;
// Shows transport layer communication failed.
bool io_failed_;
// HTTP proxy related paramters.
const Options options_;
enum ConnectStatus { NEED_WRITE, NEED_READ, READY} connect_status_;
// Shows underlying SocketDescriptor closed.
bool is_closed_;
string proxy_response_;
// Only used if transport layer socket is closed but we need to keep
// http.cc read TLSDescriptor. (b/22515030)
// In such situation we need to let HttpClient::Task::DoRead to read
// TLSDescriptor but at the same time, we need to allow it to stop
// TLSDescriptor. If TLSDescriptor is stopped, this wrapper is disabled
// not to run readable closure.
WorkerThreadManager::CancelableClosure* cancel_readable_closure_;
DISALLOW_COPY_AND_ASSIGN(TLSDescriptor);
};
} // namespace devtools_goma
#endif // DEVTOOLS_GOMA_CLIENT_TLS_DESCRIPTOR_H_