Add getServerInfo API to http setup contract (#56636) (#56721)

* add getServerInfo http setup api

* update generated doc
This commit is contained in:
Pierre Gayvallet 2020-02-04 09:27:14 +01:00 committed by GitHub
parent 585fce8d61
commit e5a0477542
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 168 additions and 1 deletions

View file

@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [HttpServerInfo](./kibana-plugin-server.httpserverinfo.md) &gt; [host](./kibana-plugin-server.httpserverinfo.host.md)
## HttpServerInfo.host property
The hostname of the server
<b>Signature:</b>
```typescript
host: string;
```

View file

@ -0,0 +1,22 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [HttpServerInfo](./kibana-plugin-server.httpserverinfo.md)
## HttpServerInfo interface
<b>Signature:</b>
```typescript
export interface HttpServerInfo
```
## Properties
| Property | Type | Description |
| --- | --- | --- |
| [host](./kibana-plugin-server.httpserverinfo.host.md) | <code>string</code> | The hostname of the server |
| [name](./kibana-plugin-server.httpserverinfo.name.md) | <code>string</code> | The name of the Kibana server |
| [port](./kibana-plugin-server.httpserverinfo.port.md) | <code>number</code> | The port the server is listening on |
| [protocol](./kibana-plugin-server.httpserverinfo.protocol.md) | <code>'http' &#124; 'https' &#124; 'socket'</code> | The protocol used by the server |

View file

@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [HttpServerInfo](./kibana-plugin-server.httpserverinfo.md) &gt; [name](./kibana-plugin-server.httpserverinfo.name.md)
## HttpServerInfo.name property
The name of the Kibana server
<b>Signature:</b>
```typescript
name: string;
```

View file

@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [HttpServerInfo](./kibana-plugin-server.httpserverinfo.md) &gt; [port](./kibana-plugin-server.httpserverinfo.port.md)
## HttpServerInfo.port property
The port the server is listening on
<b>Signature:</b>
```typescript
port: number;
```

View file

@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [HttpServerInfo](./kibana-plugin-server.httpserverinfo.md) &gt; [protocol](./kibana-plugin-server.httpserverinfo.protocol.md)
## HttpServerInfo.protocol property
The protocol used by the server
<b>Signature:</b>
```typescript
protocol: 'http' | 'https' | 'socket';
```

View file

@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->
[Home](./index.md) &gt; [kibana-plugin-server](./kibana-plugin-server.md) &gt; [HttpServiceSetup](./kibana-plugin-server.httpservicesetup.md) &gt; [getServerInfo](./kibana-plugin-server.httpservicesetup.getserverinfo.md)
## HttpServiceSetup.getServerInfo property
Provides common [information](./kibana-plugin-server.httpserverinfo.md) about the running http server.
<b>Signature:</b>
```typescript
getServerInfo: () => HttpServerInfo;
```

View file

@ -86,6 +86,7 @@ async (context, request, response) => {
| [createCookieSessionStorageFactory](./kibana-plugin-server.httpservicesetup.createcookiesessionstoragefactory.md) | <code>&lt;T&gt;(cookieOptions: SessionStorageCookieOptions&lt;T&gt;) =&gt; Promise&lt;SessionStorageFactory&lt;T&gt;&gt;</code> | Creates cookie based session storage factory [SessionStorageFactory](./kibana-plugin-server.sessionstoragefactory.md) |
| [createRouter](./kibana-plugin-server.httpservicesetup.createrouter.md) | <code>() =&gt; IRouter</code> | Provides ability to declare a handler function for a particular path and HTTP request method. |
| [csp](./kibana-plugin-server.httpservicesetup.csp.md) | <code>ICspConfig</code> | The CSP config used for Kibana. |
| [getServerInfo](./kibana-plugin-server.httpservicesetup.getserverinfo.md) | <code>() =&gt; HttpServerInfo</code> | Provides common [information](./kibana-plugin-server.httpserverinfo.md) about the running http server. |
| [isTlsEnabled](./kibana-plugin-server.httpservicesetup.istlsenabled.md) | <code>boolean</code> | Flag showing whether a server was configured to use TLS connection. |
| [registerAuth](./kibana-plugin-server.httpservicesetup.registerauth.md) | <code>(handler: AuthenticationHandler) =&gt; void</code> | To define custom authentication and/or authorization mechanism for incoming requests. |
| [registerOnPostAuth](./kibana-plugin-server.httpservicesetup.registeronpostauth.md) | <code>(handler: OnPostAuthHandler) =&gt; void</code> | To define custom logic to perform for incoming requests. |

View file

@ -64,6 +64,7 @@ The plugin integrates with the core system via lifecycle events: `setup`<!-- -->
| [ErrorHttpResponseOptions](./kibana-plugin-server.errorhttpresponseoptions.md) | HTTP response parameters |
| [FakeRequest](./kibana-plugin-server.fakerequest.md) | Fake request object created manually by Kibana plugins. |
| [HttpResponseOptions](./kibana-plugin-server.httpresponseoptions.md) | HTTP response parameters |
| [HttpServerInfo](./kibana-plugin-server.httpserverinfo.md) | |
| [HttpServiceSetup](./kibana-plugin-server.httpservicesetup.md) | Kibana HTTP Service provides own abstraction for work with HTTP stack. Plugins don't have direct access to <code>hapi</code> server and its primitives anymore. Moreover, plugins shouldn't rely on the fact that HTTP Service uses one or another library under the hood. This gives the platform flexibility to upgrade or changing our internal HTTP stack without breaking plugins. If the HTTP Service lacks functionality you need, we are happy to discuss and support your needs. |
| [HttpServiceStart](./kibana-plugin-server.httpservicestart.md) | |
| [IContextContainer](./kibana-plugin-server.icontextcontainer.md) | An object that handles registration of context providers and configuring handlers with context. |

View file

@ -62,6 +62,7 @@ beforeAll(() => {
beforeEach(() => {
config = {
name: 'kibana',
host: '127.0.0.1',
maxPayload: new ByteSizeValue(1024),
port: 10002,
@ -1077,4 +1078,37 @@ describe('setup contract', () => {
expect(isTlsEnabled).toBe(false);
});
});
describe('#getServerInfo', () => {
it('returns correct information', async () => {
let { getServerInfo } = await server.setup(config);
expect(getServerInfo()).toEqual({
host: '127.0.0.1',
name: 'kibana',
port: 10002,
protocol: 'http',
});
({ getServerInfo } = await server.setup({
...config,
port: 12345,
name: 'custom-name',
host: 'localhost',
}));
expect(getServerInfo()).toEqual({
host: 'localhost',
name: 'custom-name',
port: 12345,
protocol: 'http',
});
});
it('returns correct protocol when ssl is enabled', async () => {
const { getServerInfo } = await server.setup(configWithSSL);
expect(getServerInfo().protocol).toEqual('https');
});
});
});

View file

@ -35,7 +35,7 @@ import {
import { IsAuthenticated, AuthStateStorage, GetAuthState } from './auth_state_storage';
import { AuthHeadersStorage, GetAuthHeaders } from './auth_headers_storage';
import { BasePath } from './base_path_service';
import { HttpServiceSetup } from './types';
import { HttpServiceSetup, HttpServerInfo } from './types';
/** @internal */
export interface HttpServerSetup {
@ -58,6 +58,7 @@ export interface HttpServerSetup {
get: GetAuthState;
isAuthenticated: IsAuthenticated;
};
getServerInfo: () => HttpServerInfo;
}
/** @internal */
@ -122,6 +123,12 @@ export class HttpServer {
isAuthenticated: this.authState.isAuthenticated,
},
getAuthHeaders: this.authRequestHeaders.get,
getServerInfo: () => ({
name: config.name,
host: config.host,
port: config.port,
protocol: this.server!.info.protocol,
}),
isTlsEnabled: config.ssl.enabled,
// Return server instance with the connection options so that we can properly
// bridge core and the "legacy" Kibana internally. Once this bridge isn't

View file

@ -77,12 +77,19 @@ const createSetupContractMock = () => {
auth: createAuthMock(),
getAuthHeaders: jest.fn(),
isTlsEnabled: false,
getServerInfo: jest.fn(),
};
setupContract.createCookieSessionStorageFactory.mockResolvedValue(
sessionStorageMock.createFactory()
);
setupContract.createRouter.mockImplementation(() => mockRouter.create());
setupContract.getAuthHeaders.mockReturnValue({ authorization: 'authorization-header' });
setupContract.getServerInfo.mockReturnValue({
host: 'localhost',
name: 'kibana',
port: 80,
protocol: 'http',
});
return setupContract;
};

View file

@ -252,6 +252,11 @@ export interface HttpServiceSetup {
contextName: T,
provider: RequestHandlerContextProvider<T>
) => RequestHandlerContextContainer;
/**
* Provides common {@link HttpServerInfo | information} about the running http server.
*/
getServerInfo: () => HttpServerInfo;
}
/** @internal */
@ -273,3 +278,15 @@ export interface HttpServiceStart {
/** Indicates if http server is listening on a given port */
isListening: (port: number) => boolean;
}
/** @public */
export interface HttpServerInfo {
/** The name of the Kibana server */
name: string;
/** The hostname of the server */
host: string;
/** The port the server is listening on */
port: number;
/** The protocol used by the server */
protocol: 'http' | 'https' | 'socket';
}

View file

@ -103,6 +103,7 @@ export {
GetAuthState,
HttpResponseOptions,
HttpResponsePayload,
HttpServerInfo,
HttpServiceSetup,
HttpServiceStart,
ErrorHttpResponseOptions,

View file

@ -292,6 +292,7 @@ export class LegacyService implements CoreService {
},
csp: setupDeps.core.http.csp,
isTlsEnabled: setupDeps.core.http.isTlsEnabled,
getServerInfo: setupDeps.core.http.getServerInfo,
},
savedObjects: {
setClientFactoryProvider: setupDeps.core.savedObjects.setClientFactoryProvider,

View file

@ -105,6 +105,7 @@ function createCoreSetupMock() {
get: httpService.auth.get,
isAuthenticated: httpService.auth.isAuthenticated,
},
getServerInfo: httpService.getServerInfo,
};
httpMock.createRouter.mockImplementation(() => httpService.createRouter(''));

View file

@ -164,6 +164,7 @@ export function createPluginSetupContext<TPlugin, TPluginDependencies>(
auth: { get: deps.http.auth.get, isAuthenticated: deps.http.auth.isAuthenticated },
csp: deps.http.csp,
isTlsEnabled: deps.http.isTlsEnabled,
getServerInfo: deps.http.getServerInfo,
},
savedObjects: {
setClientFactoryProvider: deps.savedObjects.setClientFactoryProvider,

View file

@ -736,6 +736,14 @@ export interface HttpResponseOptions {
// @public
export type HttpResponsePayload = undefined | string | Record<string, any> | Buffer | Stream;
// @public (undocumented)
export interface HttpServerInfo {
host: string;
name: string;
port: number;
protocol: 'http' | 'https' | 'socket';
}
// @public
export interface HttpServiceSetup {
// (undocumented)
@ -747,6 +755,7 @@ export interface HttpServiceSetup {
createCookieSessionStorageFactory: <T>(cookieOptions: SessionStorageCookieOptions<T>) => Promise<SessionStorageFactory<T>>;
createRouter: () => IRouter;
csp: ICspConfig;
getServerInfo: () => HttpServerInfo;
isTlsEnabled: boolean;
registerAuth: (handler: AuthenticationHandler) => void;
registerOnPostAuth: (handler: OnPostAuthHandler) => void;