File: browser-scheme.cpp

package info (click to toggle)
obs-studio 30.2.3%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 47,852 kB
  • sloc: ansic: 202,137; cpp: 112,402; makefile: 868; python: 599; sh: 275; javascript: 19
file content (67 lines) | stat: -rw-r--r-- 2,195 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/******************************************************************************
 Copyright (C) 2014 by John R. Bradley <jrb@turrettech.com>
 Copyright (C) 2023 by Lain Bailey <lain@obsproject.com>

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 2 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/

#include "browser-scheme.hpp"
#include "wide-string.hpp"
#include <include/wrapper/cef_stream_resource_handler.h>

#if !ENABLE_LOCAL_FILE_URL_SCHEME
CefRefPtr<CefResourceHandler>
BrowserSchemeHandlerFactory::Create(CefRefPtr<CefBrowser> browser,
				    CefRefPtr<CefFrame>, const CefString &,
				    CefRefPtr<CefRequest> request)
{
	if (!browser || !request)
		return nullptr;

	CefURLParts parts;
	CefParseURL(request->GetURL(), parts);

	std::string path = CefString(&parts.path);

	path = CefURIDecode(path, true, cef_uri_unescape_rule_t::UU_SPACES);
	path = CefURIDecode(
		path, true,
		cef_uri_unescape_rule_t::
			UU_URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS);

	std::string fileExtension = path.substr(path.find_last_of(".") + 1);

	for (char &ch : fileExtension)
		ch = (char)tolower(ch);
	if (fileExtension.compare("woff2") == 0)
		fileExtension = "woff";

#ifdef _WIN32
	CefRefPtr<CefStreamReader> stream =
		CefStreamReader::CreateForFile(path.substr(1));
#else
	CefRefPtr<CefStreamReader> stream =
		CefStreamReader::CreateForFile(path);
#endif

	if (stream) {
		CefString mimeType = CefGetMimeType(fileExtension);
		if (mimeType.empty())
			mimeType = "application/octet-stream";
		return new CefStreamResourceHandler(mimeType, stream);
	} else {
		return nullptr;
	}
}
#endif