前置条件
1. 已经通过 GitLab的替代者-轻量级Gitea安装与配置-Windows 11 配置过镜像服务
基础知识
CIPD 全称 Chrome Infrastructure Package Deployment (https://chromium.googlesource.com/infra/luci/luci-go/+/main/cipd/README.md),主要用于管理 Google 项目构建中用到的二进制文件(例如编译器之类的),你可以简单的认为是针对大文件的git系统。
CIPD管理的所有文件可以在(https://chrome-infra-packages.appspot.com)上查看。
手动下载( version 参数从 depot_tools/cipd_client_version 读取)
windows-x86-64:
https://chrome-infra-packages.appspot.com/client?platform=windows-amd64&version=git_revision:b1f414539ac10cc67a0250890a38712cc06cf102
动手实践
外网构建
1 2 3 4 5 6 7 8 9 10 |
# 创建源代码目录 $ mkdir cef_build $ cd cef_build # 拉取构建脚本 $ git clone https://bitbucket.org/chromiumembedded/cef.git build_script # 以 Chrome 135 版本 分支 7049 为例,此处需要翻墙 $ python3 build_script/tools/automate/automate-git.py --download-dir=src --branch=7049 |
国内镜像构建
1. 使用镜像地址替换 Git 仓库
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# 镜像服务器地址 $ export MIR=https://www.mobibrw.com/gitea-mirrors # 内网服务器地址 # export MIR=http://10.10.10.189:10880 $ export ORI=https://chromium.googlesource.com # Git三方依赖地址使用镜像地址替换 $ git config --global url."${MIR}/chromium/aosp.platform.system.core.libsync.git".insteadOf "${ORI}/aosp/platform/system/core/libsync.git" $ git config --global url."${MIR}/chromium/breakpad.git".insteadOf "${ORI}/breakpad/breakpad.git" $ git config --global url."${MIR}/chromium/buildtools.git".insteadOf "${ORI}/chromium/src/buildtools" $ git config --global url."${MIR}/chromium/catapult.git".insteadOf "${ORI}/catapult.git" $ git config --global url."${MIR}/chromium/cdm.git".insteadOf "${ORI}/chromium/cdm.git" $ git config --global url."${MIR}/chromium/canvas_bench.git".insteadOf "${ORI}/chromium/canvas_bench.git" $ git config --global url."${MIR}/chromium/crossbench.git".insteadOf "${ORI}/crossbench.git" $ git config --global url."${MIR}/chromium/colorama.git".insteadOf "${ORI}/external/colorama.git" $ git config --global url."${MIR}/chromium/content_analysis_sdk.git".insteadOf "${ORI}/external/github.com/chromium/content_analysis_sdk.git" $ git config --global url."${MIR}/chromium/codecs.libgav1.git".insteadOf "${ORI}/codecs/libgav1.git" $ git config --global url."${MIR}/chromium/cast_core.public.git".insteadOf "${ORI}/cast_core/public" $ git config --global url."${MIR}/chromium/depot_tools.git".insteadOf "${ORI}/chromium/tools/depot_tools.git" $ git config --global url."${MIR}/chromium/devtools.devtools-frontend.git".insteadOf "${ORI}/devtools/devtools-frontend" $ git config --global url."${MIR}/chromium/deps.libjpeg_turbo.git".insteadOf "${ORI}/chromium/deps/libjpeg_turbo.git" $ git config --global url."${MIR}/chromium/deps.libsrtp.git".insteadOf "${ORI}/chromium/deps/libsrtp.git" $ git config --global url."${MIR}/chromium/deps.hunspell_dictionaries.git".insteadOf "${ORI}/chromium/deps/hunspell_dictionaries.git" $ git config --global url."${MIR}/chromium/deps.icu.git".insteadOf "${ORI}/chromium/deps/icu.git" $ git config --global url."${MIR}/chromium/deps.nasm.git".insteadOf "${ORI}/chromium/deps/nasm.git" $ git config --global url."${MIR}/chromium/deps.sqlite.git".insteadOf "${ORI}/chromium/deps/sqlite.git" $ git config --global url."${MIR}/chromium/deps.xdg-utils.git".insteadOf "${ORI}/chromium/deps/xdg-utils.git" $ git config --global url."${MIR}/chromium/dom-distiller.dist.git".insteadOf "${ORI}/chromium/dom-distiller/dist.git" $ git config --global url."${MIR}/chromium/frame_rate.content.git".insteadOf "${ORI}/chromium/frame_rate/content.git" $ git config --global url."${MIR}/chromium/ffmpeg.git".insteadOf "${ORI}/chromium/third_party/ffmpeg.git" $ git config --global url."${MIR}/chromium/fontconfig.git".insteadOf "${ORI}/external/fontconfig.git" $ git config --global url."${MIR}/chromium/flac.git".insteadOf "${ORI}/chromium/deps/flac.git" $ git config --global url."${MIR}/chromium/freetype2.git".insteadOf "${ORI}/chromium/src/third_party/freetype2.git" $ git config --global url."${MIR}/chromium/GPUOpen-LibrariesAndSDKs.VulkanMemoryAllocator.git".insteadOf "${ORI}/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git" $ git config --global url."${MIR}/chromium/google.snappy.git".insteadOf "${ORI}/external/github.com/google/snappy.git" $ git config --global url."${MIR}/chromium/google.quic-trace.git".insteadOf "${ORI}/external/github.com/google/quic-trace.git" $ git config --global url."${MIR}/chromium/google.ruy.git".insteadOf "${ORI}/external/github.com/google/ruy.git" $ git config --global url."${MIR}/chromium/google.nearby-connections.git".insteadOf "${ORI}/external/github.com/google/nearby-connections.git" $ git config --global url."${MIR}/chromium/google.securemessage.git".insteadOf "${ORI}/external/github.com/google/securemessage.git" $ git config --global url."${MIR}/chromium/google.re2.git".insteadOf "${ORI}/external/github.com/google/re2.git" $ git config --global url."${MIR}/chromium/GoogleChromeLabs.pywebsocket3.git".insteadOf "${ORI}/external/github.com/GoogleChromeLabs/pywebsocket3.git" $ git config --global url."${MIR}/chromium/khaledhosny.ots.git".insteadOf "${ORI}/external/github.com/khaledhosny/ots.git" $ git config --global url."${MIR}/chromium/leveldb.git".insteadOf "${ORI}/external/leveldb.git" $ git config --global url."${MIR}/chromium/liblouis-github.git".insteadOf "${ORI}/external/liblouis-github.git" $ git config --global url."${MIR}/chromium/instrumented_libraries.git".insteadOf "${ORI}/chromium/third_party/instrumented_libraries.git" $ git config --global url."${MIR}/chromium/libaddressinput.git".insteadOf "${ORI}/external/libaddressinput.git" $ git config --global url."${MIR}/chromium/linux-syscall-support.git".insteadOf "${ORI}/linux-syscall-support.git" $ git config --global url."${MIR}/chromium/material-foundation.material-color-utilities.git".insteadOf "${ORI}/external/github.com/material-foundation/material-color-utilities.git" $ git config --global url."${MIR}/chromium/search_engines_data.git".insteadOf "${ORI}/external/search_engines_data.git" $ git config --global url."${MIR}/chromium/SeleniumHQ.selenium.py.git".insteadOf "${ORI}/external/github.com/SeleniumHQ/selenium/py.git" $ git config --global url."${MIR}/chromium/smhasher.git".insteadOf "${ORI}/external/smhasher.git" $ git config --global url."${MIR}/chromium/llvm.llvm-project.compiler-rt.git".insteadOf "${ORI}/external/github.com/llvm/llvm-project/compiler-rt.git" $ git config --global url."${MIR}/chromium/llvm.llvm-project.compiler-rt.lib.fuzzer.git".insteadOf "${ORI}/external/github.com/llvm/llvm-project/compiler-rt/lib/fuzzer.git" $ git config --global url."${MIR}/chromium/llvm.llvm-project.clang.tools.clang-format.git".insteadOf "${ORI}/external/github.com/llvm/llvm-project/clang/tools/clang-format.git" $ git config --global url."${MIR}/chromium/llvm.llvm-project.libc.git".insteadOf "${ORI}/external/github.com/llvm/llvm-project/libc.git" $ git config --global url."${MIR}/chromium/llvm.llvm-project.libcxx.git".insteadOf "${ORI}/external/github.com/llvm/llvm-project/libcxx.git" $ git config --global url."${MIR}/chromium/llvm.llvm-project.libcxxabi.git".insteadOf "${ORI}/external/github.com/llvm/llvm-project/libcxxabi.git" $ git config --global url."${MIR}/chromium/llvm.llvm-project.libunwind.git".insteadOf "${ORI}/external/github.com/llvm/llvm-project/libunwind.git" $ git config --global url."${MIR}/chromium/openscreen.git".insteadOf "${ORI}/openscreen" $ git config --global url."${MIR}/chromium/protocolbuffers.protobuf-javascript.git".insteadOf "${ORI}/external/github.com/protocolbuffers/protobuf-javascript" $ git config --global url."${MIR}/chromium/vulkan-deps.git".insteadOf "${ORI}/vulkan-deps" $ git config --global url."${MIR}/chromium/wasm-tts-engine.git".insteadOf "${ORI}/chromium/wasm-tts-engine" $ git config --global url."${MIR}/chromium/WebKit.JetStream.git".insteadOf "${ORI}/external/github.com/WebKit/JetStream.git" $ git config --global url."${MIR}/chromium/WebKit.Speedometer.git".insteadOf "${ORI}/external/github.com/WebKit/Speedometer.git" $ git config --global url."${MIR}/chromium/wayland.weston.git".insteadOf "${ORI}/external/anongit.freedesktop.org/git/wayland/weston.git" $ git config --global url."${MIR}/chromium/webpagereplay.git".insteadOf "${ORI}/webpagereplay.git" $ git config --global url."${MIR}/chromiumos/libdrm.git".insteadOf "${ORI}/chromiumos/third_party/libdrm.git" $ git config --global url."${MIR}/chromiumos/platform.libva-fake-driver.git".insteadOf "${ORI}/chromiumos/platform/libva-fake-driver.git" $ git config --global url."${MIR}/chromiumos/platform.minigbm.git".insteadOf "${ORI}/chromiumos/platform/minigbm.git" $ git config --global url."${MIR}/chromiumos/platform2.system_api.git".insteadOf "${ORI}/chromiumos/platform2/system_api.git" $ git config --global url."${MIR}/chromiumos/platform2.libipp.git".insteadOf "${ORI}/chromiumos/platform2/libipp.git" $ git config --global url."${MIR}/chromiumos/pyelftools.git".insteadOf "${ORI}/chromiumos/third_party/pyelftools.git" $ git config --global url."${MIR}/google/Accessibility-Test-Framework-for-Android.git".insteadOf "${ORI}/external/github.com/google/Accessibility-Test-Framework-for-Android.git" $ git config --global url."${MIR}/google/anonymous-tokens.git".insteadOf "${ORI}/external/github.com/google/anonymous-tokens.git" $ git config --global url."${MIR}/google/benchmark.git".insteadOf "${ORI}/external/github.com/google/benchmark.git" $ git config --global url."${MIR}/google/beto-core.git".insteadOf "https://beto-core.googlesource.com/beto-core.git" $ git config --global url."${MIR}/google/boringssl.git".insteadOf "https://boringssl.googlesource.com/boringssl.git" $ git config --global url."${MIR}/google/compact_enc_det.git".insteadOf "${ORI}/external/github.com/google/compact_enc_det.git" $ git config --global url."${MIR}/google/crc32c.git".insteadOf "${ORI}/external/github.com/google/crc32c.git" $ git config --global url."${MIR}/google/cpu_features.git".insteadOf "${ORI}/external/github.com/google/cpu_features.git" $ git config --global url."${MIR}/google/cld_3.git".insteadOf "${ORI}/external/github.com/google/cld_3.git" $ git config --global url."${MIR}/google/dawn.git".insteadOf "https://dawn.googlesource.com/dawn.git" $ git config --global url."${MIR}/google/emoji-segmenter.git".insteadOf "${ORI}/external/github.com/google/emoji-segmenter.git" $ git config --global url."${MIR}/google/farmhash.git".insteadOf "${ORI}/external/github.com/google/farmhash.git" $ git config --global url."${MIR}/google/flatbuffers.git".insteadOf "${ORI}/external/github.com/google/flatbuffers.git" $ git config --global url."${MIR}/google/fuzztest.git".insteadOf "${ORI}/external/github.com/google/fuzztest.git" $ git config --global url."${MIR}/google/gemmlowp.git".insteadOf "${ORI}/external/github.com/google/gemmlowp.git" $ git config --global url."${MIR}/google/googletest.git".insteadOf "${ORI}/external/github.com/google/googletest.git" $ git config --global url."${MIR}/google/highway.git".insteadOf "${ORI}/external/github.com/google/highway.git" $ git config --global url."${MIR}/google/ink.git".insteadOf "${ORI}/external/github.com/google/ink.git" $ git config --global url."${MIR}/google/ink-stroke-modeler.git".insteadOf "${ORI}/external/github.com/google/ink-stroke-modeler.git" $ git config --global url."${MIR}/google/libphonenumber.git".insteadOf "${ORI}/external/libphonenumber.git" $ git config --global url."${MIR}/google/libprotobuf-mutator.git".insteadOf "${ORI}/external/github.com/google/libprotobuf-mutator.git" $ git config --global url."${MIR}/google/pdfium.git".insteadOf "https://pdfium.googlesource.com/pdfium.git" $ git config --global url."${MIR}/google/pthreadpool.git".insteadOf "${ORI}/external/github.com/google/pthreadpool.git" $ git config --global url."${MIR}/google/quiche.git".insteadOf "https://quiche.googlesource.com/quiche.git" $ git config --global url."${MIR}/google/ukey2.git".insteadOf "${ORI}/external/github.com/google/ukey2.git" $ git config --global url."${MIR}/google/website.git".insteadOf "${ORI}/website.git" $ git config --global url."${MIR}/google/wuffs-mirror-release-c.git".insteadOf "https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git" $ git config --global url."${MIR}/google/XNNPACK.git".insteadOf "${ORI}/external/github.com/google/XNNPACK.git" $ git config --global url."${MIR}/google3/cros_components.git".insteadOf "${ORI}/external/google3/cros_components.git" $ git config --global url."${MIR}/googleprojectzero/domato.git".insteadOf "${ORI}/external/github.com/googleprojectzero/domato.git" $ git config --global url."${MIR}/libeigen/eigen.git".insteadOf "${ORI}/external/gitlab.com/libeigen/eigen.git" $ git config --global url."${MIR}/videolan/dav1d.git".insteadOf "${ORI}/external/github.com/videolan/dav1d.git" $ git config --global url."${MIR}/libexpat/libexpat.git".insteadOf "${ORI}/external/github.com/libexpat/libexpat.git" $ git config --global url."${MIR}/Maratyszcza/FP16.git".insteadOf "${ORI}/external/github.com/Maratyszcza/FP16.git" $ git config --global url."${MIR}/Maratyszcza/FXdiv.git".insteadOf "${ORI}/external/github.com/Maratyszcza/FXdiv.git" $ git config --global url."${MIR}/fastfloat/fast_float.git".insteadOf "${ORI}/external/github.com/fastfloat/fast_float.git" $ git config --global url."${MIR}/freetype/freetype2-testing.git".insteadOf "${ORI}/external/github.com/freetype/freetype2-testing.git" $ git config --global url."${MIR}/harfbuzz/harfbuzz.git".insteadOf "${ORI}/external/github.com/harfbuzz/harfbuzz.git" $ git config --global url."${MIR}/v8/v8.git".insteadOf "${ORI}/v8/v8.git" $ git config --global url."${MIR}/v8/fuzzer_wasm_corpus.git".insteadOf "${ORI}/v8/fuzzer_wasm_corpus.git" $ git config --global url."${MIR}/angle/angle.git".insteadOf "${ORI}/angle/angle.git" $ git config --global url."${MIR}/aomedia/aom.git".insteadOf "https://aomedia.googlesource.com/aom.git" $ git config --global url."${MIR}/open-source-parsers/jsoncpp.git".insteadOf "${ORI}/external/github.com/open-source-parsers/jsoncpp.git" $ git config --global url."${MIR}/webm/libvpx.git".insteadOf "${ORI}/webm/libvpx.git" $ git config --global url."${MIR}/webm/libwebm.git".insteadOf "${ORI}/webm/libwebm.git" $ git config --global url."${MIR}/webm/libwebp.git".insteadOf "${ORI}/webm/libwebp.git" $ git config --global url."${MIR}/intel/ARM_NEON_2_x86_SSE.git".insteadOf "${ORI}/external/github.com/intel/ARM_NEON_2_x86_SSE.git" $ git config --global url."${MIR}/intel/tinycbor.git".insteadOf "${ORI}/external/github.com/intel/tinycbor.git" $ git config --global url."${MIR}/libyuv/libyuv.git".insteadOf "${ORI}/libyuv/libyuv.git" $ git config --global url."${MIR}/android/platform.external.perfetto.git".insteadOf "https://android.googlesource.com/platform/external/perfetto.git" $ git config --global url."${MIR}/cisco/openh264.git".insteadOf "${ORI}/external/github.com/cisco/openh264" $ git config --global url."${MIR}/skia/skia.git".insteadOf "https://skia.googlesource.com/skia.git" $ git config --global url."${MIR}/tensorflow/tensorflow.git".insteadOf "${ORI}/external/github.com/tensorflow/tensorflow.git" $ git config --global url."${MIR}/KhronosGroup/glslang.git".insteadOf "${ORI}/external/github.com/KhronosGroup/glslang" $ git config --global url."${MIR}/KhronosGroup/EGL-Registry.git".insteadOf "${ORI}/external/github.com/KhronosGroup/EGL-Registry" $ git config --global url."${MIR}/KhronosGroup/OpenGL-Registry.git".insteadOf "${ORI}/external/github.com/KhronosGroup/OpenGL-Registry" $ git config --global url."${MIR}/KhronosGroup/SPIRV-Cross.git".insteadOf "${ORI}/external/github.com/KhronosGroup/SPIRV-Cross" $ git config --global url."${MIR}/KhronosGroup/SPIRV-Headers.git".insteadOf "${ORI}/external/github.com/KhronosGroup/SPIRV-Headers" $ git config --global url."${MIR}/KhronosGroup/SPIRV-Toos.git".insteadOf "${ORI}/external/github.com/KhronosGroup/SPIRV-Toos" $ git config --global url."${MIR}/KhronosGroup/Vulkan-Headers.git".insteadOf "${ORI}/external/github.com/KhronosGroup/Vulkan-Headers" $ git config --global url."${MIR}/KhronosGroup/Vulkan-ValidationLayers.git".insteadOf "${ORI}/external/github.com/KhronosGroup/Vulkan-ValidationLayers" $ git config --global url."${MIR}/KhronosGroup/Vulkan-Loader.git".insteadOf "${ORI}/external/github.com/KhronosGroup/Vulkan-Loader" $ git config --global url."${MIR}/KhronosGroup/Vulkan-Utility-Libraries.git".insteadOf "${ORI}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries" $ git config --global url."${MIR}/KhronosGroup/Vulkan-Tools.git".insteadOf "${ORI}/external/github.com/KhronosGroup/Vulkan-Tools" $ git config --global url."${MIR}/KhronosGroup/VK-GL-CTS.git".insteadOf "${ORI}/external/github.com/KhronosGroup/VK-GL-CTS" $ git config --global url."${MIR}/KhronosGroup/WebGL.git".insteadOf "${ORI}/external/khronosgroup/webgl.git" $ git config --global url."${MIR}/swiftshader/SwiftShader.git".insteadOf "https://swiftshader.googlesource.com/SwiftShader.git" $ git config --global url."${MIR}/GoogleChromeLabs/text-fragments-polyfill.git".insteadOf "${ORI}/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git" $ git config --global url."${MIR}/wayland/wayland.git".insteadOf "${ORI}/external/anongit.freedesktop.org/git/wayland/wayland.git" $ git config --global url."${MIR}/wayland/wayland-protocols.git".insteadOf "${ORI}/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git" $ git config --global url."${MIR}/gpuweb/cts".insteadOf "${ORI}/external/github.com/gpuweb/cts" $ git config --global url."${MIR}/GNOME/gtk.git".insteadOf "${ORI}/external/github.com/GNOME/gtk.git" $ git config --global url."${MIR}/KDE/plasma-wayland-protocols.git".insteadOf "${ORI}/external/github.com/KDE/plasma-wayland-protocols.git" $ git config --global url."${MIR}/webrtc/src.git".insteadOf "https://webrtc.googlesource.com/src.git" $ git config --global url."${MIR}/facebook/zstd.git".insteadOf "${ORI}/external/github.com/facebook/zstd.git" $ git config --global url."${MIR}/glmark2/glmark2.git".insteadOf "${ORI}/external/github.com/glmark2/glmark2" $ git config --global url."${MIR}/Tencent/rapidjson.git".insteadOf "${ORI}/external/github.com/Tencent/rapidjson" $ git config --global url."${MIR}/microsoft/DirectX-Headers.git".insteadOf "${ORI}/external/github.com/microsoft/DirectX-Headers" $ git config --global url."${MIR}/microsoft/DirectXShaderCompiler.git".insteadOf "${ORI}/external/github.com/microsoft/DirectXShaderCompiler" $ git config --global url."${MIR}/glfw/glfw.git".insteadOf "${ORI}/external/github.com/glfw/glfw" $ git config --global url."${MIR}/toji/webvr.info.git".insteadOf "${ORI}/external/github.com/toji/webvr.info.git" $ git config --global url."${MIR}/pytorch/cpuinfo.git".insteadOf "${ORI}/external/github.com/pytorch/cpuinfo.git" $ git config --global url."${MIR}/webmproject/CrabbyAvif.git".insteadOf "${ORI}/external/github.com/webmproject/CrabbyAvif.git" |
命令执行后的 .gitconfig 文件:
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
[url "https://www.mobibrw.com/gitea-mirrors/chromium/aosp.platform.system.core.libsync.git"] insteadOf = https://chromium.googlesource.com/aosp/platform/system/core/libsync.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/breakpad.git"] insteadOf = https://chromium.googlesource.com/breakpad/breakpad.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/buildtools.git"] insteadOf = https://chromium.googlesource.com/chromium/src/buildtools [url "https://www.mobibrw.com/gitea-mirrors/chromium/catapult.git"] insteadOf = https://chromium.googlesource.com/catapult.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/cdm.git"] insteadOf = https://chromium.googlesource.com/chromium/cdm.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/canvas_bench.git"] insteadOf = https://chromium.googlesource.com/chromium/canvas_bench.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/crossbench.git"] insteadOf = https://chromium.googlesource.com/crossbench.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/colorama.git"] insteadOf = https://chromium.googlesource.com/external/colorama.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/content_analysis_sdk.git"] insteadOf = https://chromium.googlesource.com/external/github.com/chromium/content_analysis_sdk.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/codecs.libgav1.git"] insteadOf = https://chromium.googlesource.com/codecs/libgav1.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/cast_core.public.git"] insteadOf = https://chromium.googlesource.com/cast_core/public [url "https://www.mobibrw.com/gitea-mirrors/chromium/depot_tools.git"] insteadOf = https://chromium.googlesource.com/chromium/tools/depot_tools.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/devtools.devtools-frontend.git"] insteadOf = https://chromium.googlesource.com/devtools/devtools-frontend [url "https://www.mobibrw.com/gitea-mirrors/chromium/deps.libjpeg_turbo.git"] insteadOf = https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/deps.libsrtp.git"] insteadOf = https://chromium.googlesource.com/chromium/deps/libsrtp.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/deps.hunspell_dictionaries.git"] insteadOf = https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/deps.icu.git"] insteadOf = https://chromium.googlesource.com/chromium/deps/icu.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/deps.nasm.git"] insteadOf = https://chromium.googlesource.com/chromium/deps/nasm.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/deps.sqlite.git"] insteadOf = https://chromium.googlesource.com/chromium/deps/sqlite.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/deps.xdg-utils.git"] insteadOf = https://chromium.googlesource.com/chromium/deps/xdg-utils.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/dom-distiller.dist.git"] insteadOf = https://chromium.googlesource.com/chromium/dom-distiller/dist.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/frame_rate.content.git"] insteadOf = https://chromium.googlesource.com/chromium/frame_rate/content.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/ffmpeg.git"] insteadOf = https://chromium.googlesource.com/chromium/third_party/ffmpeg.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/fontconfig.git"] insteadOf = https://chromium.googlesource.com/external/fontconfig.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/flac.git"] insteadOf = https://chromium.googlesource.com/chromium/deps/flac.git [url "https://www.mobibrw.com/gitea-mirrors/freetype/freetype2-testing.git"] insteadOf = https://chromium.googlesource.com/external/github.com/freetype/freetype2-testing.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/GPUOpen-LibrariesAndSDKs.VulkanMemoryAllocator.git"] insteadOf = https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/google.snappy.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/snappy.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/google.quic-trace.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/quic-trace.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/google.ruy.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/ruy.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/google.nearby-connections.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/nearby-connections.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/google.securemessage.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/securemessage.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/google.re2.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/re2.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/GoogleChromeLabs.pywebsocket3.git"] insteadOf = https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/pywebsocket3.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/khaledhosny.ots.git"] insteadOf = https://chromium.googlesource.com/external/github.com/khaledhosny/ots.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/leveldb.git"] insteadOf = https://chromium.googlesource.com/external/leveldb.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/liblouis-github.git"] insteadOf = https://chromium.googlesource.com/external/liblouis-github.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/instrumented_libraries.git"] insteadOf = https://chromium.googlesource.com/chromium/third_party/instrumented_libraries.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/libaddressinput.git"] insteadOf = https://chromium.googlesource.com/external/libaddressinput.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/linux-syscall-support.git"] insteadOf = https://chromium.googlesource.com/linux-syscall-support.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/material-foundation.material-color-utilities.git"] insteadOf = https://chromium.googlesource.com/external/github.com/material-foundation/material-color-utilities.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/search_engines_data.git"] insteadOf = https://chromium.googlesource.com/external/search_engines_data.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/SeleniumHQ.selenium.py.git"] insteadOf = https://chromium.googlesource.com/external/github.com/SeleniumHQ/selenium/py.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/smhasher.git"] insteadOf = https://chromium.googlesource.com/external/smhasher.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.compiler-rt.git"] insteadOf = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/compiler-rt.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.compiler-rt.lib.fuzzer.git"] insteadOf = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/compiler-rt/lib/fuzzer.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.clang.tools.clang-format.git"] insteadOf = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/clang/tools/clang-format.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.libc.git"] insteadOf = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libc.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.libcxx.git"] insteadOf = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.libcxxabi.git"] insteadOf = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.libunwind.git"] insteadOf = https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libunwind.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/openscreen.git"] insteadOf = https://chromium.googlesource.com/openscreen [url "https://www.mobibrw.com/gitea-mirrors/chromium/protocolbuffers.protobuf-javascript.git"] insteadOf = https://chromium.googlesource.com/external/github.com/protocolbuffers/protobuf-javascript [url "https://www.mobibrw.com/gitea-mirrors/chromium/vulkan-deps.git"] insteadOf = https://chromium.googlesource.com/vulkan-deps [url "https://www.mobibrw.com/gitea-mirrors/chromium/wasm-tts-engine.git"] insteadOf = https://chromium.googlesource.com/chromium/wasm-tts-engine [url "https://www.mobibrw.com/gitea-mirrors/chromium/WebKit.JetStream.git"] insteadOf = https://chromium.googlesource.com/external/github.com/WebKit/JetStream.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/WebKit.Speedometer.git"] insteadOf = https://chromium.googlesource.com/external/github.com/WebKit/Speedometer.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/wayland.weston.git"] insteadOf = https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/weston.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/webpagereplay.git"] insteadOf = https://chromium.googlesource.com/webpagereplay.git [url "https://www.mobibrw.com/gitea-mirrors/chromiumos/libdrm.git"] insteadOf = https://chromium.googlesource.com/chromiumos/third_party/libdrm.git [url "https://www.mobibrw.com/gitea-mirrors/chromiumos/platform.libva-fake-driver.git"] insteadOf = https://chromium.googlesource.com/chromiumos/platform/libva-fake-driver.git [url "https://www.mobibrw.com/gitea-mirrors/chromiumos/platform.minigbm.git"] insteadOf = https://chromium.googlesource.com/chromiumos/platform/minigbm.git [url "https://www.mobibrw.com/gitea-mirrors/chromiumos/platform2.system_api.git"] insteadOf = https://chromium.googlesource.com/chromiumos/platform2/system_api.git [url "https://www.mobibrw.com/gitea-mirrors/chromiumos/platform2.libipp.git"] insteadOf = https://chromium.googlesource.com/chromiumos/platform2/libipp.git [url "https://www.mobibrw.com/gitea-mirrors/chromiumos/pyelftools.git"] insteadOf = https://chromium.googlesource.com/chromiumos/third_party/pyelftools.git [url "https://www.mobibrw.com/gitea-mirrors/google/Accessibility-Test-Framework-for-Android.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/Accessibility-Test-Framework-for-Android.git [url "https://www.mobibrw.com/gitea-mirrors/google/anonymous-tokens.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/anonymous-tokens.git [url "https://www.mobibrw.com/gitea-mirrors/google/benchmark.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/benchmark.git [url "https://www.mobibrw.com/gitea-mirrors/google/beto-core.git"] insteadOf = https://beto-core.googlesource.com/beto-core.git [url "https://www.mobibrw.com/gitea-mirrors/google/boringssl.git"] insteadOf = https://boringssl.googlesource.com/boringssl.git [url "https://www.mobibrw.com/gitea-mirrors/google/compact_enc_det.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/compact_enc_det.git [url "https://www.mobibrw.com/gitea-mirrors/google/crc32c.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/crc32c.git [url "https://www.mobibrw.com/gitea-mirrors/google/cpu_features.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/cpu_features.git [url "https://www.mobibrw.com/gitea-mirrors/google/cld_3.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/cld_3.git [url "https://www.mobibrw.com/gitea-mirrors/google/dawn.git"] insteadOf = https://dawn.googlesource.com/dawn.git [url "https://www.mobibrw.com/gitea-mirrors/google/emoji-segmenter.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/emoji-segmenter.git [url "https://www.mobibrw.com/gitea-mirrors/google/farmhash.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/farmhash.git [url "https://www.mobibrw.com/gitea-mirrors/google/flatbuffers.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/flatbuffers.git [url "https://www.mobibrw.com/gitea-mirrors/google/fuzztest.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/fuzztest.git [url "https://www.mobibrw.com/gitea-mirrors/google/gemmlowp.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/gemmlowp.git [url "https://www.mobibrw.com/gitea-mirrors/google/googletest.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/googletest.git [url "https://www.mobibrw.com/gitea-mirrors/google/highway.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/highway.git [url "https://www.mobibrw.com/gitea-mirrors/google/ink.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/ink.git [url "https://www.mobibrw.com/gitea-mirrors/google/ink-stroke-modeler.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/ink-stroke-modeler.git [url "https://www.mobibrw.com/gitea-mirrors/google/libphonenumber.git"] insteadOf = https://chromium.googlesource.com/external/libphonenumber.git [url "https://www.mobibrw.com/gitea-mirrors/google/libprotobuf-mutator.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/libprotobuf-mutator.git [url "https://www.mobibrw.com/gitea-mirrors/google/pdfium.git"] insteadOf = https://pdfium.googlesource.com/pdfium.git [url "https://www.mobibrw.com/gitea-mirrors/google/pthreadpool.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/pthreadpool.git [url "https://www.mobibrw.com/gitea-mirrors/google/quiche.git"] insteadOf = https://quiche.googlesource.com/quiche.git [url "https://www.mobibrw.com/gitea-mirrors/google/ukey2.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/ukey2.git [url "https://www.mobibrw.com/gitea-mirrors/google/website.git"] insteadOf = https://chromium.googlesource.com/website.git [url "https://www.mobibrw.com/gitea-mirrors/google/wuffs-mirror-release-c.git"] insteadOf = https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git [url "https://www.mobibrw.com/gitea-mirrors/google/XNNPACK.git"] insteadOf = https://chromium.googlesource.com/external/github.com/google/XNNPACK.git [url "https://www.mobibrw.com/gitea-mirrors/google3/cros_components.git"] insteadOf = https://chromium.googlesource.com/external/google3/cros_components.git [url "https://www.mobibrw.com/gitea-mirrors/googleprojectzero/domato.git"] insteadOf = https://chromium.googlesource.com/external/github.com/googleprojectzero/domato.git [url "https://www.mobibrw.com/gitea-mirrors/libeigen/eigen.git"] insteadOf = https://chromium.googlesource.com/external/gitlab.com/libeigen/eigen.git [url "https://www.mobibrw.com/gitea-mirrors/videolan/dav1d.git"] insteadOf = https://chromium.googlesource.com/external/github.com/videolan/dav1d.git [url "https://www.mobibrw.com/gitea-mirrors/libexpat/libexpat.git"] insteadOf = https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git [url "https://www.mobibrw.com/gitea-mirrors/Maratyszcza/FP16.git"] insteadOf = https://chromium.googlesource.com/external/github.com/Maratyszcza/FP16.git [url "https://www.mobibrw.com/gitea-mirrors/Maratyszcza/FXdiv.git"] insteadOf = https://chromium.googlesource.com/external/github.com/Maratyszcza/FXdiv.git [url "https://www.mobibrw.com/gitea-mirrors/fastfloat/fast_float.git"] insteadOf = https://chromium.googlesource.com/external/github.com/fastfloat/fast_float.git [url "https://www.mobibrw.com/gitea-mirrors/chromium/freetype2.git"] insteadOf = https://chromium.googlesource.com/chromium/src/third_party/freetype2.git [url "https://www.mobibrw.com/gitea-mirrors/harfbuzz/harfbuzz.git"] insteadOf = https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git [url "https://www.mobibrw.com/gitea-mirrors/v8/v8.git"] insteadOf = https://chromium.googlesource.com/v8/v8.git [url "https://www.mobibrw.com/gitea-mirrors/v8/fuzzer_wasm_corpus.git"] insteadOf = https://chromium.googlesource.com/v8/fuzzer_wasm_corpus.git [url "https://www.mobibrw.com/gitea-mirrors/angle/angle.git"] insteadOf = https://chromium.googlesource.com/angle/angle.git [url "https://www.mobibrw.com/gitea-mirrors/aomedia/aom.git"] insteadOf = https://aomedia.googlesource.com/aom.git [url "https://www.mobibrw.com/gitea-mirrors/open-source-parsers/jsoncpp.git"] insteadOf = https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git [url "https://www.mobibrw.com/gitea-mirrors/webm/libvpx.git"] insteadOf = https://chromium.googlesource.com/webm/libvpx.git [url "https://www.mobibrw.com/gitea-mirrors/webm/libwebm.git"] insteadOf = https://chromium.googlesource.com/webm/libwebm.git [url "https://www.mobibrw.com/gitea-mirrors/webm/libwebp.git"] insteadOf = https://chromium.googlesource.com/webm/libwebp.git [url "https://www.mobibrw.com/gitea-mirrors/intel/ARM_NEON_2_x86_SSE.git"] insteadOf = https://chromium.googlesource.com/external/github.com/intel/ARM_NEON_2_x86_SSE.git [url "https://www.mobibrw.com/gitea-mirrors/intel/tinycbor.git"] insteadOf = https://chromium.googlesource.com/external/github.com/intel/tinycbor.git [url "https://www.mobibrw.com/gitea-mirrors/libyuv/libyuv.git"] insteadOf = https://chromium.googlesource.com/libyuv/libyuv.git [url "https://www.mobibrw.com/gitea-mirrors/android/platform.external.perfetto.git"] insteadOf = https://android.googlesource.com/platform/external/perfetto.git [url "https://www.mobibrw.com/gitea-mirrors/cisco/openh264.git"] insteadOf = https://chromium.googlesource.com/external/github.com/cisco/openh264 [url "https://www.mobibrw.com/gitea-mirrors/skia/skia.git"] insteadOf = https://skia.googlesource.com/skia.git [url "https://www.mobibrw.com/gitea-mirrors/tensorflow/tensorflow.git"] insteadOf = https://chromium.googlesource.com/external/github.com/tensorflow/tensorflow.git [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/glslang.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/EGL-Registry.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/EGL-Registry [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/OpenGL-Registry.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/SPIRV-Cross.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/SPIRV-Headers.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/SPIRV-Tools.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-Headers.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-ValidationLayers.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-Loader.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-Utility-Libraries.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-Tools.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/VK-GL-CTS.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS [url "https://www.mobibrw.com/gitea-mirrors/KhronosGroup/WebGL.git"] insteadOf = https://chromium.googlesource.com/external/khronosgroup/webgl.git [url "https://www.mobibrw.com/gitea-mirrors/swiftshader/SwiftShader.git"] insteadOf = https://swiftshader.googlesource.com/SwiftShader.git [url "https://www.mobibrw.com/gitea-mirrors/GoogleChromeLabs/text-fragments-polyfill.git"] insteadOf = https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git [url "https://www.mobibrw.com/gitea-mirrors/wayland/wayland.git"] insteadOf = https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland.git [url "https://www.mobibrw.com/gitea-mirrors/wayland/wayland-protocols.git"] insteadOf = https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git [url "https://www.mobibrw.com/gitea-mirrors/gpuweb/cts"] insteadOf = https://chromium.googlesource.com/external/github.com/gpuweb/cts [url "https://www.mobibrw.com/gitea-mirrors/GNOME/gtk.git"] insteadOf = https://chromium.googlesource.com/external/github.com/GNOME/gtk.git [url "https://www.mobibrw.com/gitea-mirrors/KDE/plasma-wayland-protocols.git"] insteadOf = https://chromium.googlesource.com/external/github.com/KDE/plasma-wayland-protocols.git [url "https://www.mobibrw.com/gitea-mirrors/webrtc/src.git"] insteadOf = https://webrtc.googlesource.com/src.git [url "https://www.mobibrw.com/gitea-mirrors/facebook/zstd.git"] insteadOf = https://chromium.googlesource.com/external/github.com/facebook/zstd.git [url "https://www.mobibrw.com/gitea-mirrors/glmark2/glmark2.git"] insteadOf = https://chromium.googlesource.com/external/github.com/glmark2/glmark2 [url "https://www.mobibrw.com/gitea-mirrors/Tencent/rapidjson.git"] insteadOf = https://chromium.googlesource.com/external/github.com/Tencent/rapidjson [url "https://www.mobibrw.com/gitea-mirrors/microsoft/DirectX-Headers.git"] insteadOf = https://chromium.googlesource.com/external/github.com/microsoft/DirectX-Headers [url "https://www.mobibrw.com/gitea-mirrors/microsoft/DirectXShaderCompiler.git"] insteadOf = https://chromium.googlesource.com/external/github.com/microsoft/DirectXShaderCompiler [url "https://www.mobibrw.com/gitea-mirrors/glfw/glfw.git"] insteadOf = https://chromium.googlesource.com/external/github.com/glfw/glfw [url "https://www.mobibrw.com/gitea-mirrors/toji/webvr.info.git"] insteadOf = https://chromium.googlesource.com/external/github.com/toji/webvr.info.git [url "https://www.mobibrw.com/gitea-mirrors/pytorch/cpuinfo.git"] insteadOf = https://chromium.googlesource.com/external/github.com/pytorch/cpuinfo.git [url "https://www.mobibrw.com/gitea-mirrors/webmproject/CrabbyAvif.git"] insteadOf = https://chromium.googlesource.com/external/github.com/webmproject/CrabbyAvif.git |
2. 配置HTTP代理服务器
由于 Chromium 项目不仅依赖了一系列的第三方 Git 项目,还依赖了一系列已经编译后的二进制文件,这些文件被托管在 CIPD (Chrome Infrastructure Package Deployment) / GCS(Google Cloud Storage) 服务器上,这部分服务器也是没办法正常访问下载文件的,因此我们把这些二进制文件依旧托管在刚刚搭建的 Gitea 服务器上面,作为一个独立的 Git 项目来维护,减少非必要的服务器。
但是如何更改这部分的下载地址呢?我们可以通过设置 http_proxy 的方式,使用 Python 脚本,在脚本中完成下载数据的重定向。
代理脚本如下:
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 |
# -*- coding: utf-8 -*- from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler # 以下都是为HTTPS准备的 import os import ssl import socket import datetime import tempfile import threading from urllib.parse import urlparse from cryptography import x509 from typing import Tuple, Optional from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization, hashes from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.x509.oid import NameOID CONTENT_LENGTH = "content-length" TRANS_ENCODING = "transfer-encoding" PRIV_ROOT_KEY = "mitm_rsa_key.pem" PUB_ROOT_KEY = "mitm_rsa_cert.pem" # 注意不能低于 RSA 不能低于 2048 位,否则会报错证书强度太弱 RSA_KEY_SIZE = 2048 # 缓冲区的长度 MAX_BUF_SIZE = 8192 # 生成自签名根证书 # ubuntu 24.04 系统,公钥需要保存到 `/usr/local/share/ca-certificates` 路径下,扩展名改为 .crt,然后执行 `sudo update-ca-certificates` 完成安装 # macOS 15.4 系统 `sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain mitm_rsa_cert.pem` # pub - 公钥的存储路径 # priv - 私钥的存储路径 def generateRootCert(pub, priv): priv_key = rsa.generate_private_key( public_exponent=65537, key_size=RSA_KEY_SIZE, backend=default_backend() ) subject = issuer = x509.Name( [ x509.NameAttribute(NameOID.COUNTRY_NAME, "CN"), x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "MITM"), x509.NameAttribute(NameOID.LOCALITY_NAME, "MITM"), x509.NameAttribute(NameOID.ORGANIZATION_NAME, "MITMProxy"), x509.NameAttribute(NameOID.COMMON_NAME, "mitmproxy.mobibrw.com"), ] ) cert = ( x509.CertificateBuilder() .subject_name(subject) .issuer_name(issuer) .public_key(priv_key.public_key()) .serial_number(x509.random_serial_number()) .not_valid_before(datetime.datetime.now(datetime.timezone.utc)) .not_valid_after( datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=(365 * 99)) ) .add_extension( x509.BasicConstraints(ca=True, path_length=None), critical=True, ) .add_extension( x509.KeyUsage( digital_signature=False, content_commitment=False, key_encipherment=False, data_encipherment=False, key_agreement=False, key_cert_sign=True, crl_sign=False, encipher_only=False, decipher_only=False, ), critical=True, ) .sign(priv_key, hashes.SHA256(), default_backend()) ) # 公钥 with open(pub, "wb") as f: f.write(cert.public_bytes(serialization.Encoding.PEM)) # 私钥 with open(priv, "wb") as f: f.write( priv_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption(), ) ) return priv_key, cert # b'\n\x1cinfra/tools/cipd/linux-amd64\x125git_revision:b1f414539ac10cc67a0250890a38712cc06cf102' class ProtobufParser: """解析 CIPD 发送的 Protobuf 格式数据""" # 定义 Protobuf 字段类型 WIRE_TYPE_VARINT = 0 WIRE_TYPE_64BIT = 1 WIRE_TYPE_LENGTH_DELIMITED = 2 WIRE_TYPE_START_GROUP = 3 WIRE_TYPE_END_GROUP = 4 WIRE_TYPE_32BIT = 5 def _parseVarint(self, data, index): """解析变长整数""" value = 0 shift = 0 while True: byte = data[index] index += 1 value |= (byte & 0x7F) << shift if (byte & 0x80) == 0: break shift += 7 return value, index def _parseField(self, data, index, start_group_stack=None): """解析单个字段""" if start_group_stack is None: start_group_stack = [] tag, index = self._parseVarint(data, index) field_number = tag >> 3 wire_type = tag & 0x07 if ProtobufParser.WIRE_TYPE_VARINT == wire_type: value, index = self._parseVarint(data, index) elif ProtobufParser.WIRE_TYPE_LENGTH_DELIMITED == wire_type: length, index = self._parseVarint(data, index) value = data[index : index + length] index += length elif ProtobufParser.WIRE_TYPE_START_GROUP == wire_type: start_group_stack.append(field_number) group_data = {} while True: inner_field_number, inner_value, index = self._parseField( data, index, start_group_stack ) if inner_field_number == field_number and inner_value is None: break group_data[inner_field_number] = inner_value value = group_data elif ProtobufParser.WIRE_TYPE_END_GROUP == wire_type: if not start_group_stack or start_group_stack[-1] != field_number: raise ValueError( f"Invalid END_GROUP tag for field number {field_number}" ) start_group_stack.pop() value = None else: # 这里仅处理了部分类型,其他类型可以按需扩展 raise ValueError(f"Unsupported wire type: {wire_type}") return field_number, value, index def parse(self, data): """解析 Protobuf 数据""" index = 0 result = {} start_group_stack = [] while index < len(data): field_number, value, index = self._parseField( data, index, start_group_stack ) result[field_number] = value return result class ProxyRules: """替换规则提供者""" # 转发对应信息配置 _rules = [] # 只会在应用启动时加载一次,不使用线程锁 _loaded = False # _rules["https://www.bing.com/"] = "https://www.mobibrw.com" # _rules["https://www.bing.com/aaa"] = "http://www.mobibrw.com/?a=3" # _rules["http://www.bing.com/"] = "http://www.mobibrw.com" # _rules["http://www.bing.com/aa"] = "https://www.mobibrw.com?a=3" def __init__(self): """构造函数""" if not ProxyRules._loaded: from configparser import ConfigParser, ExtendedInterpolation # 需要实例化一个ConfigParser对象 conf = ConfigParser(interpolation=ExtendedInterpolation()) conf.read("mirrors.ini") for section in conf.sections(): raw = conf.get(section, "RAW").strip() rep = conf.get(section, "REP").strip() ProxyRules._rules.append((raw, rep)) ProxyRules._loaded = True def query(self, req_url: str) -> Tuple[bool, Optional[Tuple]]: """获取匹配的转发记录""" for raw, rep in ProxyRules._rules: if req_url.startswith(raw): return (True, (raw, rep)) return (False, (None, None)) class DomainCertProvider: """域名证书提供者,根据域名提供根证书文件""" # 域名证书缓存,如果已经为域名生成过证书则直接从缓存读取,不要重新生成 _DOMAIN_CERT = {} # 多线程访问证书缓存时线程安全锁 _LOCK = threading.Lock() def __init__(self, target_host): """构造函数 Args: domain (string): 域名 """ self.target_host = target_host # 使用 CA 证书为目标域名生成证书 def _generateCert(self, ca_private_key, ca_cert): private_key = rsa.generate_private_key( public_exponent=65537, key_size=RSA_KEY_SIZE, backend=default_backend() ) subject = x509.Name( [ x509.NameAttribute(NameOID.COMMON_NAME, self.target_host), ] ) cert = ( x509.CertificateBuilder() .subject_name(subject) .issuer_name(ca_cert.issuer) .public_key(private_key.public_key()) .serial_number(x509.random_serial_number()) .not_valid_before(datetime.datetime.now(datetime.timezone.utc)) .not_valid_after( datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=365) ) .add_extension( x509.SubjectAlternativeName([x509.DNSName(self.target_host)]), critical=False, ) .sign(ca_private_key, hashes.SHA256(), default_backend()) ) return private_key, cert # 获取或者新生成目标域名证书并进行缓存 def _getOrGenerateDomainCert(self): DomainCertProvider._LOCK.acquire() try: if self.target_host in DomainCertProvider._DOMAIN_CERT: return DomainCertProvider._DOMAIN_CERT[self.target_host] finally: DomainCertProvider._LOCK.release() # 生成目标域名的证书 ca_priv_key = serialization.load_pem_private_key( open(PRIV_ROOT_KEY, "rb").read(), password=None, backend=default_backend(), ) ca_cert = x509.load_pem_x509_certificate( open(PUB_ROOT_KEY, "rb").read(), default_backend() ) target_priv_key, target_cert = self._generateCert(ca_priv_key, ca_cert) # 加载证书和私钥 pub_bytes = target_cert.public_bytes(serialization.Encoding.PEM) priv_bytes = target_priv_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption(), ) DomainCertProvider._LOCK.acquire() try: DomainCertProvider._DOMAIN_CERT[self.target_host] = (pub_bytes, priv_bytes) return DomainCertProvider._DOMAIN_CERT[self.target_host] finally: DomainCertProvider._LOCK.release() # 获取生成的目标域名证书的存储路径 def certFile(self): (pub_bytes, priv_bytes) = self._getOrGenerateDomainCert() # 创建临时文件并写入证书和私钥数据 with tempfile.NamedTemporaryFile(delete=False) as pub_temp_file: pub_temp_file.write(pub_bytes) pub_temp_path = pub_temp_file.name with tempfile.NamedTemporaryFile(delete=False) as priv_temp_file: priv_temp_file.write(priv_bytes) priv_temp_path = priv_temp_file.name return pub_temp_path, priv_temp_path class BasicProxyHandler: def _recvHttpContent(self, http_header, rfile): """读取有ContentLength的数据,一次性读取完成 Args: http_header (Dic): HTTP请求/响应头 rfile (File): 执行数据读取的 socket.makefile('rb', rbufsize) """ if CONTENT_LENGTH in http_header: # 分块发送响应体给客户端 content_length = int(http_header.get(CONTENT_LENGTH, 0)) return rfile.read(content_length) def _recvHttpHeader(self, rfile): """读取 HTTP 请求/响应头 Args: rfile (File): 执行数据接收的 socket 文件 Returns: res (bool) 是否已经解析成功, True 解析成功, False 解析失败 http_line (str): 请求方法/响应结果行 http_headers: 请求或者响应头 """ # 判断并解析响应数据 recv_data = b"" while True: # 读取HTTP头 # 此处,我们为了方便后续转发解析报文体方便 # 在报文头部分采用逐字节读取方式进行处理,避免出现多读到报文体的情况 # 虽然效率比较低,但是由于总体请求链接的数量并不高,所以可以接受这部分的效率损失 recv_data_s = rfile.read(1) # HTTP头都没有接收完整,对方就已经断开连接了 if len(recv_data_s) <= 0: return False, None, None if recv_data.find(b"\r\n\r\n") < 0: recv_data += recv_data_s if recv_data.find(b"\r\n\r\n") < 0: pass else: http_headers = {} # HTTP头解析后的字典 space_line_index = recv_data.index(b"\r\n\r\n") http_line = recv_data[0:space_line_index] for index, barr in enumerate(http_line.split(b"\r\n")): if 0 == index: http_line = barr else: key = barr.split(b":")[0] value = barr.lstrip(key).lstrip(b":") key = key.strip(b" ").lower().decode("utf-8") value = value.strip(b" ").decode("utf-8") http_headers[key] = value return True, http_line.decode("utf-8"), http_headers def _socketFileProxyTrans(self, http_header, rfile, wfile): """根据 HTTP 请求/响应头完成报文的转发 Args: http_header (Dic): HTTP请求/响应头 rfile (File): 执行数据读取的 socket.makefile('rb', rbufsize) wfile (File): 执行数据写入的 socket.makefile('wb', wbufsize) """ if CONTENT_LENGTH in http_header: # 不要一次性读取到内存,采用分块发送数据,避免数据太长导致内存不足 content_length = int(http_header.get(CONTENT_LENGTH, 0)) while content_length > 0: buffer_size = MAX_BUF_SIZE if content_length <= buffer_size: buffer_size = content_length buffer = rfile.read(buffer_size) if not buffer: wfile.flush() break # 此处需要注意不要减去 buffer_size, 原因在于读取返回的缓冲区长度不一定是 buffer_size,可能比预期要小一些 # 因此减去实际接收到的缓冲区大小 content_length -= len(buffer) wfile.write(buffer) wfile.flush() elif TRANS_ENCODING in http_header and "chunked" == http_header[TRANS_ENCODING]: """处理chunked编码的响应体""" while True: chunk_size_line = rfile.readline() if not chunk_size_line: wfile.flush() break wfile.write(chunk_size_line) chunk_size = int(chunk_size_line.strip(), 16) if 0 == chunk_size: wfile.write(b"\r\n") wfile.flush() break # 读取终止块 more = True # 避免过大的 chunk_size while chunk_size > 0: buffer_size = MAX_BUF_SIZE if chunk_size <= buffer_size: buffer_size = chunk_size buffer = rfile.read(buffer_size) if not buffer: more = False wfile.flush() break # 此处需要注意不要减去 buffer_size, 原因在于读取返回的缓冲区长度不一定是 buffer_size,可能比预期要小一些 # 因此减去实际接收到的缓冲区大小 chunk_size -= len(buffer) wfile.write(buffer) wfile.flush() if more: # 读取并写入最后的空行 buffer = rfile.readline() if not buffer: wfile.flush() break wfile.write(buffer) wfile.flush() else: break def _socketProxy( self, rfile, wfile, proxy_rfile, proxy_wfile, req_line, req_headers, is_cipd ): # 请求信息投送出去 proxy_wfile.write(req_line.encode(encoding="utf-8")) proxy_wfile.write(b"\r\n") # 重组报文头 for k, v in req_headers.items(): proxy_wfile.write(f"{k}: {v}\r\n".encode(encoding="utf-8")) # 报文头结束 proxy_wfile.write(b"\r\n") # 转发请求数据 self._socketFileProxyTrans(req_headers, rfile, proxy_wfile) # 重要,不刷新请求发不出去 proxy_wfile.flush() # 读取响应头 res, resp_line, resp_headers = self._recvHttpHeader(proxy_rfile) if not res: print("未能获取到有效响应数据,丢弃此次代理") return wfile.write(resp_line.encode(encoding="utf-8")) wfile.write(b"\r\n") # 重组报文头 for k, v in resp_headers.items(): wfile.write(f"{k}: {v}\r\n".encode(encoding="utf-8")) if is_cipd: # CIPD客户端期望响应头中包含如下字段 wfile.write(b"X-Prpc-Grpc-Code: 0\r\n") # 报文头结束 wfile.write(b"\r\n") # 转发响应数据 self._socketFileProxyTrans(resp_headers, proxy_rfile, wfile) else: # 报文头结束 wfile.write(b"\r\n") # 转发响应数据 self._socketFileProxyTrans(resp_headers, proxy_rfile, wfile) wfile.flush() def _httpConnectProxy( self, rfile, wfile, target_host, target_port, req_line, req_headers, is_cipd, ): proxy_sock = socket.socket() try: proxy_sock.connect((target_host, target_port)) proxy_rfile = proxy_sock.makefile("rb", MAX_BUF_SIZE) try: proxy_wfile = proxy_sock.makefile("wb", MAX_BUF_SIZE) try: self._socketProxy( rfile, wfile, proxy_rfile, proxy_wfile, req_line, req_headers, is_cipd, ) finally: proxy_wfile.close() finally: proxy_rfile.close() finally: proxy_sock.close() def sendHttpError(self, wfile, code, message=None, explain=None): """Send and log an error reply. Arguments are * wfile : 数据投送方 * code: an HTTP error code 3 digits * message: a simple optional 1 line reason phrase. *( HTAB / SP / VCHAR / %x80-FF ) defaults to short entry matching the response code * explain: a detailed message defaults to the long entry matching the response code. This sends an error response (so it must be called before any output has been generated), logs the error, and finally sends a piece of HTML explaining the error to the user. """ from http import HTTPStatus import html resp = ("%s %d %s\r\n" % ("HTTP/1.1", code, "Internal Server Error")).encode( "latin-1", "strict" ) wfile.write(resp) wfile.write(b"Connection:Close \r\n") # Message body is omitted for cases described in: # - RFC7230: 3.3. 1xx, 204(No Content), 304(Not Modified) # - RFC7231: 6.3.6. 205(Reset Content) body = None if code >= 200 and code not in ( HTTPStatus.NO_CONTENT, HTTPStatus.RESET_CONTENT, HTTPStatus.NOT_MODIFIED, ): # HTML encode to prevent Cross Site Scripting attacks # (see bug #1100201) # Default error message template DEFAULT_ERROR_MESSAGE = """\ <!DOCTYPE HTML> <html lang="en"> <head> <meta charset="utf-8"> <title>Error response</title> </head> <body> <h1>Error response</h1> <p>Error code: %(code)d</p> <p>Message: %(message)s.</p> <p>Error code explanation: %(code)s - %(explain)s.</p> </body> </html> """ if explain is None: explain = message content = DEFAULT_ERROR_MESSAGE % { "code": code, "message": html.escape(message, quote=False), "explain": html.escape(explain, quote=False), } body = content.encode("UTF-8", "replace") DEFAULT_ERROR_CONTENT_TYPE = "text/html;charset=UTF-8" wfile.write( f"Content-Type: {DEFAULT_ERROR_CONTENT_TYPE}\r\n".encode("UTF-8") ) wfile.write(f"Content-Length: {len(body)}\r\n".encode("UTF-8")) wfile.write(b"\r\n") if body: wfile.write(body) wfile.flush() def _httpsConnectProxy( self, rfile, wfile, target_host, target_port, req_line, req_headers, is_cipd, ): # 与目标服务器建立 TLS 连接(作为客户端) proxy_sock = socket.socket() try: proxy_sock.connect((target_host, target_port)) # 创建 SSLContext 对象 proxy_context = ssl.create_default_context() proxy_ssl = proxy_context.wrap_socket( proxy_sock, server_hostname=target_host ) proxy_rfile = proxy_ssl.makefile("rb", MAX_BUF_SIZE) try: proxy_wfile = proxy_ssl.makefile("wb", MAX_BUF_SIZE) try: self._socketProxy( rfile, wfile, proxy_rfile, proxy_wfile, req_line, req_headers, is_cipd, ) finally: proxy_wfile.close() finally: proxy_rfile.close() finally: proxy_sock.close() def doProxyCommand( self, scheme, req_line, req_headers, rfile, wfile, original_host, original_port ): # 解析请求行(method, path, protocol) _, path, _ = req_line.split(" ", 2) if path.startswith("http://") or path.startswith("https://"): parsed_url = urlparse(path) path = parsed_url.path # 解析报文头,判断是不是CIPD发出的请求 ua = req_headers["user-agent"] is_cipd = False if ua.endswith("cipd"): is_cipd = True content = self._recvHttpContent(rfile) parser = ProtobufParser() res = parser.parse(content) path += "?" for _, v in res.items(): path += v + "&" if path.endswith("&"): path = path.rstrip("&") # 从配置文件中找到对应的转发记录,如果没有转发记录就保持与原始地址相同的进行转发 req_url = scheme + "://" + original_host if "https" == scheme: if None != original_port and "443" != original_port: req_url += ":" + original_port elif "http" == scheme: if None != original_port and "80" != original_port: req_url += ":" + original_port req_url += path rules = ProxyRules() (res, (raw, rep)) = rules.query(req_url) if res: # 获取代理目标地址 target_url = req_url.replace(raw, rep) # 解析URL parsed_url = urlparse(target_url) target_port = parsed_url.port target_scheme = parsed_url.scheme.lower() target_hostname = parsed_url.hostname req_headers["host"] = parsed_url.hostname req_line = req_line.replace(path, parsed_url.path) print(f"请求链接:'{req_url}' 替换为:'{target_url}'") else: target_port = int(original_port) target_scheme = scheme.lower() target_hostname = original_host print(f"请求链接:'{req_url}' 没有找到匹配替换记录,直接使用原始地址") # 如果对端URL是 HTTPS,则进行HTTPS转发,否则进行HTTP转发 if "https" == target_scheme: if None == target_port or "" == target_port: target_port = 443 self._httpsConnectProxy( rfile, wfile, target_hostname, target_port, req_line, req_headers, is_cipd, ) else: if None == target_port or "" == target_port: target_port = 80 self._httpConnectProxy( rfile, wfile, target_hostname, target_port, req_line, req_headers, is_cipd, ) def doHttpsProxy(self, rfile, wfile, original_host, original_port): # 解析发送请求,获取请求的链接地址 res, req_line, req_headers = self._recvHttpHeader(rfile) if not res: print("未能获取到有效请求数据,丢弃此次代理") return self.doProxyCommand( "https", req_line, req_headers, rfile, wfile, original_host, original_port ) class HttpsProxyHandler(BasicProxyHandler): """HTTPS 转发代理""" def __init__(self, sock, path): """构造函数 Args: sock (Socket): 发起代理请求的 socket path (string): 代理请求的路径 """ self.sock = sock self.path = path def do_HttpsProxy(self): """执行HTTPS代理转发""" original_host, original_port = self.path.split(":") # 注意,一旦 wrap_socket 我们就没办法继续使用这个socket发送数据了,所以需要在 wrap_socket # 之前先与对端建立连接,并且发送 200 给代理申请方 # 签发域名对应的证书 provider = DomainCertProvider(original_host) pub_cert_path, priv_cert_path = provider.certFile() try: # 创建 SSLContext 对象 ssl_context = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH) ssl_context.load_cert_chain(certfile=pub_cert_path, keyfile=priv_cert_path) # 与客户端建立 TLS 连接(作为服务器) req_ssl = ssl_context.wrap_socket(self.sock, server_side=True) finally: # 删除临时文件,握手完成,证书文件就没有必要继续保留了 try: if pub_cert_path: os.remove(pub_cert_path) if priv_cert_path: os.remove(priv_cert_path) except: pass try: rfile = req_ssl.makefile("rb", MAX_BUF_SIZE) try: wfile = req_ssl.makefile("wb", MAX_BUF_SIZE) try: super().doHttpsProxy(rfile, wfile, original_host, original_port) except Exception as e: # 若出现异常,向客户端发送 500 错误响应 super().sendHttpError( wfile, 500, f"Internal Server Error: {str(e)}" ) finally: wfile.close() finally: rfile.close() finally: req_ssl.close() class HttpProxyHandler(BasicProxyHandler): """HTTP 转发代理""" def __init__(self, handler): """构造函数 Args: handler (BaseHTTPRequestHandler): 发起代理请求的处理对象 """ self.headers = handler.headers self.requestline = handler.requestline self.path = handler.path self.rfile = handler.rfile self.wfile = handler.wfile self.send_error = handler.send_error def do_HttpProxy(self): # 从请求头中获取目标服务器的主机信息 host = self.headers.get("Host") if not host: self.send_error(400, "Missing Host header") return target_url = self.path parsed_url = urlparse(target_url) # 处理主机和端口信息 if ":" in host: target_host, target_port = host.split(":") target_port = int(target_port) else: target_host = host if "https" == parsed_url.scheme.lower(): target_port = 443 else: target_port = 80 super().doProxyCommand( parsed_url.scheme, self.requestline, self.headers, self.rfile, self.wfile, target_host, str(target_port), ) class ProxyHandler(BaseHTTPRequestHandler): def do_SafeProxy(self): try: handler = HttpProxyHandler(self) handler.do_HttpProxy() except Exception as e: # 若出现异常,向客户端发送 500 错误响应 self.send_error(500, f"Internal Server Error: {str(e)}") def do_GET(self): self.do_SafeProxy() def do_POST(self): self.do_SafeProxy() def do_ConnectProxy(self): # 此时我们并没有真正与对端建立连接,但是发送隧道已经建立的响应给对端 # 诱导对端发起真正的请求数据,我们收到完整的请求数据之后,解析请求内容 # 再根据实际的请求内容进行请求数据的重定向操作 self.send_response(200, "Connection Established") self.end_headers() self.wfile.flush() # 重要:强制发送响应头 handler = HttpsProxyHandler(self.connection, self.path) handler.do_HttpsProxy() # 为了简化逻辑,我们不对链路进行保持,牺牲效率,简化代码 def do_CONNECT(self): try: self.do_ConnectProxy() except Exception as e: try: self.send_error(502, f"Bad Gateway Error: {str(e)}") except: pass if "__main__" == __name__: # 检查私钥是否存在,如果不存在则创建公私钥对,为后面的MITM代理HTTPS使用 if not os.path.exists(PRIV_ROOT_KEY): generateRootCert(PUB_ROOT_KEY, PRIV_ROOT_KEY) print("没有检测到私钥,重新创建密钥对。") print( "ubuntu 24.04 系统,执行如下命令: `sudo cp %s /usr/local/share/ca-certificates/%s.crt`,然后执行 `sudo update-ca-certificates` 完成安装。" % (PUB_ROOT_KEY, PUB_ROOT_KEY) ) print( "macOS 15.4 系统,执行如下命令:`sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain %s`" % (PUB_ROOT_KEY) ) print( "针对 GCS 客户端发起 Python 请求无法通过校验自签的根证书问题,我们需要在当前用户目录下生成 .boto 文件 把自签名根证书路径配置上去,解决 gsutil.py 通过代理访问 Google Cloud 的问题" ) BOTO = """\ [Boto] ca_certificates_file = %(ca_cert_file)s """ content = ( BOTO % { "ca_cert_file": os.path.join(os.path.abspath("."), PUB_ROOT_KEY), } ).encode("UTF-8") import pathlib # 使用pathlib获取用户目录 home_dir = str(pathlib.Path.home()) boto = os.path.join(home_dir, ".boto") # boto 文件 with open(boto, "wb") as f: f.write(content) # 加载转发记录信息 ProxyRules() # 设置地址和端口 server_address = ("127.0.0.1", 8888) # 创建代理服务器套接字 server = ThreadingHTTPServer(server_address, ProxyHandler) print("\n代理服务器已启动,监听地址:%s:%d\n" % server_address) print("执行如下命令设置代理:\n") print(" export http_proxy=%s:%d" % server_address) print(" export https_proxy=%s:%d" % server_address) try: server.serve_forever() except KeyboardInterrupt: print("\nShutting down proxy server...") server.shutdown() |
1 2 3 |
# 测试连接 ubuntu 24.04 $ openssl s_client -connect www.mobibrw.com -servername www.mobibrw.com -proxy 127.0.0.1:8888 |
参考配置文件如下:
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 |
# 定义变量 [DEFAULT] MIR = https://www.mobibrw.com/gitea-mirrors ORI = https://chromium.googlesource.com # 逐个列出替换列表 # https://chromium.googlesource.com/aosp/platform/system/core/libsync.git -> https://www.mobibrw.com/gitea-mirrors/chromium/aosp.platform.system.core.libsync.git [MIR1] # 原始链接 RAW = ${DEFAULT:ORI}/aosp/platform/system/core/libsync.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/aosp.platform.system.core.libsync.git # https://chromium.googlesource.com/breakpad/breakpad.git -> https://www.mobibrw.com/gitea-mirrors/chromium/breakpad.git [MIR2] # 原始链接 RAW = ${DEFAULT:ORI}/breakpad/breakpad.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/breakpad.git # https://chromium.googlesource.com/chromium/src/buildtools -> https://www.mobibrw.com/gitea-mirrors/chromium/buildtools.git [MIR3] # 原始链接 RAW = ${DEFAULT:ORI}/breakpad/chromium/src/buildtools # 替换链接 REP = ${DEFAULT:MIR}/chromium/buildtools.git # https://chromium.googlesource.com/catapult.git > https://www.mobibrw.com/gitea-mirrors/chromium/catapult.git [MIR4] # 原始链接 RAW = ${DEFAULT:ORI}/catapult.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/catapult.git # https://chromium.googlesource.com/chromium/cdm.git -> https://www.mobibrw.com/gitea-mirrors/chromium/cdm.git [MIR5] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/cdm.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/cdm.git # https://chromium.googlesource.com/chromium/canvas_bench.git -> https://www.mobibrw.com/gitea-mirrors/chromium/canvas_bench.git [MIR6] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/canvas_bench.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/canvas_bench.git # https://chromium.googlesource.com/crossbench.git -> https://www.mobibrw.com/gitea-mirrors/chromium/crossbench.git [MIR7] # 原始链接 RAW = ${DEFAULT:ORI}/crossbench.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/crossbench.git # https://chromium.googlesource.com/external/colorama.git -> https://www.mobibrw.com/gitea-mirrors/chromium/colorama.git [MIR8] # 原始链接 RAW = ${DEFAULT:ORI}/external/colorama.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/colorama.git # https://chromium.googlesource.com/external/github.com/chromium/content_analysis_sdk.git -> https://www.mobibrw.com/gitea-mirrors/chromium/content_analysis_sdk.git [MIR9] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/chromium/content_analysis_sdk.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/content_analysis_sdk.git # https://chromium.googlesource.com/external/github.com/chromium/content_analysis_sdk.git -> https://www.mobibrw.com/gitea-mirrors/chromium/content_analysis_sdk.git [MIR10] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/chromium/content_analysis_sdk.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/content_analysis_sdk.git # https://chromium.googlesource.com/codecs/libgav1.git -> https://www.mobibrw.com/gitea-mirrors/chromium/codecs.libgav1.git [MIR11] # 原始链接 RAW = ${DEFAULT:ORI}/codecs/libgav1.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/codecs.libgav1.git # https://chromium.googlesource.com/cast_core/public -> https://www.mobibrw.com/gitea-mirrors/chromium/cast_core.public.git [MIR12] # 原始链接 RAW = ${DEFAULT:ORI}/cast_core/public # 替换链接 REP = ${DEFAULT:MIR}/chromium/cast_core.public.git # https://chromium.googlesource.com/chromium/tools/depot_tools.git -> https://www.mobibrw.com/gitea-mirrors/chromium/depot_tools.git [MIR13] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/tools/depot_tools.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/depot_tools.git # https://chromium.googlesource.com/devtools/devtools-frontend -> https://www.mobibrw.com/gitea-mirrors/chromium/devtools.devtools-frontend.git [MIR14] # 原始链接 RAW = ${DEFAULT:ORI}/devtools/devtools-frontend # 替换链接 REP = ${DEFAULT:MIR}/chromium/devtools.devtools-frontend.git # https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git -> https://www.mobibrw.com/gitea-mirrors/chromium/deps.libjpeg_turbo.git [MIR15] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/deps/libjpeg_turbo.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/deps.libjpeg_turbo.git # https://chromium.googlesource.com/chromium/deps/libsrtp.git -> https://www.mobibrw.com/gitea-mirrors/chromium/deps.libsrtp.git [MIR16] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/deps/libsrtp.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/deps.libsrtp.git # https://chromium.googlesource.com/chromium/deps/hunspell_dictionaries.git -> https://www.mobibrw.com/gitea-mirrors/chromium/deps.hunspell_dictionaries.git [MIR17] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/deps/hunspell_dictionaries.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/deps.hunspell_dictionaries.git # https://chromium.googlesource.com/chromium/deps/icu.git -> https://www.mobibrw.com/gitea-mirrors/chromium/deps.icu.git [MIR18] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/deps/icu.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/deps.icu.git # https://chromium.googlesource.com/chromium/deps/nasm.git -> https://www.mobibrw.com/gitea-mirrors/chromium/deps.nasm.git [MIR19] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/deps/nasm.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/deps.nasm.git # https://chromium.googlesource.com/chromium/deps/sqlite.git -> https://www.mobibrw.com/gitea-mirrors/chromium/deps.sqlite.git [MIR20] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/deps/sqlite.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/deps.sqlite.git # https://chromium.googlesource.com/chromium/deps/xdg-utils.git -> https://www.mobibrw.com/gitea-mirrors/chromium/deps.xdg-utils.git [MIR21] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/deps/xdg-utils.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/deps.xdg-utils.git # https://chromium.googlesource.com/chromium/dom-distiller/dist.git -> https://www.mobibrw.com/gitea-mirrors/chromium/dom-distiller.dist.git [MIR22] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/dom-distiller/dist.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/dom-distiller.dist.git # https://chromium.googlesource.com/chromium/frame_rate/content.git -> https://www.mobibrw.com/gitea-mirrors/chromium/frame_rate.content.git [MIR23] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/frame_rate/content.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/frame_rate.content.git # https://chromium.googlesource.com/chromium/third_party/ffmpeg.git -> https://www.mobibrw.com/gitea-mirrors/chromium/ffmpeg.git [MIR24] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/third_party/ffmpeg.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/ffmpeg.git # https://chromium.googlesource.com/external/fontconfig.git -> https://www.mobibrw.com/gitea-mirrors/chromium/fontconfig.git [MIR25] # 原始链接 RAW = ${DEFAULT:ORI}/external/fontconfig.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/fontconfig.git # https://chromium.googlesource.com/chromium/deps/flac.git -> https://www.mobibrw.com/gitea-mirrors/chromium/flac.git [MIR26] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/deps/flac.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/flac.git # https://chromium.googlesource.com/external/github.com/freetype/freetype2-testing.git -> https://www.mobibrw.com/gitea-mirrors/freetype/freetype2-testing.git [MIR27] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/freetype/freetype2-testing.git # 替换链接 REP = ${DEFAULT:MIR}/freetype/freetype2-testing.git # https://chromium.googlesource.com/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git -> https://www.mobibrw.com/gitea-mirrors/chromium/GPUOpen-LibrariesAndSDKs.VulkanMemoryAllocator.git [MIR28] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/GPUOpen-LibrariesAndSDKs.VulkanMemoryAllocator.git # https://chromium.googlesource.com/external/github.com/google/snappy.git -> https://www.mobibrw.com/gitea-mirrors/chromium/google.snappy.git [MIR29] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/snappy.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/google.snappy.git # https://chromium.googlesource.com/external/github.com/google/quic-trace.git -> https://www.mobibrw.com/gitea-mirrors/chromium/google.quic-trace.git [MIR30] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/quic-trace.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/google.quic-trace.git # https://chromium.googlesource.com/external/github.com/google/ruy.git -> https://www.mobibrw.com/gitea-mirrors/chromium/google.ruy.git [MIR31] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/ruy.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/google.ruy.git # https://chromium.googlesource.com/external/github.com/google/nearby-connections.git -> https://www.mobibrw.com/gitea-mirrors/chromium/google.nearby-connections.git [MIR32] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/nearby-connections.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/google.nearby-connections.git # https://chromium.googlesource.com/external/github.com/google/securemessage.git -> https://www.mobibrw.com/gitea-mirrors/chromium/google.securemessage.git [MIR33] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/securemessage.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/google.securemessage.git # https://chromium.googlesource.com/external/github.com/google/re2.git -> https://www.mobibrw.com/gitea-mirrors/chromium/google.re2.git [MIR34] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/re2.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/google.re2.git # https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/pywebsocket3.git -> https://www.mobibrw.com/gitea-mirrors/chromium/GoogleChromeLabs.pywebsocket3.git [MIR35] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/GoogleChromeLabs/pywebsocket3.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/GoogleChromeLabs.pywebsocket3.git # https://chromium.googlesource.com/external/github.com/khaledhosny/ots.git -> https://www.mobibrw.com/gitea-mirrors/chromium/khaledhosny.ots.git [MIR36] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/khaledhosny/ots.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/khaledhosny.ots.git # https://chromium.googlesource.com/external/leveldb.git -> https://www.mobibrw.com/gitea-mirrors/chromium/leveldb.git [MIR37] # 原始链接 RAW = ${DEFAULT:ORI}/external/leveldb.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/leveldb.git # https://chromium.googlesource.com/external/liblouis-github.git -> https://www.mobibrw.com/gitea-mirrors/chromium/liblouis-github.git [MIR38] # 原始链接 RAW = ${DEFAULT:ORI}/external/liblouis-github.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/liblouis-github.git # https://chromium.googlesource.com/chromium/third_party/instrumented_libraries.git -> https://www.mobibrw.com/gitea-mirrors/chromium/instrumented_libraries.git [MIR39] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/third_party/instrumented_libraries.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/instrumented_libraries.git # https://chromium.googlesource.com/external/libaddressinput.git -> https://www.mobibrw.com/gitea-mirrors/chromium/libaddressinput.git [MIR40] # 原始链接 RAW = ${DEFAULT:ORI}/external/libaddressinput.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/libaddressinput.git # https://chromium.googlesource.com/linux-syscall-support.git -> https://www.mobibrw.com/gitea-mirrors/chromium/linux-syscall-support.git [MIR41] # 原始链接 RAW = ${DEFAULT:ORI}/linux-syscall-support.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/linux-syscall-support.git # https://chromium.googlesource.com/external/github.com/material-foundation/material-color-utilities.git -> https://www.mobibrw.com/gitea-mirrors/chromium/material-foundation.material-color-utilities.git [MIR42] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/material-foundation/material-color-utilities.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/material-foundation.material-color-utilities.git # https://chromium.googlesource.com/external/search_engines_data.git -> https://www.mobibrw.com/gitea-mirrors/chromium/search_engines_data.git [MIR43] # 原始链接 RAW = ${DEFAULT:ORI}/external/search_engines_data.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/search_engines_data.git # https://chromium.googlesource.com/external/search_engines_data.git -> https://www.mobibrw.com/gitea-mirrors/chromium/search_engines_data.git [MIR44] # 原始链接 RAW = ${DEFAULT:ORI}/external/search_engines_data.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/search_engines_data.git # https://chromium.googlesource.com/external/github.com/SeleniumHQ/selenium/py.git -> https://www.mobibrw.com/gitea-mirrors/chromium/SeleniumHQ.selenium.py.git [MIR45] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/SeleniumHQ/selenium/py.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/SeleniumHQ.selenium.py.git # https://chromium.googlesource.com/external/smhasher.git -> https://www.mobibrw.com/gitea-mirrors/chromium/smhasher.git [MIR46] # 原始链接 RAW = ${DEFAULT:ORI}/external/smhasher.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/smhasher.git # https://chromium.googlesource.com/external/github.com/llvm/llvm-project/compiler-rt.git -> https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.compiler-rt.git [MIR47] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/llvm/llvm-project/compiler-rt.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/llvm.llvm-project.compiler-rt.git # https://chromium.googlesource.com/external/github.com/llvm/llvm-project/compiler-rt/lib/fuzzer.git -> https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.compiler-rt.lib.fuzzer.git [MIR48] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/llvm/llvm-project/compiler-rt/lib/fuzzer.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/llvm.llvm-project.compiler-rt.lib.fuzzer.git # https://chromium.googlesource.com/external/github.com/llvm/llvm-project/clang/tools/clang-format.git -> https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.clang.tools.clang-format.git [MIR49] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/llvm/llvm-project/clang/tools/clang-format.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/llvm.llvm-project.clang.tools.clang-format.git # https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libc.git -> https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.libc.git [MIR50] # 原始链接 RAW = ${DEFAULT:ORI}/external/external/github.com/llvm/llvm-project/libc.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/llvm.llvm-project.libc.git # https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxx.git -> https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.libcxx.git [MIR51] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/llvm/llvm-project/libcxx.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/llvm.llvm-project.libcxx.git # https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libcxxabi.git -> https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.libcxxabi.git [MIR52] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/llvm/llvm-project/libcxxabi.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/llvm.llvm-project.libcxxabi.git # https://chromium.googlesource.com/external/github.com/llvm/llvm-project/libunwind.git -> https://www.mobibrw.com/gitea-mirrors/chromium/llvm.llvm-project.libunwind.git [MIR53] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/llvm/llvm-project/libunwind.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/llvm.llvm-project.libunwind.git # https://chromium.googlesource.com/openscreen -> https://www.mobibrw.com/gitea-mirrors/chromium/openscreen.git [MIR54] # 原始链接 RAW = ${DEFAULT:ORI}/openscreen # 替换链接 REP = ${DEFAULT:MIR}/chromium/openscreen.git # https://chromium.googlesource.com/external/github.com/protocolbuffers/protobuf-javascript -> https://www.mobibrw.com/gitea-mirrors/chromium/protocolbuffers.protobuf-javascript.git [MIR55] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/protocolbuffers/protobuf-javascript # 替换链接 REP = ${DEFAULT:MIR}/chromium/protocolbuffers.protobuf-javascript.git # https://chromium.googlesource.com/vulkan-deps -> https://www.mobibrw.com/gitea-mirrors/chromium/vulkan-deps.git [MIR56] # 原始链接 RAW = ${DEFAULT:ORI}/external/vulkan-deps # 替换链接 REP = ${DEFAULT:MIR}/chromium/vulkan-deps.git # https://chromium.googlesource.com/chromium/wasm-tts-engine -> https://www.mobibrw.com/gitea-mirrors/chromium/wasm-tts-engine.git [MIR57] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/wasm-tts-engine # 替换链接 REP = ${DEFAULT:MIR}/chromium/wasm-tts-engine.git # https://chromium.googlesource.com/external/github.com/WebKit/JetStream.git -> https://www.mobibrw.com/gitea-mirrors/chromium/WebKit.JetStream.git [MIR58] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/WebKit/JetStream.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/WebKit.JetStream.git # https://chromium.googlesource.com/external/github.com/WebKit/Speedometer.git -> https://www.mobibrw.com/gitea-mirrors/chromium/WebKit.Speedometer.git [MIR59] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/WebKit/Speedometer.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/WebKit.Speedometer.git # https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/weston.git -> https://www.mobibrw.com/gitea-mirrors/chromium/wayland.weston.git [MIR60] # 原始链接 RAW = ${DEFAULT:ORI}/external/anongit.freedesktop.org/git/wayland/weston.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/wayland.weston.git # https://chromium.googlesource.com/webpagereplay.git -> https://www.mobibrw.com/gitea-mirrors/chromium/webpagereplay.git [MIR61] # 原始链接 RAW = ${DEFAULT:ORI}/webpagereplay.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/webpagereplay.git # https://chromium.googlesource.com/chromiumos/third_party/libdrm.git -> https://www.mobibrw.com/gitea-mirrors/chromiumos/libdrm.git [MIR62] # 原始链接 RAW = ${DEFAULT:ORI}/chromiumos/third_party/libdrm.git # 替换链接 REP = ${DEFAULT:MIR}/chromiumos/libdrm.git # https://chromium.googlesource.com/chromiumos/platform/libva-fake-driver.git -> https://www.mobibrw.com/gitea-mirrors/chromiumos/platform.libva-fake-driver.git [MIR63] # 原始链接 RAW = ${DEFAULT:ORI}/chromiumos/platform/libva-fake-driver.git # 替换链接 REP = ${DEFAULT:MIR}/chromiumos/platform.libva-fake-driver.git # https://chromium.googlesource.com/chromiumos/platform/minigbm.git -> https://www.mobibrw.com/gitea-mirrors/chromiumos/platform.minigbm.git [MIR64] # 原始链接 RAW = ${DEFAULT:ORI}/chromiumos/platform/minigbm.git # 替换链接 REP = ${DEFAULT:MIR}/chromiumos/platform.minigbm.git # https://chromium.googlesource.com/chromiumos/platform2/system_api.git -> https://www.mobibrw.com/gitea-mirrors/chromiumos/platform2.system_api.git [MIR65] # 原始链接 RAW = ${DEFAULT:ORI}/chromiumos/platform2/system_api.git # 替换链接 REP = ${DEFAULT:MIR}/chromiumos/platform2.system_api.git # https://chromium.googlesource.com/chromiumos/platform2/libipp.git -> https://www.mobibrw.com/gitea-mirrors/chromiumos/platform2.libipp.git [MIR66] # 原始链接 RAW = ${DEFAULT:ORI}/chromiumos/platform2/libipp.git # 替换链接 REP = ${DEFAULT:MIR}/chromiumos/platform2.libipp.git # https://chromium.googlesource.com/chromiumos/third_party/pyelftools.git -> https://www.mobibrw.com/gitea-mirrors/chromiumos/pyelftools.git [MIR67] # 原始链接 RAW = ${DEFAULT:ORI}/chromiumos/third_party/pyelftools.git # 替换链接 REP = ${DEFAULT:MIR}/chromiumos/pyelftools.git # https://chromium.googlesource.com/external/github.com/google/Accessibility-Test-Framework-for-Android.git -> https://www.mobibrw.com/gitea-mirrors/google/Accessibility-Test-Framework-for-Android.git [MIR68] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/Accessibility-Test-Framework-for-Android.git # 替换链接 REP = ${DEFAULT:MIR}/google/Accessibility-Test-Framework-for-Android.git # https://chromium.googlesource.com/external/github.com/google/anonymous-tokens.git -> https://www.mobibrw.com/gitea-mirrors/google/anonymous-tokens.git [MIR69] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/anonymous-tokens.git # 替换链接 REP = ${DEFAULT:MIR}/google/anonymous-tokens.git # https://chromium.googlesource.com/external/github.com/google/benchmark.git -> https://www.mobibrw.com/gitea-mirrors/google/benchmark.git [MIR70] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/benchmark.git # 替换链接 REP = ${DEFAULT:MIR}/google/benchmark.git # https://beto-core.googlesource.com/beto-core.git -> https://www.mobibrw.com/gitea-mirrors/google/beto-core.git [MIR71] # 原始链接 RAW = https://beto-core.googlesource.com/beto-core.git # 替换链接 REP = ${DEFAULT:MIR}/google/beto-core.git # https://boringssl.googlesource.com/boringssl.git -> https://www.mobibrw.com/gitea-mirrors/google/boringssl.git [MIR72] # 原始链接 RAW = https://boringssl.googlesource.com/boringssl.git # 替换链接 REP = ${DEFAULT:MIR}/google/boringssl.git # https://chromium.googlesource.com/external/github.com/google/compact_enc_det.git -> https://www.mobibrw.com/gitea-mirrors/google/compact_enc_det.git [MIR73] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/compact_enc_det.git # 替换链接 REP = ${DEFAULT:MIR}/google/compact_enc_det.git # https://chromium.googlesource.com/external/github.com/google/crc32c.git -> https://www.mobibrw.com/gitea-mirrors/google/crc32c.git [MIR74] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/crc32c.git # 替换链接 REP = ${DEFAULT:MIR}/google/crc32c.git # https://chromium.googlesource.com/external/github.com/google/cpu_features.git -> https://www.mobibrw.com/gitea-mirrors/google/cpu_features.git [MIR75] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/cpu_features.git # 替换链接 REP = ${DEFAULT:MIR}/google/cpu_features.git # https://chromium.googlesource.com/external/github.com/google/cld_3.git -> https://www.mobibrw.com/gitea-mirrors/google/cld_3.git [MIR76] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/cld_3.git # 替换链接 REP = ${DEFAULT:MIR}/google/cld_3.git # https://dawn.googlesource.com/dawn.git -> https://www.mobibrw.com/gitea-mirrors/google/dawn.git [MIR77] # 原始链接 RAW = https://dawn.googlesource.com/dawn.git # 替换链接 REP = ${DEFAULT:MIR}/google/dawn.git # https://chromium.googlesource.com/external/github.com/google/emoji-segmenter.git -> https://www.mobibrw.com/gitea-mirrors/google/emoji-segmenter.git [MIR78] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/emoji-segmenter.git # 替换链接 REP = ${DEFAULT:MIR}/google/emoji-segmenter.git # https://chromium.googlesource.com/external/github.com/google/farmhash.git -> https://www.mobibrw.com/gitea-mirrors/google/farmhash.git [MIR79] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/farmhash.git # 替换链接 REP = ${DEFAULT:MIR}/google/farmhash.git # https://chromium.googlesource.com/external/github.com/google/flatbuffers.git -> https://www.mobibrw.com/gitea-mirrors/google/flatbuffers.git [MIR80] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/flatbuffers.git # 替换链接 REP = ${DEFAULT:MIR}/google/flatbuffers.git # https://chromium.googlesource.com/external/github.com/google/fuzztest.git -> https://www.mobibrw.com/gitea-mirrors/google/fuzztest.git [MIR81] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/fuzztest.git # 替换链接 REP = ${DEFAULT:MIR}/google/fuzztest.git # https://chromium.googlesource.com/external/github.com/google/gemmlowp.git -> https://www.mobibrw.com/gitea-mirrors/google/gemmlowp.git [MIR82] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/gemmlowp.git # 替换链接 REP = ${DEFAULT:MIR}/google/gemmlowp.git # https://chromium.googlesource.com/external/github.com/google/googletest.git -> https://www.mobibrw.com/gitea-mirrors/google/googletest.git [MIR83] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/googletest.git # 替换链接 REP = ${DEFAULT:MIR}/google/googletest.git # https://chromium.googlesource.com/external/github.com/google/highway.git -> https://www.mobibrw.com/gitea-mirrors/google/highway.git [MIR84] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/highway.git # 替换链接 REP = ${DEFAULT:MIR}/google/highway.git # https://chromium.googlesource.com/external/github.com/google/ink.git -> https://www.mobibrw.com/gitea-mirrors/google/ink.git [MIR85] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/ink.git # 替换链接 REP = ${DEFAULT:MIR}/google/ink.git # https://chromium.googlesource.com/external/github.com/google/ink-stroke-modeler.git -> https://www.mobibrw.com/gitea-mirrors/google/ink-stroke-modeler.git [MIR86] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/ink-stroke-modeler.git # 替换链接 REP = ${DEFAULT:MIR}/google/ink-stroke-modeler.git # https://chromium.googlesource.com/external/libphonenumber.git -> https://www.mobibrw.com/gitea-mirrors/google/libphonenumber.git [MIR87] # 原始链接 RAW = ${DEFAULT:ORI}/external/libphonenumber.git # 替换链接 REP = ${DEFAULT:MIR}/google/libphonenumber.git # https://chromium.googlesource.com/external/github.com/google/libprotobuf-mutator.git -> https://www.mobibrw.com/gitea-mirrors/google/libprotobuf-mutator.git [MIR88] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/libprotobuf-mutator.git # 替换链接 REP = ${DEFAULT:MIR}/google/libprotobuf-mutator.git # https://pdfium.googlesource.com/pdfium.git -> https://www.mobibrw.com/gitea-mirrors/google/pdfium.git [MIR89] # 原始链接 RAW = https://pdfium.googlesource.com/pdfium.git # 替换链接 REP = ${DEFAULT:MIR}/google/pdfium.git # https://chromium.googlesource.com/external/github.com/google/pthreadpool.git -> https://www.mobibrw.com/gitea-mirrors/google/pthreadpool.git [MIR90] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/pthreadpool.git # 替换链接 REP = ${DEFAULT:MIR}/google/pthreadpool.git # https://quiche.googlesource.com/quiche.git -> https://www.mobibrw.com/gitea-mirrors/google/quiche.git [MIR91] # 原始链接 RAW = https://quiche.googlesource.com/quiche.git # 替换链接 REP = ${DEFAULT:MIR}/google/quiche.git # https://chromium.googlesource.com/external/github.com/google/ukey2.git -> https://www.mobibrw.com/gitea-mirrors/google/ukey2.git [MIR92] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/ukey2.git # 替换链接 REP = ${DEFAULT:MIR}/google/ukey2.git # https://chromium.googlesource.com/website.git -> https://www.mobibrw.com/gitea-mirrors/google/website.git [MIR93] # 原始链接 RAW = ${DEFAULT:ORI}/website.git # 替换链接 REP = ${DEFAULT:MIR}/google/website.git # https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git -> https://www.mobibrw.com/gitea-mirrors/google/wuffs-mirror-release-c.git [MIR94] # 原始链接 RAW = https://skia.googlesource.com/external/github.com/google/wuffs-mirror-release-c.git # 替换链接 REP = ${DEFAULT:MIR}/google/wuffs-mirror-release-c.git # https://chromium.googlesource.com/external/github.com/google/XNNPACK.git -> https://www.mobibrw.com/gitea-mirrors/google/XNNPACK.git [MIR95] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/google/XNNPACK.git # 替换链接 REP = ${DEFAULT:MIR}/google/XNNPACK.git # https://chromium.googlesource.com/external/google3/cros_components.git -> https://www.mobibrw.com/gitea-mirrors/google3/cros_components.git [MIR96] # 原始链接 RAW = ${DEFAULT:ORI}/external/google3/cros_components.git # 替换链接 REP = ${DEFAULT:MIR}/google3/cros_components.git # https://chromium.googlesource.com/external/github.com/googleprojectzero/domato.git -> https://www.mobibrw.com/gitea-mirrors/googleprojectzero/domato.git [MIR97] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/googleprojectzero/domato.git # 替换链接 REP = ${DEFAULT:MIR}/googleprojectzero/domato.git # https://chromium.googlesource.com/external/gitlab.com/libeigen/eigen.git -> https://www.mobibrw.com/gitea-mirrors/libeigen/eigen.git [MIR98] # 原始链接 RAW = ${DEFAULT:ORI}/external/gitlab.com/libeigen/eigen.git # 替换链接 REP = ${DEFAULT:MIR}/libeigen/eigen.git # https://chromium.googlesource.com/external/github.com/videolan/dav1d.git -> https://www.mobibrw.com/gitea-mirrors/videolan/dav1d.git [MIR99] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/videolan/dav1d.git # 替换链接 REP = ${DEFAULT:MIR}/videolan/dav1d.git # https://chromium.googlesource.com/external/github.com/libexpat/libexpat.git -> https://www.mobibrw.com/gitea-mirrors/libexpat/libexpat.git [MIR100] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/libexpat/libexpat.git # 替换链接 REP = ${DEFAULT:MIR}/libexpat/libexpat.git # https://chromium.googlesource.com/external/github.com/Maratyszcza/FP16.git -> https://www.mobibrw.com/gitea-mirrors/Maratyszcza/FP16.git [MIR101] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/Maratyszcza/FP16.git # 替换链接 REP = ${DEFAULT:MIR}/Maratyszcza/FP16.git # https://chromium.googlesource.com/external/github.com/Maratyszcza/FXdiv.git -> https://www.mobibrw.com/gitea-mirrors/Maratyszcza/FXdiv.git [MIR102] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/Maratyszcza/FXdiv.git # 替换链接 REP = ${DEFAULT:MIR}/Maratyszcza/FXdiv.git # https://chromium.googlesource.com/external/github.com/fastfloat/fast_float.git -> https://www.mobibrw.com/gitea-mirrors/fastfloat/fast_float.git [MIR103] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/fastfloat/fast_float.git # 替换链接 REP = ${DEFAULT:MIR}/fastfloat/fast_float.git # https://chromium.googlesource.com/chromium/src/third_party/freetype2.git -> https://www.mobibrw.com/gitea-mirrors/chromium/freetype2.git [MIR104] # 原始链接 RAW = ${DEFAULT:ORI}/chromium/src/third_party/freetype2.git # 替换链接 REP = ${DEFAULT:MIR}/chromium/freetype2.git # https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git -> https://www.mobibrw.com/gitea-mirrors/harfbuzz/harfbuzz.git [MIR105] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/harfbuzz/harfbuzz.git # 替换链接 REP = ${DEFAULT:MIR}/harfbuzz/harfbuzz.git # https://chromium.googlesource.com/v8/v8.git -> https://www.mobibrw.com/gitea-mirrors/v8/v8.git [MIR106] # 原始链接 RAW = ${DEFAULT:ORI}/v8/v8.git # 替换链接 REP = ${DEFAULT:MIR}/v8/v8.git # https://chromium.googlesource.com/v8/fuzzer_wasm_corpus.git -> https://www.mobibrw.com/gitea-mirrors/v8/fuzzer_wasm_corpus.git [MIR107] # 原始链接 RAW = ${DEFAULT:ORI}/v8/fuzzer_wasm_corpus.git # 替换链接 REP = ${DEFAULT:MIR}/v8/fuzzer_wasm_corpus.git # https://chromium.googlesource.com/angle/angle.git -> https://www.mobibrw.com/gitea-mirrors/angle/angle.git [MIR108] # 原始链接 RAW = ${DEFAULT:ORI}/angle/angle.git # 替换链接 REP = ${DEFAULT:MIR}/angle/angle.git # https://aomedia.googlesource.com/aom.git -> https://www.mobibrw.com/gitea-mirrors/aomedia/aom.git [MIR109] # 原始链接 RAW = https://aomedia.googlesource.com/aom.git # 替换链接 REP = ${DEFAULT:MIR}/aomedia/aom.git # https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git -> https://www.mobibrw.com/gitea-mirrors/open-source-parsers/jsoncpp.git [MIR110] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/open-source-parsers/jsoncpp.git # 替换链接 REP = ${DEFAULT:MIR}/open-source-parsers/jsoncpp.git # https://chromium.googlesource.com/webm/libvpx.git -> https://www.mobibrw.com/gitea-mirrors/webm/libvpx.git [MIR111] # 原始链接 RAW = ${DEFAULT:ORI}/webm/libvpx.git # 替换链接 REP = ${DEFAULT:MIR}/webm/libvpx.git # https://chromium.googlesource.com/webm/libwebm.git -> https://www.mobibrw.com/gitea-mirrors/webm/libwebm.git [MIR112] # 原始链接 RAW = ${DEFAULT:ORI}/webm/libwebm.git # 替换链接 REP = ${DEFAULT:MIR}/webm/libwebm.git # https://chromium.googlesource.com/webm/libwebp.git -> https://www.mobibrw.com/gitea-mirrors/webm/libwebp.git [MIR113] # 原始链接 RAW = ${DEFAULT:ORI}/webm/libwebp.git # 替换链接 REP = ${DEFAULT:MIR}/webm/libwebp.git # https://chromium.googlesource.com/external/github.com/intel/ARM_NEON_2_x86_SSE.git -> https://www.mobibrw.com/gitea-mirrors/intel/ARM_NEON_2_x86_SSE.git [MIR114] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/intel/ARM_NEON_2_x86_SSE.git # 替换链接 REP = ${DEFAULT:MIR}/intel/ARM_NEON_2_x86_SSE.git # https://chromium.googlesource.com/external/github.com/intel/tinycbor.git -> https://www.mobibrw.com/gitea-mirrors/intel/tinycbor.git [MIR115] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/intel/tinycbor.git # 替换链接 REP = ${DEFAULT:MIR}/intel/tinycbor.git # https://chromium.googlesource.com/libyuv/libyuv.git -> https://www.mobibrw.com/gitea-mirrors/libyuv/libyuv.git [MIR116] # 原始链接 RAW = ${DEFAULT:ORI}/libyuv/libyuv.git # 替换链接 REP = ${DEFAULT:MIR}/libyuv/libyuv.git # https://android.googlesource.com/platform/external/perfetto.git -> https://www.mobibrw.com/gitea-mirrors/android/platform.external.perfetto.git [MIR117] # 原始链接 RAW = https://android.googlesource.com/platform/external/perfetto.git # 替换链接 REP = ${DEFAULT:MIR}/android/platform.external.perfetto.git # https://chromium.googlesource.com/external/github.com/cisco/openh264 -> https://www.mobibrw.com/gitea-mirrors/cisco/openh264.git [MIR118] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/cisco/openh264 # 替换链接 REP = ${DEFAULT:MIR}/cisco/openh264.git # https://skia.googlesource.com/skia.git -> https://www.mobibrw.com/gitea-mirrors/skia/skia.git [MIR119] # 原始链接 RAW = https://skia.googlesource.com/skia.git # 替换链接 REP = ${DEFAULT:MIR}/skia/skia.git # https://chromium.googlesource.com/external/github.com/tensorflow/tensorflow.git -> https://www.mobibrw.com/gitea-mirrors/tensorflow/tensorflow.git [MIR120] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/tensorflow/tensorflow.git # 替换链接 REP = ${DEFAULT:MIR}/tensorflow/tensorflow.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/glslang -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/glslang.git [MIR121] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/glslang # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/glslang.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/EGL-Registry -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/EGL-Registry.git [MIR122] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/EGL-Registry # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/EGL-Registry.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/OpenGL-Registry -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/OpenGL-Registry.git [MIR123] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/OpenGL-Registry # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/OpenGL-Registry.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Cross -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/SPIRV-Cross.git [MIR124] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/SPIRV-Cross # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/SPIRV-Cross.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Headers -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/SPIRV-Headers.git [MIR125] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/SPIRV-Headers # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/SPIRV-Headers.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/SPIRV-Tools -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/SPIRV-Tools.git [MIR126] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/SPIRV-Tools # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/SPIRV-Tools.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Headers -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-Headers.git [MIR127] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/Vulkan-Headers # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/Vulkan-Headers.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-ValidationLayers -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-ValidationLayers.git [MIR128] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/Vulkan-ValidationLayers # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/Vulkan-ValidationLayers.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Loader -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-Loader.git [MIR129] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/Vulkan-Loader # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/Vulkan-Loader.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Utility-Libraries -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-Utility-Libraries.git [MIR130] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/Vulkan-Utility-Libraries.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/Vulkan-Tools -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/Vulkan-Tools.git [MIR131] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/Vulkan-Tools # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/Vulkan-Tools.git # https://chromium.googlesource.com/external/github.com/KhronosGroup/VK-GL-CTS -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/VK-GL-CTS.git [MIR132] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KhronosGroup/VK-GL-CTS # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/VK-GL-CTS.git # https://chromium.googlesource.com/external/khronosgroup/webgl.git -> https://www.mobibrw.com/gitea-mirrors/KhronosGroup/WebGL.git [MIR133] # 原始链接 RAW = ${DEFAULT:ORI}/external/khronosgroup/webgl.git # 替换链接 REP = ${DEFAULT:MIR}/KhronosGroup/WebGL.git # https://swiftshader.googlesource.com/SwiftShader.git -> https://www.mobibrw.com/gitea-mirrors/swiftshader/SwiftShader.git [MIR134] # 原始链接 RAW = https://swiftshader.googlesource.com/SwiftShader.git # 替换链接 REP = ${DEFAULT:MIR}/swiftshader/SwiftShader.git # https://chromium.googlesource.com/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git -> https://www.mobibrw.com/gitea-mirrors/GoogleChromeLabs/text-fragments-polyfill.git [MIR135] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git # 替换链接 REP = ${DEFAULT:MIR}/GoogleChromeLabs/text-fragments-polyfill.git # https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland.git -> https://www.mobibrw.com/gitea-mirrors/wayland/wayland.git [MIR136] # 原始链接 RAW = ${DEFAULT:ORI}/external/anongit.freedesktop.org/git/wayland/wayland.git # 替换链接 REP = ${DEFAULT:MIR}/wayland/wayland.git # https://chromium.googlesource.com/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git -> https://www.mobibrw.com/gitea-mirrors/wayland/wayland-protocols.git [MIR137] # 原始链接 RAW = ${DEFAULT:ORI}/external/anongit.freedesktop.org/git/wayland/wayland-protocols.git # 替换链接 REP = ${DEFAULT:MIR}/wayland/wayland-protocols.git # https://chromium.googlesource.com/external/github.com/gpuweb/cts -> https://www.mobibrw.com/gitea-mirrors/gpuweb/cts [MIR138] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/gpuweb/cts # 替换链接 REP = ${DEFAULT:MIR}/gpuweb/cts # https://chromium.googlesource.com/external/github.com/GNOME/gtk.git -> https://www.mobibrw.com/gitea-mirrors/GNOME/gtk.git [MIR139] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/GNOME/gtk.git # 替换链接 REP = ${DEFAULT:MIR}/GNOME/gtk.git # https://chromium.googlesource.com/external/github.com/KDE/plasma-wayland-protocols.git -> https://www.mobibrw.com/gitea-mirrors/KDE/plasma-wayland-protocols.git [MIR140] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/KDE/plasma-wayland-protocols.git # 替换链接 REP = ${DEFAULT:MIR}/KDE/plasma-wayland-protocols.git # https://webrtc.googlesource.com/src.git -> https://www.mobibrw.com/gitea-mirrors/webrtc/src.git [MIR141] # 原始链接 RAW = https://webrtc.googlesource.com/src.git # 替换链接 REP = ${DEFAULT:MIR}/webrtc/src.git # https://chromium.googlesource.com/external/github.com/facebook/zstd.git -> https://www.mobibrw.com/gitea-mirrors/facebook/zstd.git [MIR142] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/facebook/zstd.git # 替换链接 REP = ${DEFAULT:MIR}/facebook/zstd.git # https://chromium.googlesource.com/external/github.com/glmark2/glmark2 -> https://www.mobibrw.com/gitea-mirrors/glmark2/glmark2.git [MIR143] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/glmark2/glmark2 # 替换链接 REP = ${DEFAULT:MIR}/glmark2/glmark2.git # https://chromium.googlesource.com/external/github.com/Tencent/rapidjson -> https://www.mobibrw.com/gitea-mirrors/Tencent/rapidjson.git [MIR144] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/Tencent/rapidjson # 替换链接 REP = ${DEFAULT:MIR}/Tencent/rapidjson.git # https://chromium.googlesource.com/external/github.com/microsoft/DirectX-Headers -> https://www.mobibrw.com/gitea-mirrors/microsoft/DirectX-Headers.git [MIR145] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/microsoft/DirectX-Headers # 替换链接 REP = ${DEFAULT:MIR}/microsoft/DirectX-Headers.git # https://chromium.googlesource.com/external/github.com/microsoft/DirectXShaderCompiler -> https://www.mobibrw.com/gitea-mirrors/microsoft/DirectXShaderCompiler.git [MIR146] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/microsoft/DirectXShaderCompiler # 替换链接 REP = ${DEFAULT:MIR}/microsoft/DirectXShaderCompiler.git # https://chromium.googlesource.com/external/github.com/glfw/glfw -> https://www.mobibrw.com/gitea-mirrors/glfw/glfw.git [MIR147] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/glfw/glfw # 替换链接 REP = ${DEFAULT:MIR}/glfw/glfw.git # https://chromium.googlesource.com/external/github.com/toji/webvr.info.git -> https://www.mobibrw.com/gitea-mirrors/toji/webvr.info.git [MIR148] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/toji/webvr.info.git # 替换链接 REP = ${DEFAULT:MIR}/toji/webvr.info.git # https://chromium.googlesource.com/external/github.com/pytorch/cpuinfo.git -> https://www.mobibrw.com/gitea-mirrors/pytorch/cpuinfo.git [MIR149] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/pytorch/cpuinfo.git # 替换链接 REP = ${DEFAULT:MIR}/pytorch/cpuinfo.git # https://chromium.googlesource.com/external/github.com/webmproject/CrabbyAvif.git -> https://www.mobibrw.com/gitea-mirrors/webmproject/CrabbyAvif.git [MIR150] # 原始链接 RAW = ${DEFAULT:ORI}/external/github.com/webmproject/CrabbyAvif.git # 替换链接 REP = ${DEFAULT:MIR}/webmproject/CrabbyAvif.git # https://chrome-infra-packages.appspot.com/client?platform=linux-amd64&version=git_revision:b1f414539ac10cc67a0250890a38712cc06cf102 -> https://www.mobibrw.com/gitea-mirrors/chromium/depsBins/raw/commit/795936b40d919063ed4f4ff9fb2f1dc1d01f922b/cipd/linux-amd64/git_revision:b1f414539ac10cc67a0250890a38712cc06cf102 [MIR151] # 原始链接 RAW = https://chrome-infra-packages.appspot.com/client?platform=linux-amd64&version=git_revision:b1f414539ac10cc67a0250890a38712cc06cf102 # 替换链接 REP = ${DEFAULT:MIR}/chromium/depsBins/raw/commit/795936b40d919063ed4f4ff9fb2f1dc1d01f922b/cipd/linux-amd64/git_revision:b1f414539ac10cc67a0250890a38712cc06cf102 # https://chrome-infra-packages.appspot.com/prpc/cipd.Repository/ResolveVersion/infra/tools/cipd/linux-amd64/git_revision:b1f414539ac10cc67a0250890a38712cc06cf102 -> https://www.mobibrw.com/gitea-mirrors/chromium/depsBins/raw/commit/795936b40d919063ed4f4ff9fb2f1dc1d01f922b/cipd/linux-amd64/git_revision:b1f414539ac10cc67a0250890a38712cc06cf102 [MIR152] # 原始链接 RAW = https://chrome-infra-packages.appspot.com/prpc/cipd.Repository/ResolveVersion/infra/tools/cipd/linux-amd64/git_revision:b1f414539ac10cc67a0250890a38712cc06cf102 # 替换链接 REP = ${DEFAULT:MIR}/chromium/depsBins/raw/commit/795936b40d919063ed4f4ff9fb2f1dc1d01f922b/cipd/linux-amd64/git_revision:b1f414539ac10cc67a0250890a38712cc06cf102 |
3. 执行编译
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 |
# 设置代理 $ export http_proxy=http://127.0.0.1:8888 $ export https_proxy=http://127.0.0.1:8888 # 创建源代码目录 $ mkdir cef_build $ cd cef_build # 镜像服务器地址 $ export MIR=https://www.mobibrw.com/gitea-mirrors # 内网服务器地址 # export MIR=http://10.10.10.189:10880 # 拉取构建脚本 $ git clone $MIR/chromiumembedded/cef.git build_script $ git clone $MIR/chromium/depot_tools.git # 禁止开发工具更新,其中的CIPD是用来下载大型二进制文件的工具 $ export DEPT_TOOLS_UPDATE=0 $ cd depot_tools # 下载 cipd,解决无法访问 chrome-infra-packages.appspot.com 的问题 # wget "https://chrome-infra-packages.appspot.com/client?platform=linux-amd64&version=git_revision:b1f414539ac10cc67a0250890a38712cc06cf102" -O .cipd_client $ wget "https://www.mobibrw.com/wp-content/uploads/2025/04/cipd_client-linux-amd64-git_revision-b1f414539ac10cc67a0250890a38712cc06cf102.zip" -O cipd_client.zip $ unzip cipd_client.zip $ cd .. $ export ORI=https://chromium.googlesource.com # --chromium-url 指定镜像地址 以 Chrome 135 版本 分支 7049 为例 $ python3 build_script/tools/automate/automate-git.py --url=$MIR/chromiumembedded/cef.git --branch=7049 --chromium-url=$MIR/chromium/src.git --download-dir=src --depot-tools-dir=./depot_tools --no-depot-tools-update # 接下来,等待 4 次连接失败就可以了 # curl: (28) Failed to connect to chrome-infra-packages.appspot.com port 443 after 133244 ms: Couldn't connect to server # curl: (28) Failed to connect to chrome-infra-packages.appspot.com port 443 after 133612 ms: Couldn't connect to server # curl: (28) Failed to connect to chrome-infra-packages.appspot.com port 443 after 136700 ms: Couldn't connect to server # curl: (28) Failed to connect to chrome-infra-packages.appspot.com port 443 after 133857 ms: Couldn't connect to server # Syncing projects: 0% ( 1/204) src |
参考链接
- CEF中文教程(google chrome浏览器控件) -- CEF编译
- Chromium Embedded Framework
- Chromium Embedded Framework (CEF)
- 适用于 Google 产品的 Chromium Embedded Framework 构建说明
- Chromium内核浏览器编译记(四)Linux版本CEF编译
- depot_tools原理和实现
- 构建V8
- Chromium Embedded Framework (CEF) Automated Builds
- WebRTC编译国内加速镜像
- 使用代理同步谷歌项目时出现文件下载失败
- Adding hooks to gclient deps
- webrtc代码管理工具gclient入门
- Using depot_tools
- 50行Python代码实现代理服务器的详细教程
- 使用python实现HTTP请求报文是否结束的判断
- python提供的多线程httpserver
- 在 Linux 下使用 mitmproxy 抓取 HTTPS 流量
- Monitoring HTTPS Traffic of a Single App on OSX
- Ubuntu(linux)添加系统证书信任
- 一行代码解决python requests证书问题
- Python certifi:如何在Python中使用SSL证书
- gsutil安装工具安装以及使用http代理下载
- 在Windows上将自定义CA根证书添加到GCloud实用程序(或通常是Pyth
- ssl 在Windows上向GCloud实用程序(或Python)添加自定义CA根证书