Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
彭彦祖
code-server
提交
011530e1
C
code-server
项目概览
彭彦祖
/
code-server
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
code-server
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
011530e1
编写于
7月 30, 2019
作者:
A
Asher
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Proxy TLS sockets
上级
8ded89e8
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
87 addition
and
6 deletion
+87
-6
src/connection.ts
src/connection.ts
+3
-3
src/server.ts
src/server.ts
+84
-3
未找到文件。
src/connection.ts
浏览文件 @
011530e1
import
*
as
cp
from
"
child_process
"
;
import
*
as
tls
from
"
tls
"
;
import
{
getPathFromAmdModule
}
from
"
vs/base/common/amd
"
;
import
{
VSBuffer
}
from
"
vs/base/common/buffer
"
;
...
...
@@ -62,8 +61,9 @@ export class ExtensionHostConnection extends Connection {
public
constructor
(
protocol
:
Protocol
,
buffer
:
VSBuffer
,
private
readonly
log
:
ILogService
)
{
super
(
protocol
);
protocol
.
dispose
();
this
.
protocol
.
dispose
();
this
.
process
=
this
.
spawn
(
buffer
);
this
.
protocol
.
getUnderlyingSocket
().
pause
();
}
protected
dispose
():
void
{
...
...
@@ -89,7 +89,7 @@ export class ExtensionHostConnection extends Connection {
type
:
"
VSCODE_EXTHOST_IPC_SOCKET
"
,
initialDataChunk
:
(
buffer
.
buffer
as
Buffer
).
toString
(
"
base64
"
),
skipWebSocketFrames
:
this
.
protocol
.
getSocket
()
instanceof
NodeSocket
,
},
socket
instanceof
tls
.
TLSSocket
?
(
<
any
>
socket
).
_parent
:
socket
);
},
socket
);
}
private
spawn
(
buffer
:
VSBuffer
):
cp
.
ChildProcess
{
...
...
src/server.ts
浏览文件 @
011530e1
...
...
@@ -12,9 +12,10 @@ import * as querystring from "querystring";
import
{
Emitter
}
from
"
vs/base/common/event
"
;
import
{
sanitizeFilePath
}
from
"
vs/base/common/extpath
"
;
import
{
UriComponents
,
URI
}
from
"
vs/base/common/uri
"
;
import
{
generateUuid
}
from
"
vs/base/common/uuid
"
;
import
{
getMachineId
}
from
'
vs/base/node/id
'
;
import
{
IPCServer
,
ClientConnectionEvent
,
StaticRouter
}
from
"
vs/base/parts/ipc/common/ipc
"
;
import
{
mkdirp
}
from
"
vs/base/node/pfs
"
;
import
{
mkdirp
,
rimraf
}
from
"
vs/base/node/pfs
"
;
import
{
LogsDataCleaner
}
from
"
vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner
"
;
import
{
IConfigurationService
}
from
"
vs/platform/configuration/common/configuration
"
;
import
{
ConfigurationService
}
from
"
vs/platform/configuration/node/configurationService
"
;
...
...
@@ -56,7 +57,7 @@ import { Connection, ManagementConnection, ExtensionHostConnection } from "vs/se
import
{
ExtensionEnvironmentChannel
,
FileProviderChannel
,
}
from
"
vs/server/src/channel
"
;
import
{
TelemetryClient
}
from
"
vs/server/src/insights
"
;
import
{
Protocol
}
from
"
vs/server/src/protocol
"
;
import
{
AuthType
,
getMediaMime
,
getUriTransformer
}
from
"
vs/server/src/util
"
;
import
{
AuthType
,
getMediaMime
,
getUriTransformer
,
tmpdir
}
from
"
vs/server/src/util
"
;
export
enum
HttpCode
{
Ok
=
200
,
...
...
@@ -391,6 +392,11 @@ export class MainServer extends Server {
private
readonly
services
=
new
ServiceCollection
();
private
readonly
servicesPromise
:
Promise
<
void
>
;
public
readonly
_onProxyConnect
=
new
Emitter
<
net
.
Socket
>
();
private
proxyPipe
=
path
.
join
(
tmpdir
,
"
tls-proxy
"
);
private
_proxyServer
?:
Promise
<
net
.
Server
>
;
private
readonly
proxyTimeout
=
5000
;
public
constructor
(
options
:
ServerOptions
,
args
:
ParsedArgs
)
{
super
(
options
);
this
.
servicesPromise
=
this
.
initializeServices
(
args
);
...
...
@@ -407,7 +413,7 @@ export class MainServer extends Server {
}
protected
async
handleWebSocket
(
socket
:
net
.
Socket
,
parsedUrl
:
url
.
UrlWithParsedQuery
):
Promise
<
void
>
{
const
protocol
=
new
Protocol
(
socket
,
{
const
protocol
=
new
Protocol
(
await
this
.
createProxy
(
socket
)
,
{
reconnectionToken
:
<
string
>
parsedUrl
.
query
.
reconnectionToken
||
""
,
reconnection
:
parsedUrl
.
query
.
reconnection
===
"
true
"
,
skipWebSocketFrames
:
parsedUrl
.
query
.
skipWebSocketFrames
===
"
true
"
,
...
...
@@ -592,4 +598,79 @@ export class MainServer extends Server {
private
async
getDebugPort
():
Promise
<
number
|
undefined
>
{
return
undefined
;
}
/**
* Since we can't pass TLS sockets to children, use this to proxy the socket
* and pass a non-TLS socket.
*/
private
createProxy
=
async
(
socket
:
net
.
Socket
):
Promise
<
net
.
Socket
>
=>
{
if
(
!
(
socket
instanceof
tls
.
TLSSocket
))
{
return
socket
;
}
await
this
.
startProxyServer
();
return
new
Promise
((
resolve
,
reject
)
=>
{
const
timeout
=
setTimeout
(()
=>
{
listener
.
dispose
();
socket
.
destroy
();
proxy
.
destroy
();
reject
(
new
Error
(
"
TLS socket proxy timed out
"
));
},
this
.
proxyTimeout
);
const
listener
=
this
.
_onProxyConnect
.
event
((
connection
)
=>
{
connection
.
once
(
"
data
"
,
(
data
)
=>
{
if
(
!
socket
.
destroyed
&&
!
proxy
.
destroyed
&&
data
.
toString
()
===
id
)
{
clearTimeout
(
timeout
);
listener
.
dispose
();
[[
proxy
,
socket
],
[
socket
,
proxy
]].
forEach
(([
a
,
b
])
=>
{
a
.
pipe
(
b
);
a
.
on
(
"
error
"
,
()
=>
b
.
destroy
());
a
.
on
(
"
close
"
,
()
=>
b
.
destroy
());
a
.
on
(
"
end
"
,
()
=>
b
.
end
());
});
resolve
(
connection
);
}
});
});
const
id
=
generateUuid
();
const
proxy
=
net
.
connect
(
this
.
proxyPipe
);
proxy
.
once
(
"
connect
"
,
()
=>
proxy
.
write
(
id
));
});
}
private
async
startProxyServer
():
Promise
<
net
.
Server
>
{
if
(
!
this
.
_proxyServer
)
{
this
.
_proxyServer
=
new
Promise
(
async
(
resolve
)
=>
{
this
.
proxyPipe
=
await
this
.
findFreeSocketPath
(
this
.
proxyPipe
);
await
mkdirp
(
tmpdir
);
await
rimraf
(
this
.
proxyPipe
);
const
proxyServer
=
net
.
createServer
((
p
)
=>
this
.
_onProxyConnect
.
fire
(
p
));
proxyServer
.
once
(
"
listening
"
,
resolve
);
proxyServer
.
listen
(
this
.
proxyPipe
);
});
}
return
this
.
_proxyServer
;
}
private
async
findFreeSocketPath
(
basePath
:
string
,
maxTries
:
number
=
100
):
Promise
<
string
>
{
const
canConnect
=
(
path
:
string
):
Promise
<
boolean
>
=>
{
return
new
Promise
((
resolve
)
=>
{
const
socket
=
net
.
connect
(
path
);
socket
.
once
(
"
error
"
,
()
=>
resolve
(
false
));
socket
.
once
(
"
connect
"
,
()
=>
{
socket
.
destroy
();
resolve
(
true
);
});
});
};
let
i
=
0
;
let
path
=
basePath
;
while
(
await
canConnect
(
path
)
&&
i
<
maxTries
)
{
path
=
`
${
basePath
}
-
${
++
i
}
`
;
}
return
path
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录