kodi
WebServer.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "network/httprequesthandler/IHTTPRequestHandler.h"
12 #include "threads/CriticalSection.h"
13 #include "utils/logtypes.h"
14 
15 #include <memory>
16 #include <vector>
17 
18 namespace XFILE
19 {
20  class CFile;
21 }
22 class CDateTime;
23 class CVariant;
24 
26 {
27 public:
28  CWebServer();
29  virtual ~CWebServer() = default;
30 
31  bool Start(uint16_t port, const std::string &username, const std::string &password);
32  bool Stop();
33  bool IsStarted();
34  static bool WebServerSupportsSSL();
35  void SetCredentials(const std::string &username, const std::string &password);
36 
37  void RegisterRequestHandler(IHTTPRequestHandler *handler);
38  void UnregisterRequestHandler(IHTTPRequestHandler *handler);
39 
40 protected:
41  typedef struct ConnectionHandler
42  {
43  std::string fullUri;
44  bool isNew = true;
45  std::shared_ptr<IHTTPRequestHandler> requestHandler;
46  struct MHD_PostProcessor* postprocessor = nullptr;
47  int errorStatus = MHD_HTTP_OK;
48 
49  explicit ConnectionHandler(const std::string& uri) : fullUri(uri), requestHandler(nullptr) {}
51 
52  virtual void LogRequest(const char* uri) const;
53 
54  virtual MHD_RESULT HandlePartialRequest(struct MHD_Connection *connection, ConnectionHandler* connectionHandler, const HTTPRequest& request,
55  const char *upload_data, size_t *upload_data_size, void **con_cls);
56  virtual MHD_RESULT HandleRequest(const std::shared_ptr<IHTTPRequestHandler>& handler);
57  virtual MHD_RESULT FinalizeRequest(const std::shared_ptr<IHTTPRequestHandler>& handler, int responseStatus, struct MHD_Response *response);
58 
59 private:
60  struct MHD_Daemon* StartMHD(unsigned int flags, int port);
61 
62  std::shared_ptr<IHTTPRequestHandler> FindRequestHandler(const HTTPRequest& request) const;
63 
64  MHD_RESULT AskForAuthentication(const HTTPRequest& request) const;
65  bool IsAuthenticated(const HTTPRequest& request) const;
66 
67  bool IsRequestCacheable(const HTTPRequest& request) const;
68  bool IsRequestRanged(const HTTPRequest& request, const CDateTime &lastModified) const;
69 
70  void SetupPostDataProcessing(const HTTPRequest& request, ConnectionHandler *connectionHandler, std::shared_ptr<IHTTPRequestHandler> handler, void **con_cls) const;
71  bool ProcessPostData(const HTTPRequest& request, ConnectionHandler *connectionHandler, const char *upload_data, size_t *upload_data_size, void **con_cls) const;
72  void FinalizePostDataProcessing(ConnectionHandler *connectionHandler) const;
73 
74  MHD_RESULT CreateMemoryDownloadResponse(const std::shared_ptr<IHTTPRequestHandler>& handler, struct MHD_Response *&response) const;
75  MHD_RESULT CreateRangedMemoryDownloadResponse(const std::shared_ptr<IHTTPRequestHandler>& handler, struct MHD_Response *&response) const;
76 
77  MHD_RESULT CreateRedirect(struct MHD_Connection *connection, const std::string &strURL, struct MHD_Response *&response) const;
78  MHD_RESULT CreateFileDownloadResponse(const std::shared_ptr<IHTTPRequestHandler>& handler, struct MHD_Response *&response) const;
79  MHD_RESULT CreateErrorResponse(struct MHD_Connection *connection, int responseType, HTTPMethod method, struct MHD_Response *&response) const;
80  MHD_RESULT CreateMemoryDownloadResponse(struct MHD_Connection *connection, const void *data, size_t size, bool free, bool copy, struct MHD_Response *&response) const;
81 
82  MHD_RESULT SendResponse(const HTTPRequest& request, int responseStatus, MHD_Response *response) const;
83  MHD_RESULT SendErrorResponse(const HTTPRequest& request, int errorType, HTTPMethod method) const;
84 
85  MHD_RESULT AddHeader(struct MHD_Response *response, const std::string &name, const std::string &value) const;
86 
87  void LogRequest(const HTTPRequest& request) const;
88  void LogResponse(const HTTPRequest& request, int responseStatus) const;
89 
90  static std::string CreateMimeTypeFromExtension(const char *ext);
91 
92  // MHD callback implementations
93  static void* UriRequestLogger(void *cls, const char *uri);
94 
95  static ssize_t ContentReaderCallback (void *cls, uint64_t pos, char *buf, size_t max);
96  static void ContentReaderFreeCallback(void *cls);
97 
98  static MHD_RESULT AnswerToConnection (void *cls, struct MHD_Connection *connection,
99  const char *url, const char *method,
100  const char *version, const char *upload_data,
101  size_t *upload_data_size, void **con_cls);
102  static MHD_RESULT HandlePostField(void *cls, enum MHD_ValueKind kind, const char *key,
103  const char *filename, const char *content_type,
104  const char *transfer_encoding, const char *data, uint64_t off,
105  size_t size);
106 
107  bool LoadCert(std::string &skey, std::string &scert);
108 
109  static Logger GetLogger();
110 
111  uint16_t m_port = 0;
112  struct MHD_Daemon *m_daemon_ip6 = nullptr;
113  struct MHD_Daemon *m_daemon_ip4 = nullptr;
114  bool m_running = false;
115  size_t m_thread_stacksize = 0;
116  bool m_authenticationRequired = false;
117  std::string m_authenticationUsername;
118  std::string m_authenticationPassword;
119  std::string m_key;
120  std::string m_cert;
121  mutable CCriticalSection m_critSection;
122  std::vector<IHTTPRequestHandler *> m_requestHandlers;
123 
124  Logger m_logger;
125 };
Definition: IHTTPRequestHandler.h:66
Definition: Scraper.h:41
Definition: WebServer.h:25
Definition: WebServer.h:41
Definition: Variant.h:31
Definition: SimpleFS.h:27
Definition: LibInputPointer.h:13
DateTime class, which uses FileTime as it&#39;s base.
Definition: XBDateTime.h:63
Definition: IHTTPRequestHandler.h:85