1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file.
4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#ifndef NET_TOOLS_FLIP_SERVER_HTTP_INTERFACE_
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define NET_TOOLS_FLIP_SERVER_HTTP_INTERFACE_
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <string>
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/balsa_headers.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/balsa_visitor_interface.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/output_ordering.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/sm_connection.h"
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/tools/flip_server/sm_interface.h"
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace net {
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass BalsaFrame;
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass DataFrame;
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass EpollServer;
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FlipAcceptor;
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass MemoryCache;
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass HttpSM : public BalsaVisitorInterface,
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen               public SMInterface {
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  HttpSM(SMConnection* connection,
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         SMInterface* sm_spdy_interface,
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         EpollServer* epoll_server,
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         MemoryCache* memory_cache,
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen         FlipAcceptor* acceptor);
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~HttpSM();
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // BalsaVisitorInterface:
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ProcessBodyInput(const char *input, size_t size) {}
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ProcessBodyData(const char *input, size_t size);
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ProcessHeaderInput(const char *input, size_t size) {}
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ProcessTrailerInput(const char *input, size_t size) {}
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ProcessHeaders(const BalsaHeaders& headers);
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ProcessRequestFirstLine(const char* line_input,
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       size_t line_length,
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       const char* method_input,
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       size_t method_length,
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       const char* request_uri_input,
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       size_t request_uri_length,
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       const char* version_input,
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                       size_t version_length) {}
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ProcessResponseFirstLine(const char *line_input,
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                        size_t line_length,
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                        const char *version_input,
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                        size_t version_length,
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                        const char *status_input,
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                        size_t status_length,
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                        const char *reason_input,
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                        size_t reason_length) {}
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ProcessChunkLength(size_t chunk_length) {}
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ProcessChunkExtensions(const char *input, size_t size) {}
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void HeaderDone() {}
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void MessageDone();
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void HandleHeaderError(BalsaFrame* framer);
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void HandleHeaderWarning(BalsaFrame* framer) {}
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void HandleChunkingError(BalsaFrame* framer);
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void HandleBodyError(BalsaFrame* framer);
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void HandleError();
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void AddToOutputOrder(const MemCacheIter& mci);
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendOKResponse(uint32 stream_id, std::string* output);
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BalsaFrame* spdy_framer() { return http_framer_; }
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void set_is_request() {}
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // SMInterface:
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void InitSMInterface(SMInterface* sm_spdy_interface,
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                               int32 server_idx);
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void InitSMConnection(SMConnectionPoolInterface* connection_pool,
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                SMInterface* sm_interface,
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                EpollServer* epoll_server,
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                int fd,
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                std::string server_ip,
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                std::string server_port,
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                std::string remote_ip,
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                bool use_ssl);
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual size_t ProcessReadInput(const char* data, size_t len);
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual size_t ProcessWriteInput(const char* data, size_t len);
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool MessageFullyRead() const;
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SetStreamID(uint32 stream_id);
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual bool Error() const;
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual const char* ErrorAsString() const;
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void Reset();
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ResetForNewInterface(int32 server_idx) {}
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void ResetForNewConnection();
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void Cleanup();
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual int PostAcceptHook();
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void NewStream(uint32 stream_id, uint32 priority,
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                         const std::string& filename);
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SendEOF(uint32 stream_id);
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SendErrorNotFound(uint32 stream_id);
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual size_t SendSynStream(uint32 stream_id, const BalsaHeaders& headers);
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual size_t SendSynReply(uint32 stream_id, const BalsaHeaders& headers);
103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void SendDataFrame(uint32 stream_id, const char* data, int64 len,
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                             uint32 flags, bool compress);
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendEOFImpl(uint32 stream_id);
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendErrorNotFoundImpl(uint32 stream_id);
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendOKResponseImpl(uint32 stream_id, std::string* output);
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  size_t SendSynReplyImpl(uint32 stream_id, const BalsaHeaders& headers);
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  size_t SendSynStreamImpl(uint32 stream_id, const BalsaHeaders& headers);
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SendDataFrameImpl(uint32 stream_id, const char* data, int64 len,
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                         uint32 flags, bool compress);
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void EnqueueDataFrame(DataFrame* df);
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void GetOutput();
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  uint64 seq_num_;
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BalsaFrame* http_framer_;
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  BalsaHeaders headers_;
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  uint32 stream_id_;
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int32 server_idx_;
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SMConnection* connection_;
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SMInterface* sm_spdy_interface_;
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  OutputList* output_list_;
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  OutputOrdering output_ordering_;
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  MemoryCache* memory_cache_;
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FlipAcceptor* acceptor_;
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // NET_TOOLS_FLIP_SERVER_HTTP_INTERFACE_
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
136