Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
ae1d5457
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ae1d5457
编写于
8月 16, 2016
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
improve request service interface
上级
492dc4a1
变更
13
显示空白变更内容
内联
并排
Showing
13 changed file
with
37 addition
and
338 deletion
+37
-338
src/vs/base/node/request.ts
src/vs/base/node/request.ts
+17
-0
src/vs/code/node/cliProcessMain.ts
src/vs/code/node/cliProcessMain.ts
+3
-3
src/vs/code/node/sharedProcessMain.ts
src/vs/code/node/sharedProcessMain.ts
+3
-3
src/vs/platform/extensionManagement/node/extensionGalleryService.ts
...tform/extensionManagement/node/extensionGalleryService.ts
+2
-2
src/vs/platform/request/common/baseRequestService.ts
src/vs/platform/request/common/baseRequestService.ts
+0
-111
src/vs/platform/request/common/request.ts
src/vs/platform/request/common/request.ts
+1
-14
src/vs/platform/request/node/requestService.ts
src/vs/platform/request/node/requestService.ts
+2
-2
src/vs/test/utils/servicesTestUtils.ts
src/vs/test/utils/servicesTestUtils.ts
+1
-44
src/vs/workbench/electron-browser/shell.ts
src/vs/workbench/electron-browser/shell.ts
+3
-7
src/vs/workbench/electron-browser/update.ts
src/vs/workbench/electron-browser/update.ts
+1
-3
src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts
...ench/parts/extensions/electron-browser/extensionEditor.ts
+3
-2
src/vs/workbench/services/request/node/requestService.ts
src/vs/workbench/services/request/node/requestService.ts
+0
-127
src/vs/workbench/test/browser/services.test.ts
src/vs/workbench/test/browser/services.test.ts
+1
-20
未找到文件。
src/vs/base/node/request.ts
浏览文件 @
ae1d5457
...
...
@@ -108,6 +108,23 @@ export function download(filePath: string, context: IRequestContext): TPromise<v
});
}
export
function
text
(
context
:
IRequestContext
):
TPromise
<
string
>
{
return
new
Promise
((
c
,
e
)
=>
{
if
(
!
isSuccess
(
context
))
{
return
e
(
'
Server returned
'
+
context
.
res
.
statusCode
);
}
if
(
hasNoContent
(
context
))
{
return
c
(
null
);
}
let
buffer
:
string
[]
=
[];
context
.
stream
.
on
(
'
data
'
,
d
=>
buffer
.
push
(
d
));
context
.
stream
.
on
(
'
end
'
,
()
=>
c
(
buffer
.
join
(
''
)));
context
.
stream
.
on
(
'
error
'
,
e
);
});
}
export
function
json
<
T
>
(
context
:
IRequestContext
):
TPromise
<
T
>
{
return
new
Promise
((
c
,
e
)
=>
{
if
(
!
isSuccess
(
context
))
{
...
...
src/vs/code/node/cliProcessMain.ts
浏览文件 @
ae1d5457
...
...
@@ -25,8 +25,8 @@ import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/ex
import
{
ITelemetryService
,
combinedAppender
,
NullTelemetryService
}
from
'
vs/platform/telemetry/common/telemetry
'
;
import
{
TelemetryService
,
ITelemetryServiceConfig
}
from
'
vs/platform/telemetry/common/telemetryService
'
;
import
{
resolveCommonProperties
}
from
'
vs/platform/telemetry/node/commonProperties
'
;
import
{
IRequestService
2
}
from
'
vs/platform/request/common/request
'
;
import
{
RequestService
2
}
from
'
vs/platform/request/node/requestService2
'
;
import
{
IRequestService
}
from
'
vs/platform/request/common/request
'
;
import
{
RequestService
}
from
'
vs/platform/request/node/requestService
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
NodeConfigurationService
}
from
'
vs/platform/configuration/node/nodeConfigurationService
'
;
import
{
AppInsightsAppender
}
from
'
vs/platform/telemetry/node/appInsightsAppender
'
;
...
...
@@ -157,7 +157,7 @@ export function main(argv: ParsedArgs): TPromise<void> {
const
services
=
new
ServiceCollection
();
services
.
set
(
IEventService
,
new
SyncDescriptor
(
EventService
));
services
.
set
(
IConfigurationService
,
new
SyncDescriptor
(
NodeConfigurationService
));
services
.
set
(
IRequestService
2
,
new
SyncDescriptor
(
RequestService2
));
services
.
set
(
IRequestService
,
new
SyncDescriptor
(
RequestService
));
services
.
set
(
IExtensionManagementService
,
new
SyncDescriptor
(
ExtensionManagementService
));
services
.
set
(
IExtensionGalleryService
,
new
SyncDescriptor
(
ExtensionGalleryService
));
...
...
src/vs/code/node/sharedProcessMain.ts
浏览文件 @
ae1d5457
...
...
@@ -22,8 +22,8 @@ import { ExtensionManagementService } from 'vs/platform/extensionManagement/node
import
{
ExtensionGalleryService
}
from
'
vs/platform/extensionManagement/node/extensionGalleryService
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
NodeConfigurationService
}
from
'
vs/platform/configuration/node/nodeConfigurationService
'
;
import
{
IRequestService
2
}
from
'
vs/platform/request/common/request
'
;
import
{
RequestService
2
}
from
'
vs/platform/request/node/requestService2
'
;
import
{
IRequestService
}
from
'
vs/platform/request/common/request
'
;
import
{
RequestService
}
from
'
vs/platform/request/node/requestService
'
;
import
{
ITelemetryService
,
combinedAppender
,
NullTelemetryService
}
from
'
vs/platform/telemetry/common/telemetry
'
;
import
{
resolveCommonProperties
}
from
'
vs/platform/telemetry/node/commonProperties
'
;
import
{
TelemetryAppenderChannel
}
from
'
vs/platform/telemetry/common/telemetryIpc
'
;
...
...
@@ -59,7 +59,7 @@ function main(server: Server): void {
services
.
set
(
IEventService
,
new
SyncDescriptor
(
EventService
));
services
.
set
(
IEnvironmentService
,
new
SyncDescriptor
(
EnvironmentService
));
services
.
set
(
IConfigurationService
,
new
SyncDescriptor
(
NodeConfigurationService
));
services
.
set
(
IRequestService
2
,
new
SyncDescriptor
(
RequestService2
));
services
.
set
(
IRequestService
,
new
SyncDescriptor
(
RequestService
));
const
instantiationService
=
new
InstantiationService
(
services
);
...
...
src/vs/platform/extensionManagement/node/extensionGalleryService.ts
浏览文件 @
ae1d5457
...
...
@@ -10,7 +10,7 @@ import { TPromise } from 'vs/base/common/winjs.base';
import
{
IGalleryExtension
,
IExtensionGalleryService
,
IQueryOptions
,
SortBy
,
SortOrder
,
IExtensionManifest
}
from
'
vs/platform/extensionManagement/common/extensionManagement
'
;
import
{
isUndefined
}
from
'
vs/base/common/types
'
;
import
{
assign
,
getOrDefault
}
from
'
vs/base/common/objects
'
;
import
{
IRequestService
2
}
from
'
vs/platform/request/common/request
'
;
import
{
IRequestService
}
from
'
vs/platform/request/common/request
'
;
import
{
ITelemetryService
}
from
'
vs/platform/telemetry/common/telemetry
'
;
import
{
IPager
}
from
'
vs/base/common/paging
'
;
import
{
download
,
json
}
from
'
vs/base/node/request
'
;
...
...
@@ -227,7 +227,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService {
}
constructor
(
@
IRequestService
2
private
requestService
:
IRequestService2
,
@
IRequestService
private
requestService
:
IRequestService
,
@
ITelemetryService
private
telemetryService
:
ITelemetryService
,
@
IConfigurationService
private
configurationService
:
IConfigurationService
)
{
...
...
src/vs/platform/request/common/baseRequestService.ts
已删除
100644 → 0
浏览文件 @
492dc4a1
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'
use strict
'
;
import
URI
from
'
vs/base/common/uri
'
;
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
import
{
xhr
,
IXHROptions
}
from
'
vs/base/common/network
'
;
import
strings
=
require
(
'
vs/base/common/strings
'
);
import
Timer
=
require
(
'
vs/base/common/timer
'
);
import
Async
=
require
(
'
vs/base/common/async
'
);
import
http
=
require
(
'
vs/base/common/http
'
);
import
objects
=
require
(
'
vs/base/common/objects
'
);
import
{
IRequestService
}
from
'
vs/platform/request/common/request
'
;
import
{
ITelemetryService
,
NullTelemetryService
}
from
'
vs/platform/telemetry/common/telemetry
'
;
import
{
IWorkspaceContextService
}
from
'
vs/platform/workspace/common/workspace
'
;
/**
* Simple IRequestService implementation to allow sharing of this service implementation
* between different layers of the platform.
*/
export
class
BaseRequestService
implements
IRequestService
{
public
_serviceBrand
:
any
;
private
_serviceMap
:
{
[
service
:
string
]:
string
;
};
private
_origin
:
string
;
protected
_telemetryService
:
ITelemetryService
;
constructor
(
contextService
:
IWorkspaceContextService
,
telemetryService
:
ITelemetryService
=
NullTelemetryService
)
{
let
workspaceUri
:
string
=
null
;
let
workspace
=
contextService
.
getWorkspace
();
this
.
_serviceMap
=
(
<
any
>
workspace
)
||
Object
.
create
(
null
);
this
.
_telemetryService
=
telemetryService
;
if
(
workspace
)
{
workspaceUri
=
strings
.
rtrim
(
workspace
.
resource
.
toString
(),
'
/
'
)
+
'
/
'
;
}
this
.
computeOrigin
(
workspaceUri
);
}
private
computeOrigin
(
workspaceUri
:
string
):
void
{
if
(
workspaceUri
)
{
// Find root server URL from configuration
this
.
_origin
=
workspaceUri
;
let
urlPath
=
URI
.
parse
(
this
.
_origin
).
path
;
if
(
urlPath
&&
urlPath
.
length
>
0
)
{
this
.
_origin
=
this
.
_origin
.
substring
(
0
,
this
.
_origin
.
length
-
urlPath
.
length
+
1
);
}
if
(
!
strings
.
endsWith
(
this
.
_origin
,
'
/
'
))
{
this
.
_origin
+=
'
/
'
;
}
}
else
{
this
.
_origin
=
'
/
'
;
// Configuration not provided, fallback to default
}
}
protected
makeCrossOriginRequest
(
options
:
http
.
IXHROptions
):
TPromise
<
http
.
IXHRResponse
>
{
return
null
;
}
public
makeRequest
(
options
:
http
.
IXHROptions
):
TPromise
<
http
.
IXHRResponse
>
{
let
timer
:
Timer
.
ITimerEvent
=
Timer
.
nullEvent
;
let
isXhrRequestCORS
=
false
;
let
url
=
options
.
url
;
if
(
!
url
)
{
throw
new
Error
(
'
IRequestService.makeRequest: Url is required
'
);
}
if
((
strings
.
startsWith
(
url
,
'
http://
'
)
||
strings
.
startsWith
(
url
,
'
https://
'
))
&&
this
.
_origin
&&
!
strings
.
startsWith
(
url
,
this
.
_origin
))
{
let
coPromise
=
this
.
makeCrossOriginRequest
(
options
);
if
(
coPromise
)
{
return
coPromise
;
}
isXhrRequestCORS
=
true
;
}
let
xhrOptions
=
<
IXHROptions
>
options
;
let
xhrOptionsPromise
=
TPromise
.
as
(
undefined
);
if
(
!
isXhrRequestCORS
)
{
xhrOptions
=
this
.
_telemetryService
.
getTelemetryInfo
().
then
(
info
=>
{
let
additionalHeaders
=
{};
additionalHeaders
[
'
X-TelemetrySession
'
]
=
info
.
sessionId
;
additionalHeaders
[
'
X-Requested-With
'
]
=
'
XMLHttpRequest
'
;
xhrOptions
.
headers
=
objects
.
mixin
(
xhrOptions
.
headers
,
additionalHeaders
);
});
}
if
(
options
.
timeout
)
{
xhrOptions
.
customRequestInitializer
=
function
(
xhrRequest
:
XMLHttpRequest
)
{
xhrRequest
.
timeout
=
options
.
timeout
;
};
}
return
xhrOptionsPromise
.
then
(()
=>
{
return
Async
.
always
(
xhr
(
xhrOptions
),
((
xhr
:
XMLHttpRequest
)
=>
{
if
(
timer
.
data
)
{
timer
.
data
.
status
=
xhr
.
status
;
}
timer
.
stop
();
}));
});
}
}
src/vs/platform/request/common/request.ts
浏览文件 @
ae1d5457
...
...
@@ -5,30 +5,17 @@
'
use strict
'
;
import
{
localize
}
from
'
vs/nls
'
;
import
http
=
require
(
'
vs/base/common/http
'
);
import
{
TPromise
}
from
'
vs/base/common/winjs.base
'
;
import
{
createDecorator
}
from
'
vs/platform/instantiation/common/instantiation
'
;
import
{
IRequestOptions
,
IRequestContext
}
from
'
vs/base/node/request
'
;
import
{
IConfigurationRegistry
,
Extensions
}
from
'
vs/platform/configuration/common/configurationRegistry
'
;
import
{
Registry
}
from
'
vs/platform/platform
'
;
export
const
IRequestService
=
createDecorator
<
IRequestService
>
(
'
requestService
'
);
export
const
IRequestService
=
createDecorator
<
IRequestService
>
(
'
requestService
2
'
);
export
interface
IRequestService
{
_serviceBrand
:
any
;
/**
* Wraps the call into WinJS.XHR to allow for mocking and telemetry. Use this instead
* of calling WinJS.XHR directly.
*/
makeRequest
(
options
:
http
.
IXHROptions
):
TPromise
<
http
.
IXHRResponse
>
;
}
export
const
IRequestService2
=
createDecorator
<
IRequestService
>
(
'
requestService2
'
);
export
interface
IRequestService2
{
_serviceBrand
:
any
;
request
(
options
:
IRequestOptions
):
TPromise
<
IRequestContext
>
;
}
...
...
src/vs/platform/request/node/requestService
2
.ts
→
src/vs/platform/request/node/requestService.ts
浏览文件 @
ae1d5457
...
...
@@ -8,14 +8,14 @@ import { TPromise } from 'vs/base/common/winjs.base';
import
{
IDisposable
}
from
'
vs/base/common/lifecycle
'
;
import
{
IRequestOptions
,
IRequestContext
,
request
}
from
'
vs/base/node/request
'
;
import
{
getProxyAgent
}
from
'
vs/base/node/proxy
'
;
import
{
IRequestService
2
,
IHTTPConfiguration
}
from
'
vs/platform/request/common/request
'
;
import
{
IRequestService
,
IHTTPConfiguration
}
from
'
vs/platform/request/common/request
'
;
import
{
IConfigurationService
,
IConfigurationServiceEvent
}
from
'
vs/platform/configuration/common/configuration
'
;
/**
* This service exposes the `request` API, while using the global
* or configured proxy settings.
*/
export
class
RequestService
2
implements
IRequestService2
{
export
class
RequestService
implements
IRequestService
{
_serviceBrand
:
any
;
...
...
src/vs/test/utils/servicesTestUtils.ts
浏览文件 @
ae1d5457
...
...
@@ -28,7 +28,6 @@ import {IEditorInput, IEditorModel, Position, Direction, IEditor, IResourceInput
import
{
IEventService
}
from
'
vs/platform/event/common/event
'
;
import
{
IUntitledEditorService
}
from
'
vs/workbench/services/untitled/common/untitledEditorService
'
;
import
{
IMessageService
,
IConfirmation
}
from
'
vs/platform/message/common/message
'
;
import
{
BaseRequestService
}
from
'
vs/platform/request/common/baseRequestService
'
;
import
{
IWorkspace
,
IConfiguration
}
from
'
vs/platform/workspace/common/workspace
'
;
import
{
ILifecycleService
,
ShutdownEvent
}
from
'
vs/platform/lifecycle/common/lifecycle
'
;
import
{
EditorStacksModel
}
from
'
vs/workbench/common/editor/editorStacksModel
'
;
...
...
@@ -256,48 +255,6 @@ export class TestStorageService extends EventEmitter.EventEmitter implements ISt
}
}
export
class
TestRequestService
extends
BaseRequestService
{
constructor
(
workspace
=
TestWorkspace
)
{
super
(
new
TestContextService
(),
NullTelemetryService
);
}
}
export
interface
ICustomResponse
{
responseText
:
string
;
getResponseHeader
:
(
key
:
string
)
=>
string
;
}
export
interface
IMockRequestHandler
{
(
url
:
string
):
string
|
ICustomResponse
;
}
export
class
MockRequestService
extends
BaseRequestService
{
constructor
(
workspace
:
any
,
private
handler
:
IMockRequestHandler
)
{
super
(
new
TestContextService
(),
NullTelemetryService
);
}
public
makeRequest
(
options
:
http
.
IXHROptions
):
TPromise
<
http
.
IXHRResponse
>
{
let
data
=
this
.
handler
(
options
.
url
);
if
(
!
data
)
{
return
super
.
makeRequest
(
options
);
}
let
isString
=
Types
.
isString
(
data
);
let
responseText
=
isString
?
<
string
>
data
:
(
<
ICustomResponse
>
data
).
responseText
;
let
getResponseHeader
=
isString
?
()
=>
''
:
(
<
ICustomResponse
>
data
).
getResponseHeader
;
return
TPromise
.
as
<
http
.
IXHRResponse
>
({
responseText
:
responseText
,
status
:
200
,
readyState
:
4
,
getResponseHeader
:
getResponseHeader
});
}
}
export
class
TestUntitledEditorService
implements
IUntitledEditorService
{
public
_serviceBrand
:
any
;
...
...
src/vs/workbench/electron-browser/shell.ts
浏览文件 @
ae1d5457
...
...
@@ -30,9 +30,8 @@ import {Update} from 'vs/workbench/electron-browser/update';
import
{
WorkspaceStats
}
from
'
vs/workbench/services/telemetry/common/workspaceStats
'
;
import
{
IWindowService
,
WindowService
}
from
'
vs/workbench/services/window/electron-browser/windowService
'
;
import
{
MessageService
}
from
'
vs/workbench/services/message/electron-browser/messageService
'
;
import
{
IRequestService
,
IRequestService2
}
from
'
vs/platform/request/common/request
'
;
import
{
RequestService
}
from
'
vs/workbench/services/request/node/requestService
'
;
import
{
RequestService2
}
from
'
vs/platform/request/node/requestService2
'
;
import
{
IRequestService
}
from
'
vs/platform/request/common/request
'
;
import
{
RequestService
}
from
'
vs/platform/request/node/requestService
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
FileService
}
from
'
vs/workbench/services/files/electron-browser/fileService
'
;
import
{
SearchService
}
from
'
vs/workbench/services/search/node/searchService
'
;
...
...
@@ -294,12 +293,9 @@ export class WorkbenchShell {
this
.
contextViewService
=
instantiationService
.
createInstance
(
ContextViewService
,
this
.
container
);
serviceCollection
.
set
(
IContextViewService
,
this
.
contextViewService
);
const
requestService
=
disposables
.
add
(
instantiationService
.
createInstance
(
RequestService
)
);
const
requestService
=
instantiationService
.
createInstance
(
RequestService
);
serviceCollection
.
set
(
IRequestService
,
requestService
);
const
requestService2
=
instantiationService
.
createInstance
(
RequestService2
);
serviceCollection
.
set
(
IRequestService2
,
requestService2
);
const
markerService
=
instantiationService
.
createInstance
(
MarkerService
);
serviceCollection
.
set
(
IMarkerService
,
markerService
);
...
...
src/vs/workbench/electron-browser/update.ts
浏览文件 @
ae1d5457
...
...
@@ -12,7 +12,6 @@ import {Action} from 'vs/base/common/actions';
import
{
ipcRenderer
as
ipc
,
shell
}
from
'
electron
'
;
import
{
IMessageService
}
from
'
vs/platform/message/common/message
'
;
import
{
IWorkspaceContextService
}
from
'
vs/workbench/services/workspace/common/contextService
'
;
import
{
IRequestService
}
from
'
vs/platform/request/common/request
'
;
interface
IUpdate
{
releaseNotes
:
string
;
...
...
@@ -56,8 +55,7 @@ export class Update {
constructor
(
@
IWorkspaceContextService
private
contextService
:
IWorkspaceContextService
,
@
IMessageService
private
messageService
:
IMessageService
,
@
IRequestService
private
requestService
:
IRequestService
@
IMessageService
private
messageService
:
IMessageService
)
{
const
env
=
this
.
contextService
.
getConfiguration
().
env
;
...
...
src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts
浏览文件 @
ae1d5457
...
...
@@ -18,6 +18,7 @@ import { IViewlet } from 'vs/workbench/common/viewlet';
import
{
IViewletService
}
from
'
vs/workbench/services/viewlet/common/viewletService
'
;
import
{
ITelemetryService
}
from
'
vs/platform/telemetry/common/telemetry
'
;
import
{
IInstantiationService
}
from
'
vs/platform/instantiation/common/instantiation
'
;
import
{
text
}
from
'
vs/base/node/request
'
;
import
{
IRequestService
}
from
'
vs/platform/request/common/request
'
;
import
{
IExtensionGalleryService
}
from
'
vs/platform/extensionManagement/common/extensionManagement
'
;
import
{
IThemeService
}
from
'
vs/workbench/services/themes/common/themeService
'
;
...
...
@@ -174,8 +175,8 @@ export class ExtensionEditor extends BaseEditor {
if
(
extension
.
readmeUrl
)
{
promise
=
promise
.
then
(()
=>
addClass
(
this
.
body
,
'
loading
'
))
.
then
(()
=>
this
.
requestService
.
makeR
equest
({
url
:
extension
.
readmeUrl
}))
.
then
(
response
=>
response
.
responseT
ext
)
.
then
(()
=>
this
.
requestService
.
r
equest
({
url
:
extension
.
readmeUrl
}))
.
then
(
t
ext
)
.
then
(
marked
.
parse
)
.
then
<
void
>
(
body
=>
{
const
webview
=
new
WebView
(
...
...
src/vs/workbench/services/request/node/requestService.ts
已删除
100644 → 0
浏览文件 @
492dc4a1
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'
use strict
'
;
import
{
TPromise
,
Promise
}
from
'
vs/base/common/winjs.base
'
;
import
{
xhr
}
from
'
vs/base/common/network
'
;
import
strings
=
require
(
'
vs/base/common/strings
'
);
import
nls
=
require
(
'
vs/nls
'
);
import
{
IDisposable
,
dispose
}
from
'
vs/base/common/lifecycle
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
IHTTPConfiguration
}
from
'
vs/platform/request/common/request
'
;
import
{
BaseRequestService
}
from
'
vs/platform/request/common/baseRequestService
'
;
import
{
ITelemetryService
}
from
'
vs/platform/telemetry/common/telemetry
'
;
import
{
IWorkspaceContextService
}
from
'
vs/platform/workspace/common/workspace
'
;
import
{
assign
}
from
'
vs/base/common/objects
'
;
import
{
IXHROptions
,
IXHRResponse
}
from
'
vs/base/common/http
'
;
import
{
request
}
from
'
vs/base/node/request
'
;
import
{
getProxyAgent
}
from
'
vs/base/node/proxy
'
;
export
class
RequestService
extends
BaseRequestService
{
private
disposables
:
IDisposable
[];
private
proxyUrl
:
string
=
null
;
private
strictSSL
:
boolean
=
true
;
constructor
(
@
IWorkspaceContextService
contextService
:
IWorkspaceContextService
,
@
IConfigurationService
configurationService
:
IConfigurationService
,
@
ITelemetryService
telemetryService
?:
ITelemetryService
)
{
super
(
contextService
,
telemetryService
);
this
.
disposables
=
[];
const
config
=
configurationService
.
getConfiguration
<
IHTTPConfiguration
>
();
this
.
configure
(
config
);
const
disposable
=
configurationService
.
onDidUpdateConfiguration
(
e
=>
this
.
configure
(
e
.
config
));
this
.
disposables
.
push
(
disposable
);
}
private
configure
(
config
:
IHTTPConfiguration
)
{
this
.
proxyUrl
=
config
.
http
&&
config
.
http
.
proxy
;
this
.
strictSSL
=
config
.
http
&&
config
.
http
.
proxyStrictSSL
;
}
makeRequest
(
options
:
IXHROptions
):
TPromise
<
IXHRResponse
>
{
let
url
=
options
.
url
;
if
(
!
url
)
{
throw
new
Error
(
'
IRequestService.makeRequest: Url is required.
'
);
}
// Support file:// in native environment through XHR
if
(
strings
.
startsWith
(
url
,
'
file://
'
))
{
return
xhr
(
options
).
then
(
null
,
(
xhr
:
XMLHttpRequest
)
=>
{
if
(
xhr
.
status
===
0
&&
xhr
.
responseText
)
{
return
xhr
;
// loading resources locally returns a status of 0 which in WinJS is an error so we need to handle it here
}
return
<
any
>
Promise
.
wrapError
({
status
:
404
,
responseText
:
nls
.
localize
(
'
localFileNotFound
'
,
"
File not found.
"
)});
});
}
return
super
.
makeRequest
(
options
);
}
protected
makeCrossOriginRequest
(
options
:
IXHROptions
):
TPromise
<
IXHRResponse
>
{
const
{
proxyUrl
,
strictSSL
}
=
this
;
const
agent
=
getProxyAgent
(
options
.
url
,
{
proxyUrl
,
strictSSL
});
options
=
assign
({},
options
);
options
=
assign
(
options
,
{
agent
,
strictSSL
});
return
request
(
options
).
then
(
result
=>
new
TPromise
<
IXHRResponse
>
((
c
,
e
,
p
)
=>
{
const
{
res
,
stream
}
=
result
;
const
data
:
string
[]
=
[];
stream
.
on
(
'
data
'
,
c
=>
data
.
push
(
c
));
stream
.
on
(
'
end
'
,
()
=>
{
const
status
=
res
.
statusCode
;
if
(
options
.
followRedirects
>
0
&&
(
status
>=
300
&&
status
<=
303
||
status
===
307
))
{
let
location
=
res
.
headers
[
'
location
'
];
if
(
location
)
{
let
newOptions
=
{
type
:
options
.
type
,
url
:
location
,
user
:
options
.
user
,
password
:
options
.
password
,
responseType
:
options
.
responseType
,
headers
:
options
.
headers
,
timeout
:
options
.
timeout
,
followRedirects
:
options
.
followRedirects
-
1
,
data
:
options
.
data
};
xhr
(
newOptions
).
done
(
c
,
e
,
p
);
return
;
}
}
const
response
:
IXHRResponse
=
{
responseText
:
data
.
join
(
''
),
status
,
getResponseHeader
:
header
=>
res
.
headers
[
header
],
readyState
:
4
};
if
((
status
>=
200
&&
status
<
300
)
||
status
===
1223
)
{
c
(
response
);
}
else
{
e
(
response
);
}
});
},
err
=>
{
let
message
:
string
;
if
(
agent
)
{
message
=
'
Unable to to connect to
'
+
options
.
url
+
'
through a proxy . Error:
'
+
err
.
message
;
}
else
{
message
=
'
Unable to to connect to
'
+
options
.
url
+
'
. Error:
'
+
err
.
message
;
}
return
TPromise
.
wrapError
<
IXHRResponse
>
({
responseText
:
message
,
status
:
404
});
}));
}
dispose
():
void
{
this
.
disposables
=
dispose
(
this
.
disposables
);
}
}
\ No newline at end of file
src/vs/workbench/test/browser/services.test.ts
浏览文件 @
ae1d5457
...
...
@@ -12,7 +12,6 @@ import {Promise, TPromise} from 'vs/base/common/winjs.base';
import
paths
=
require
(
'
vs/base/common/paths
'
);
import
{
IEditorControl
}
from
'
vs/platform/editor/common/editor
'
;
import
URI
from
'
vs/base/common/uri
'
;
import
{
IRequestService
}
from
'
vs/platform/request/common/request
'
;
import
{
IModelService
}
from
'
vs/editor/common/services/modelService
'
;
import
{
IModeService
}
from
'
vs/editor/common/services/modeService
'
;
import
{
IWorkspaceContextService
}
from
'
vs/platform/workspace/common/workspace
'
;
...
...
@@ -29,9 +28,8 @@ import {StringEditorModel} from 'vs/workbench/common/editor/stringEditorModel';
import
{
FileEditorInput
}
from
'
vs/workbench/parts/files/common/editors/fileEditorInput
'
;
import
{
TextFileEditorModel
}
from
'
vs/workbench/parts/files/common/editors/textFileEditorModel
'
;
import
{
ITextFileService
}
from
'
vs/workbench/parts/files/common/files
'
;
import
{
createMockModelService
,
TestTextFileService
,
TestEventService
,
TestPartService
,
TestStorageService
,
TestConfigurationService
,
Test
RequestService
,
TestContextService
,
TestWorkspace
,
TestEditorService
,
MockRequest
Service
}
from
'
vs/test/utils/servicesTestUtils
'
;
import
{
createMockModelService
,
TestTextFileService
,
TestEventService
,
TestPartService
,
TestStorageService
,
TestConfigurationService
,
Test
ContextService
,
TestWorkspace
,
TestEditor
Service
}
from
'
vs/test/utils/servicesTestUtils
'
;
import
{
Viewlet
}
from
'
vs/workbench/browser/viewlet
'
;
import
{
EventType
}
from
'
vs/workbench/common/events
'
;
import
{
IPanel
}
from
'
vs/workbench/common/panel
'
;
import
{
ITelemetryService
,
NullTelemetryService
}
from
'
vs/platform/telemetry/common/telemetry
'
;
import
{
IUntitledEditorService
,
UntitledEditorService
}
from
'
vs/workbench/services/untitled/common/untitledEditorService
'
;
...
...
@@ -337,25 +335,10 @@ suite('Workbench UI Services', () => {
let
editorService
=
new
TestEditorService
(
function
()
{
});
let
eventService
=
new
TestEventService
();
let
contextService
=
new
TestContextService
(
TestWorkspace
);
let
requestService
=
new
MockRequestService
(
TestWorkspace
,
(
url
)
=>
{
if
(
/index
\.
html$/
.
test
(
url
))
{
return
{
responseText
:
'
Hello Html
'
,
getResponseHeader
:
key
=>
({
'
content-length
'
:
'
1000
'
,
'
last-modified
'
:
new
Date
().
toUTCString
(),
'
content-type
'
:
'
text/html
'
})[
key
.
toLowerCase
()]
};
}
return
null
;
});
let
instantiationService
=
new
TestInstantiationService
();
instantiationService
.
stub
(
IEventService
,
eventService
);
instantiationService
.
stub
(
IWorkspaceContextService
,
contextService
);
instantiationService
.
stub
(
IRequestService
,
requestService
);
instantiationService
.
stub
(
ITelemetryService
);
instantiationService
.
stub
(
IConfigurationService
,
new
TestConfigurationService
());
instantiationService
.
stub
(
IUntitledEditorService
,
instantiationService
.
createInstance
(
UntitledEditorService
));
...
...
@@ -433,12 +416,10 @@ suite('Workbench UI Services', () => {
let
editorService
=
new
TestEditorService
(
function
()
{
});
let
contextService
=
new
TestContextService
(
TestWorkspace
);
let
eventService
=
new
TestEventService
();
let
requestService
=
new
TestRequestService
();
let
telemetryService
=
NullTelemetryService
;
let
instantiationService
=
new
TestInstantiationService
();
instantiationService
.
stub
(
IEventService
,
eventService
);
instantiationService
.
stub
(
IRequestService
,
requestService
);
instantiationService
.
stub
(
ITelemetryService
,
telemetryService
);
instantiationService
.
stub
(
IStorageService
,
new
TestStorageService
());
instantiationService
.
stub
(
IUntitledEditorService
,
instantiationService
.
createInstance
(
UntitledEditorService
));
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录