mirror of
https://github.com/spring-cloud/spring-cloud-netflix.git
synced 2026-09-17 15:49:00 +00:00
URL Cleanup
This commit updates URLs to prefer the https protocol. Redirects are not followed to avoid accidentally expanding intentionally shortened URLs (i.e. if using a URL shortener). # HTTP URLs that Could Not Be Fixed These URLs were unable to be fixed. Please review them to see if they can be manually resolved. * [ ] http://conor.cc (200) with 4 occurrences could not be migrated: ([https](https://conor.cc) result SSLProtocolException). * [ ] http://richclarkdesign.com (200) with 1 occurrences could not be migrated: ([https](https://richclarkdesign.com) result SSLHandshakeException). * [ ] http://tinysort.sjeiti.com/ (200) with 1 occurrences could not be migrated: ([https](https://tinysort.sjeiti.com/) result SSLException). * [ ] http://unknown-origin.com (200) with 1 occurrences could not be migrated: ([https](https://unknown-origin.com) result AnnotatedConnectException). * [ ] http://www.sjeiti.com/ (301) with 1 occurrences could not be migrated: ([https](https://www.sjeiti.com/) result SSLException). * [ ] http://foo.com (301) with 1 occurrences could not be migrated: ([https](https://foo.com) result SSLHandshakeException). # Fixed URLs ## Fixed But Review Recommended These URLs were fixed, but the https status was not OK. However, the https status was the same as the http request or http redirected to an https URL, so they were migrated. Your review is recommended. * [ ] http://ejohn.org/ (301) with 1 occurrences migrated to: https://johnresig.com/ ([https](https://ejohn.org/) result ClosedChannelException). * [ ] http://ejohn.org/blog/javascript-micro-templating/ (301) with 1 occurrences migrated to: https://johnresig.com/blog/javascript-micro-templating/ ([https](https://ejohn.org/blog/javascript-micro-templating/) result ClosedChannelException). * [ ] http://example3.com/ (302) with 1 occurrences migrated to: https://www.hugedomains.com/domain_profile.cfm?d=example3&e=com ([https](https://example3.com/) result ConnectTimeoutException). * [ ] http://example3.com (302) with 2 occurrences migrated to: https://www.hugedomains.com/domain_profile.cfm?d=example3&e=com ([https](https://example3.com) result ConnectTimeoutException). * [ ] http://192.168.13.90:9999/actuator/health (ConnectTimeoutException) with 1 occurrences migrated to: https://192.168.13.90:9999/actuator/health ([https](https://192.168.13.90:9999/actuator/health) result ConnectTimeoutException). * [ ] http://192.168.13.90:9999/actuator/info (ConnectTimeoutException) with 1 occurrences migrated to: https://192.168.13.90:9999/actuator/info ([https](https://192.168.13.90:9999/actuator/info) result ConnectTimeoutException). * [ ] http://www.w3.org/TR/html4/loose.dtd (ReadTimeoutException) with 1 occurrences migrated to: https://www.w3.org/TR/html4/loose.dtd ([https](https://www.w3.org/TR/html4/loose.dtd) result SSLException). * [ ] http://%s:%s (UnknownHostException) with 1 occurrences migrated to: https://%s:%s ([https](https://%s:%s) result UnknownHostException). * [ ] http://allowed-origin.com (UnknownHostException) with 2 occurrences migrated to: https://allowed-origin.com ([https](https://allowed-origin.com) result UnknownHostException). * [ ] http://badClients/good (UnknownHostException) with 1 occurrences migrated to: https://badClients/good ([https](https://badClients/good) result UnknownHostException). * [ ] http://badClients/null (UnknownHostException) with 1 occurrences migrated to: https://badClients/null ([https](https://badClients/null) result UnknownHostException). * [ ] http://badClients/ping (UnknownHostException) with 1 occurrences migrated to: https://badClients/ping ([https](https://badClients/ping) result UnknownHostException). * [ ] http://badClients/timeout (UnknownHostException) with 1 occurrences migrated to: https://badClients/timeout ([https](https://badClients/timeout) result UnknownHostException). * [ ] http://bar (UnknownHostException) with 1 occurrences migrated to: https://bar ([https](https://bar) result UnknownHostException). * [ ] http://compose.docker.io/ (UnknownHostException) with 2 occurrences migrated to: https://compose.docker.io/ ([https](https://compose.docker.io/) result UnknownHostException). * [ ] http://custom-example.com (UnknownHostException) with 1 occurrences migrated to: https://custom-example.com ([https](https://custom-example.com) result UnknownHostException). * [ ] http://custom-example.com/ (UnknownHostException) with 1 occurrences migrated to: https://custom-example.com/ ([https](https://custom-example.com/) result UnknownHostException). * [ ] http://defaul-host3:8678/eureka/,http://defaul-host4:8678/eureka/ (UnknownHostException) with 1 occurrences migrated to: https://defaul-host3:8678/eureka/,http://defaul-host4:8678/eureka/ ([https](https://defaul-host3:8678/eureka/,https://defaul-host4:8678/eureka/) result UnknownHostException). * [ ] http://defaul-host4:8678/eureka/ (UnknownHostException) with 2 occurrences migrated to: https://defaul-host4:8678/eureka/ ([https](https://defaul-host4:8678/eureka/) result UnknownHostException). * [ ] http://defaul-host5:8678/eureka/ (UnknownHostException) with 2 occurrences migrated to: https://defaul-host5:8678/eureka/ ([https](https://defaul-host5:8678/eureka/) result UnknownHostException). * [ ] http://defaul-host6:8678/eureka/ (UnknownHostException) with 2 occurrences migrated to: https://defaul-host6:8678/eureka/ ([https](https://defaul-host6:8678/eureka/) result UnknownHostException). * [ ] http://default-host1:8678/eureka/ (UnknownHostException) with 2 occurrences migrated to: https://default-host1:8678/eureka/ ([https](https://default-host1:8678/eureka/) result UnknownHostException). * [ ] http://default-host2:8678/eureka/ (UnknownHostException) with 2 occurrences migrated to: https://default-host2:8678/eureka/ ([https](https://default-host2:8678/eureka/) result UnknownHostException). * [ ] http://default-host3:8678/eureka/ (UnknownHostException) with 2 occurrences migrated to: https://default-host3:8678/eureka/ ([https](https://default-host3:8678/eureka/) result UnknownHostException). * [ ] http://earlymade.com (UnknownHostException) with 4 occurrences migrated to: https://earlymade.com ([https](https://earlymade.com) result UnknownHostException). * [ ] http://ec2-256-156-243-129.compute-1.amazonaws.com:7001/eureka/ (UnknownHostException) with 1 occurrences migrated to: https://ec2-256-156-243-129.compute-1.amazonaws.com:7001/eureka/ ([https](https://ec2-256-156-243-129.compute-1.amazonaws.com:7001/eureka/) result UnknownHostException). * [ ] http://example.com,http://example2.com (UnknownHostException) with 2 occurrences migrated to: https://example.com,http://example2.com ([https](https://example.com,https://example2.com) result UnknownHostException). * [ ] http://example1.com,http://example2.com (UnknownHostException) with 1 occurrences migrated to: https://example1.com,http://example2.com ([https](https://example1.com,https://example2.com) result UnknownHostException). * [ ] http://first.example.com (UnknownHostException) with 1 occurrences migrated to: https://first.example.com ([https](https://first.example.com) result UnknownHostException). * [ ] http://foo (UnknownHostException) with 5 occurrences migrated to: https://foo ([https](https://foo) result UnknownHostException). * [ ] http://foo/ (UnknownHostException) with 2 occurrences migrated to: https://foo/ ([https](https://foo/) result UnknownHostException). * [ ] http://foo/%20bar (UnknownHostException) with 1 occurrences migrated to: https://foo/%20bar ([https](https://foo/%20bar) result UnknownHostException). * [ ] http://foo/%20bar?hello=1+2 (UnknownHostException) with 2 occurrences migrated to: https://foo/%20bar?hello=1+2 ([https](https://foo/%20bar?hello=1+2) result UnknownHostException). * [ ] http://foo:7001/ (UnknownHostException) with 1 occurrences migrated to: https://foo:7001/ ([https](https://foo:7001/) result UnknownHostException). * [ ] http://foo:7777/ (UnknownHostException) with 1 occurrences migrated to: https://foo:7777/ ([https](https://foo:7777/) result UnknownHostException). * [ ] http://host/doStuff (UnknownHostException) with 1 occurrences migrated to: https://host/doStuff ([https](https://host/doStuff) result UnknownHostException). * [ ] http://host:7777/Management/health (UnknownHostException) with 1 occurrences migrated to: https://host:7777/Management/health ([https](https://host:7777/Management/health) result UnknownHostException). * [ ] http://host:7777/Management/info (UnknownHostException) with 1 occurrences migrated to: https://host:7777/Management/info ([https](https://host:7777/Management/info) result UnknownHostException). * [ ] http://host:7777/Server/Management/health (UnknownHostException) with 1 occurrences migrated to: https://host:7777/Server/Management/health ([https](https://host:7777/Server/Management/health) result UnknownHostException). * [ ] http://host:7777/Server/Management/info (UnknownHostException) with 1 occurrences migrated to: https://host:7777/Server/Management/info ([https](https://host:7777/Server/Management/info) result UnknownHostException). * [ ] http://host:7777/Server/health (UnknownHostException) with 1 occurrences migrated to: https://host:7777/Server/health ([https](https://host:7777/Server/health) result UnknownHostException). * [ ] http://host:7777/Server/info (UnknownHostException) with 1 occurrences migrated to: https://host:7777/Server/info ([https](https://host:7777/Server/info) result UnknownHostException). * [ ] http://host:7777/health (UnknownHostException) with 1 occurrences migrated to: https://host:7777/health ([https](https://host:7777/health) result UnknownHostException). * [ ] http://host:7777/info (UnknownHostException) with 1 occurrences migrated to: https://host:7777/info ([https](https://host:7777/info) result UnknownHostException). * [ ] http://host:8888/Management/health (UnknownHostException) with 3 occurrences migrated to: https://host:8888/Management/health ([https](https://host:8888/Management/health) result UnknownHostException). * [ ] http://host:8888/Management/info (UnknownHostException) with 3 occurrences migrated to: https://host:8888/Management/info ([https](https://host:8888/Management/info) result UnknownHostException). * [ ] http://host:8888/health (UnknownHostException) with 2 occurrences migrated to: https://host:8888/health ([https](https://host:8888/health) result UnknownHostException). * [ ] http://host:8888/info (UnknownHostException) with 2 occurrences migrated to: https://host:8888/info ([https](https://host:8888/info) result UnknownHostException). * [ ] http://hostname:port/turbine/turbine.stream (UnknownHostException) with 1 occurrences migrated to: https://hostname:port/turbine/turbine.stream ([https](https://hostname:port/turbine/turbine.stream) result UnknownHostException). * [ ] http://hystrix-app:port/actuator/hystrix.stream (UnknownHostException) with 1 occurrences migrated to: https://hystrix-app:port/actuator/hystrix.stream ([https](https://hystrix-app:port/actuator/hystrix.stream) result UnknownHostException). * [ ] http://legacy.example.com (UnknownHostException) with 1 occurrences migrated to: https://legacy.example.com ([https](https://legacy.example.com) result UnknownHostException). * [ ] http://mhhost2:0/foo/health (UnknownHostException) with 2 occurrences migrated to: https://mhhost2:0/foo/health ([https](https://mhhost2:0/foo/health) result UnknownHostException). * [ ] http://mhhost2:0/foo/info (UnknownHostException) with 2 occurrences migrated to: https://mhhost2:0/foo/info ([https](https://mhhost2:0/foo/info) result UnknownHostException). * [ ] http://my.turbine.server:8080/turbine.stream?cluster=CLUSTERNAME (UnknownHostException) with 1 occurrences migrated to: https://my.turbine.server:8080/turbine.stream?cluster=CLUSTERNAME ([https](https://my.turbine.server:8080/turbine.stream?cluster=CLUSTERNAME) result UnknownHostException). * [ ] http://my.turbine.sever:8989/turbine.stream (UnknownHostException) with 1 occurrences migrated to: https://my.turbine.sever:8989/turbine.stream ([https](https://my.turbine.sever:8989/turbine.stream) result UnknownHostException). * [ ] http://my.turbine.sever:8989/turbine.stream?cluster=customers (UnknownHostException) with 1 occurrences migrated to: https://my.turbine.sever:8989/turbine.stream?cluster=customers ([https](https://my.turbine.sever:8989/turbine.stream?cluster=customers) result UnknownHostException). * [ ] http://my.turbine.sever:8989/turbine.stream?cluster=default (UnknownHostException) with 1 occurrences migrated to: https://my.turbine.sever:8989/turbine.stream?cluster=default ([https](https://my.turbine.sever:8989/turbine.stream?cluster=default) result UnknownHostException). * [ ] http://my.turbine.sever:8989/turbine.stream?cluster=products (UnknownHostException) with 1 occurrences migrated to: https://my.turbine.sever:8989/turbine.stream?cluster=products ([https](https://my.turbine.sever:8989/turbine.stream?cluster=products) result UnknownHostException). * [ ] http://myhost2:9000 (UnknownHostException) with 1 occurrences migrated to: https://myhost2:9000 ([https](https://myhost2:9000) result UnknownHostException). * [ ] http://myhost:8080 (UnknownHostException) with 1 occurrences migrated to: https://myhost:8080 ([https](https://myhost:8080) result UnknownHostException). * [ ] http://myhost:8989 (UnknownHostException) with 1 occurrences migrated to: https://myhost:8989 ([https](https://myhost:8989) result UnknownHostException). * [ ] http://myhost:9000 (UnknownHostException) with 1 occurrences migrated to: https://myhost:9000 ([https](https://myhost:9000) result UnknownHostException). * [ ] http://myservice (UnknownHostException) with 1 occurrences migrated to: https://myservice ([https](https://myservice) result UnknownHostException). * [ ] http://peer1/eureka/ (UnknownHostException) with 1 occurrences migrated to: https://peer1/eureka/ ([https](https://peer1/eureka/) result UnknownHostException). * [ ] http://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/ (UnknownHostException) with 1 occurrences migrated to: https://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/ ([https](https://peer1/eureka/,https://peer2/eureka/,https://peer3/eureka/) result UnknownHostException). * [ ] http://peer2/eureka/ (UnknownHostException) with 1 occurrences migrated to: https://peer2/eureka/ ([https](https://peer2/eureka/) result UnknownHostException). * [ ] http://region1-zone-host:8678/eureka/ (UnknownHostException) with 2 occurrences migrated to: https://region1-zone-host:8678/eureka/ ([https](https://region1-zone-host:8678/eureka/) result UnknownHostException). * [ ] http://region2-zone-host:8678/eureka/ (UnknownHostException) with 2 occurrences migrated to: https://region2-zone-host:8678/eureka/ ([https](https://region2-zone-host:8678/eureka/) result UnknownHostException). * [ ] http://region4-zone-host:8678/eureka/ (UnknownHostException) with 2 occurrences migrated to: https://region4-zone-host:8678/eureka/ ([https](https://region4-zone-host:8678/eureka/) result UnknownHostException). * [ ] http://sidecar.local.spring.io:5678/configserver/default-master.yml (UnknownHostException) with 1 occurrences migrated to: https://sidecar.local.spring.io:5678/configserver/default-master.yml ([https](https://sidecar.local.spring.io:5678/configserver/default-master.yml) result UnknownHostException). * [ ] http://simple/ (UnknownHostException) with 1 occurrences migrated to: https://simple/ ([https](https://simple/) result UnknownHostException). * [ ] http://simple/emptypost (UnknownHostException) with 1 occurrences migrated to: https://simple/emptypost ([https](https://simple/emptypost) result UnknownHostException). * [ ] http://simple/header (UnknownHostException) with 1 occurrences migrated to: https://simple/header ([https](https://simple/header) result UnknownHostException). * [ ] http://simple/path/ (UnknownHostException) with 2 occurrences migrated to: https://simple/path/ ([https](https://simple/path/) result UnknownHostException). * [ ] http://simple/post (UnknownHostException) with 1 occurrences migrated to: https://simple/post ([https](https://simple/post) result UnknownHostException). * [ ] http://simple/request?param= (UnknownHostException) with 1 occurrences migrated to: https://simple/request?param= ([https](https://simple/request?param=) result UnknownHostException). * [ ] http://simple_bad (UnknownHostException) with 1 occurrences migrated to: https://simple_bad ([https](https://simple_bad) result UnknownHostException). * [ ] http://turbine-hostname:port/turbine.stream (UnknownHostException) with 1 occurrences migrated to: https://turbine-hostname:port/turbine.stream ([https](https://turbine-hostname:port/turbine.stream) result UnknownHostException). * [ ] http://turbine-hostname:port/turbine.stream?cluster= (UnknownHostException) with 1 occurrences migrated to: https://turbine-hostname:port/turbine.stream?cluster= ([https](https://turbine-hostname:port/turbine.stream?cluster=) result UnknownHostException). * [ ] http://user2:pwd2@test2.com (UnknownHostException) with 1 occurrences migrated to: https://user2:pwd2@test2.com ([https](https://user2:pwd2@test2.com) result UnknownHostException). * [ ] http://user:foo@example.com:80/eureka (UnknownHostException) with 1 occurrences migrated to: https://user:foo@example.com:80/eureka ([https](https://user:foo@example.com:80/eureka) result UnknownHostException). * [ ] http://user:password@localhost:8761/eureka (UnknownHostException) with 1 occurrences migrated to: https://user:password@localhost:8761/eureka ([https](https://user:password@localhost:8761/eureka) result UnknownHostException). * [ ] http://user:password@localhost:8761/eureka/ (UnknownHostException) with 1 occurrences migrated to: https://user:password@localhost:8761/eureka/ ([https](https://user:password@localhost:8761/eureka/) result UnknownHostException). * [ ] http://user:pwd@test1.com (UnknownHostException) with 1 occurrences migrated to: https://user:pwd@test1.com ([https](https://user:pwd@test1.com) result UnknownHostException). * [ ] http://www.puppycrawl.com/dtds/suppressions_1_1.dtd (404) with 1 occurrences migrated to: https://www.puppycrawl.com/dtds/suppressions_1_1.dtd ([https](https://www.puppycrawl.com/dtds/suppressions_1_1.dtd) result 404). ## Fixed Success These URLs were switched to an https URL with a 2xx status. While the status was successful, your review is still recommended. * [ ] http://asciidoctor.org with 1 occurrences migrated to: https://asciidoctor.org ([https](https://asciidoctor.org) result 200). * [ ] http://example.com with 15 occurrences migrated to: https://example.com ([https](https://example.com) result 200). * [ ] http://example.com/ with 5 occurrences migrated to: https://example.com/ ([https](https://example.com/) result 200). * [ ] http://example.com/users_service with 1 occurrences migrated to: https://example.com/users_service ([https](https://example.com/users_service) result 200). * [ ] http://github.com/ with 1 occurrences migrated to: https://github.com/ ([https](https://github.com/) result 200). * [ ] http://hello.com with 3 occurrences migrated to: https://hello.com ([https](https://hello.com) result 200). * [ ] http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html with 1 occurrences migrated to: https://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html ([https](https://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html) result 200). * [ ] http://martinfowler.com/bliki/CircuitBreaker.html with 1 occurrences migrated to: https://martinfowler.com/bliki/CircuitBreaker.html ([https](https://martinfowler.com/bliki/CircuitBreaker.html) result 200). * [ ] http://projects.spring.io/spring-cloud/ with 6 occurrences migrated to: https://projects.spring.io/spring-cloud/ ([https](https://projects.spring.io/spring-cloud/) result 200). * [ ] http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html with 3 occurrences migrated to: https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html ([https](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) result 200). * [ ] http://www.gnu.org/licenses/gpl.html with 1 occurrences migrated to: https://www.gnu.org/licenses/gpl.html ([https](https://www.gnu.org/licenses/gpl.html) result 200). * [ ] http://www.slideshare.net/MikeyCohen1/edge-architecture-ieee-international-conference-on-cloud-engineering-32240146/27 with 1 occurrences migrated to: https://www.slideshare.net/MikeyCohen1/edge-architecture-ieee-international-conference-on-cloud-engineering-32240146/27 ([https](https://www.slideshare.net/MikeyCohen1/edge-architecture-ieee-international-conference-on-cloud-engineering-32240146/27) result 200). * [ ] http://commons.apache.org/proper/commons-configuration with 1 occurrences migrated to: https://commons.apache.org/proper/commons-configuration ([https](https://commons.apache.org/proper/commons-configuration) result 301). * [ ] http://creativecommons.org/licenses/MIT/ with 4 occurrences migrated to: https://creativecommons.org/licenses/MIT/ ([https](https://creativecommons.org/licenses/MIT/) result 301). * [ ] http://plugins.jetbrains.com/plugin/6546 with 3 occurrences migrated to: https://plugins.jetbrains.com/plugin/6546 ([https](https://plugins.jetbrains.com/plugin/6546) result 301). * [ ] http://raw.github.com/ with 1 occurrences migrated to: https://raw.github.com/ ([https](https://raw.github.com/) result 301). * [ ] http://service.com with 3 occurrences migrated to: https://service.com ([https](https://service.com) result 301). * [ ] http://www.opensource.org/licenses/mit-license.php with 1 occurrences migrated to: https://www.opensource.org/licenses/mit-license.php ([https](https://www.opensource.org/licenses/mit-license.php) result 301). * [ ] http://eclipse.org with 2 occurrences migrated to: https://eclipse.org ([https](https://eclipse.org) result 302). * [ ] http://eclipse.org/m2e/ with 4 occurrences migrated to: https://eclipse.org/m2e/ ([https](https://eclipse.org/m2e/) result 302). * [ ] http://example2.com/ with 1 occurrences migrated to: https://example2.com/ ([https](https://example2.com/) result 302). * [ ] http://simplegrid.info with 4 occurrences migrated to: https://simplegrid.info ([https](https://simplegrid.info) result 302). * [ ] http://simplegrid.info/ with 1 occurrences migrated to: https://simplegrid.info/ ([https](https://simplegrid.info/) result 302). * [ ] http://www.springsource.com/developer/sts with 2 occurrences migrated to: https://www.springsource.com/developer/sts ([https](https://www.springsource.com/developer/sts) result 302). # Ignored These URLs were intentionally ignored. * http://localhost with 135 occurrences * http://localhost/ with 2 occurrences * http://localhost/info with 1 occurrences * http://localhost/ping with 2 occurrences * http://localhost/status with 1 occurrences * http://localhost:%d/lazy/sample with 1 occurrences * http://localhost:%d/service/redirectedUri with 1 occurrences * http://localhost:5678/configserver with 1 occurrences * http://localhost:5678/customers with 1 occurrences * http://localhost:5678/hosts/ with 1 occurrences * http://localhost:7777/local with 4 occurrences * http://localhost:8000/health.json with 1 occurrences * http://localhost:8000/src/test/resources/health.json with 1 occurrences * http://localhost:8080 with 2 occurrences * http://localhost:8081 with 3 occurrences * http://localhost:8383/turbine.stream?cluster=RACES with 1 occurrences * http://localhost:8383/turbine.stream?cluster=WEB with 1 occurrences * http://localhost:8678/eureka/ with 1 occurrences * http://localhost:8761 with 2 occurrences * http://localhost:8761/eureka/ with 5 occurrences * http://localhost:9000 with 2 occurrences * http://test1.com with 1 occurrences * http://test1.com,http://test2.com with 1 occurrences * http://test1.com,http://user2:pwd2@test2.com with 1 occurrences * http://test2.com with 1 occurrences * http://test3.com,http://test4.com with 1 occurrences * http://test3.com,http://user4:pwd4@test4.com with 1 occurrences * http://test:test@localhost:8761 with 1 occurrences * http://test@localhost:8761 with 1 occurrences * http://testService with 1 occurrences
This commit is contained in:
@@ -28,7 +28,7 @@ added after the original pull request but before a merge.
|
|||||||
you can import formatter settings using the
|
you can import formatter settings using the
|
||||||
`eclipse-code-formatter.xml` file from the
|
`eclipse-code-formatter.xml` file from the
|
||||||
[Spring Cloud Build](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml) project. If using IntelliJ, you can use the
|
[Spring Cloud Build](https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml) project. If using IntelliJ, you can use the
|
||||||
[Eclipse Code Formatter Plugin](http://plugins.jetbrains.com/plugin/6546) to import the same file.
|
[Eclipse Code Formatter Plugin](https://plugins.jetbrains.com/plugin/6546) to import the same file.
|
||||||
* Make sure all new `.java` files to have a simple Javadoc class comment with at least an
|
* Make sure all new `.java` files to have a simple Javadoc class comment with at least an
|
||||||
`@author` tag identifying you, and preferably at least a paragraph on what the class is
|
`@author` tag identifying you, and preferably at least a paragraph on what the class is
|
||||||
for.
|
for.
|
||||||
@@ -40,6 +40,6 @@ added after the original pull request but before a merge.
|
|||||||
* A few unit tests would help a lot as well -- someone has to do it.
|
* A few unit tests would help a lot as well -- someone has to do it.
|
||||||
* If no-one else is using your branch, please rebase it against the current master (or
|
* If no-one else is using your branch, please rebase it against the current master (or
|
||||||
other target branch in the main project).
|
other target branch in the main project).
|
||||||
* When writing a commit message please follow [these conventions](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html),
|
* When writing a commit message please follow [these conventions](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html),
|
||||||
if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit
|
if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit
|
||||||
message (where XXXX is the issue number).
|
message (where XXXX is the issue number).
|
||||||
|
|||||||
+7
-7
@@ -84,7 +84,7 @@ credentials and you already have those.
|
|||||||
|
|
||||||
The projects that require middleware generally include a
|
The projects that require middleware generally include a
|
||||||
`docker-compose.yml`, so consider using
|
`docker-compose.yml`, so consider using
|
||||||
http://compose.docker.io/[Docker Compose] to run the middeware servers
|
https://compose.docker.io/[Docker Compose] to run the middeware servers
|
||||||
in Docker containers. See the README in the
|
in Docker containers. See the README in the
|
||||||
https://github.com/spring-cloud-samples/scripts[scripts demo
|
https://github.com/spring-cloud-samples/scripts[scripts demo
|
||||||
repository] for specific instructions about the common cases of mongo,
|
repository] for specific instructions about the common cases of mongo,
|
||||||
@@ -106,13 +106,13 @@ a modified file in the correct place. Just commit it and push the change.
|
|||||||
|
|
||||||
=== Working with the code
|
=== Working with the code
|
||||||
If you don't have an IDE preference we would recommend that you use
|
If you don't have an IDE preference we would recommend that you use
|
||||||
http://www.springsource.com/developer/sts[Spring Tools Suite] or
|
https://www.springsource.com/developer/sts[Spring Tools Suite] or
|
||||||
http://eclipse.org[Eclipse] when working with the code. We use the
|
https://eclipse.org[Eclipse] when working with the code. We use the
|
||||||
http://eclipse.org/m2e/[m2eclipse] eclipse plugin for maven support. Other IDEs and tools
|
https://eclipse.org/m2e/[m2eclipse] eclipse plugin for maven support. Other IDEs and tools
|
||||||
should also work without issue as long as they use Maven 3.3.3 or better.
|
should also work without issue as long as they use Maven 3.3.3 or better.
|
||||||
|
|
||||||
==== Importing into eclipse with m2eclipse
|
==== Importing into eclipse with m2eclipse
|
||||||
We recommend the http://eclipse.org/m2e/[m2eclipse] eclipse plugin when working with
|
We recommend the https://eclipse.org/m2e/[m2eclipse] eclipse plugin when working with
|
||||||
eclipse. If you don't already have m2eclipse installed it is available from the "eclipse
|
eclipse. If you don't already have m2eclipse installed it is available from the "eclipse
|
||||||
marketplace".
|
marketplace".
|
||||||
|
|
||||||
@@ -169,7 +169,7 @@ added after the original pull request but before a merge.
|
|||||||
`eclipse-code-formatter.xml` file from the
|
`eclipse-code-formatter.xml` file from the
|
||||||
https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring
|
https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring
|
||||||
Cloud Build] project. If using IntelliJ, you can use the
|
Cloud Build] project. If using IntelliJ, you can use the
|
||||||
http://plugins.jetbrains.com/plugin/6546[Eclipse Code Formatter
|
https://plugins.jetbrains.com/plugin/6546[Eclipse Code Formatter
|
||||||
Plugin] to import the same file.
|
Plugin] to import the same file.
|
||||||
* Make sure all new `.java` files to have a simple Javadoc class comment with at least an
|
* Make sure all new `.java` files to have a simple Javadoc class comment with at least an
|
||||||
`@author` tag identifying you, and preferably at least a paragraph on what the class is
|
`@author` tag identifying you, and preferably at least a paragraph on what the class is
|
||||||
@@ -182,6 +182,6 @@ added after the original pull request but before a merge.
|
|||||||
* A few unit tests would help a lot as well -- someone has to do it.
|
* A few unit tests would help a lot as well -- someone has to do it.
|
||||||
* If no-one else is using your branch, please rebase it against the current master (or
|
* If no-one else is using your branch, please rebase it against the current master (or
|
||||||
other target branch in the main project).
|
other target branch in the main project).
|
||||||
* When writing a commit message please follow http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions],
|
* When writing a commit message please follow https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions],
|
||||||
if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit
|
if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit
|
||||||
message (where XXXX is the issue number).
|
message (where XXXX is the issue number).
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
|
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
|
||||||
/* Remove the comments around the @import statement below when using this as a custom stylesheet */
|
/* Remove the comments around the @import statement below when using this as a custom stylesheet */
|
||||||
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic|Noto+Serif:400,400italic,700,700italic|Droid+Sans+Mono:400";*/
|
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic|Noto+Serif:400,400italic,700,700italic|Droid+Sans+Mono:400";*/
|
||||||
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
|
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
|
||||||
|
|||||||
+8
-8
@@ -88,7 +88,7 @@ credentials and you already have those.
|
|||||||
|
|
||||||
The projects that require middleware generally include a
|
The projects that require middleware generally include a
|
||||||
`docker-compose.yml`, so consider using
|
`docker-compose.yml`, so consider using
|
||||||
http://compose.docker.io/[Docker Compose] to run the middeware servers
|
https://compose.docker.io/[Docker Compose] to run the middeware servers
|
||||||
in Docker containers. See the README in the
|
in Docker containers. See the README in the
|
||||||
https://github.com/spring-cloud-samples/scripts[scripts demo
|
https://github.com/spring-cloud-samples/scripts[scripts demo
|
||||||
repository] for specific instructions about the common cases of mongo,
|
repository] for specific instructions about the common cases of mongo,
|
||||||
@@ -110,13 +110,13 @@ a modified file in the correct place. Just commit it and push the change.
|
|||||||
|
|
||||||
=== Working with the code
|
=== Working with the code
|
||||||
If you don't have an IDE preference we would recommend that you use
|
If you don't have an IDE preference we would recommend that you use
|
||||||
http://www.springsource.com/developer/sts[Spring Tools Suite] or
|
https://www.springsource.com/developer/sts[Spring Tools Suite] or
|
||||||
http://eclipse.org[Eclipse] when working with the code. We use the
|
https://eclipse.org[Eclipse] when working with the code. We use the
|
||||||
http://eclipse.org/m2e/[m2eclipse] eclipse plugin for maven support. Other IDEs and tools
|
https://eclipse.org/m2e/[m2eclipse] eclipse plugin for maven support. Other IDEs and tools
|
||||||
should also work without issue as long as they use Maven 3.3.3 or better.
|
should also work without issue as long as they use Maven 3.3.3 or better.
|
||||||
|
|
||||||
==== Importing into eclipse with m2eclipse
|
==== Importing into eclipse with m2eclipse
|
||||||
We recommend the http://eclipse.org/m2e/[m2eclipse] eclipse plugin when working with
|
We recommend the https://eclipse.org/m2e/[m2eclipse] eclipse plugin when working with
|
||||||
eclipse. If you don't already have m2eclipse installed it is available from the "eclipse
|
eclipse. If you don't already have m2eclipse installed it is available from the "eclipse
|
||||||
marketplace".
|
marketplace".
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ added after the original pull request but before a merge.
|
|||||||
`eclipse-code-formatter.xml` file from the
|
`eclipse-code-formatter.xml` file from the
|
||||||
https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring
|
https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring
|
||||||
Cloud Build] project. If using IntelliJ, you can use the
|
Cloud Build] project. If using IntelliJ, you can use the
|
||||||
http://plugins.jetbrains.com/plugin/6546[Eclipse Code Formatter
|
https://plugins.jetbrains.com/plugin/6546[Eclipse Code Formatter
|
||||||
Plugin] to import the same file.
|
Plugin] to import the same file.
|
||||||
* Make sure all new `.java` files to have a simple Javadoc class comment with at least an
|
* Make sure all new `.java` files to have a simple Javadoc class comment with at least an
|
||||||
`@author` tag identifying you, and preferably at least a paragraph on what the class is
|
`@author` tag identifying you, and preferably at least a paragraph on what the class is
|
||||||
@@ -188,7 +188,7 @@ added after the original pull request but before a merge.
|
|||||||
* A few unit tests would help a lot as well -- someone has to do it.
|
* A few unit tests would help a lot as well -- someone has to do it.
|
||||||
* If no-one else is using your branch, please rebase it against the current master (or
|
* If no-one else is using your branch, please rebase it against the current master (or
|
||||||
other target branch in the main project).
|
other target branch in the main project).
|
||||||
* When writing a commit message please follow http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions],
|
* When writing a commit message please follow https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions],
|
||||||
if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit
|
if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit
|
||||||
message (where XXXX is the issue number).
|
message (where XXXX is the issue number).
|
||||||
|
|
||||||
@@ -259,7 +259,7 @@ If you need to suppress some rules (e.g. line length needs to be longer), then i
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<!DOCTYPE suppressions PUBLIC
|
<!DOCTYPE suppressions PUBLIC
|
||||||
"-//Puppy Crawl//DTD Suppressions 1.1//EN"
|
"-//Puppy Crawl//DTD Suppressions 1.1//EN"
|
||||||
"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
|
"https://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
|
||||||
<suppressions>
|
<suppressions>
|
||||||
<suppress files=".*ConfigServerApplication\.java" checks="HideUtilityClassConstructor"/>
|
<suppress files=".*ConfigServerApplication\.java" checks="HideUtilityClassConstructor"/>
|
||||||
<suppress files=".*ConfigClientWatch\.java" checks="LineLengthCheck"/>
|
<suppress files=".*ConfigClientWatch\.java" checks="LineLengthCheck"/>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
:github-tag: master
|
:github-tag: master
|
||||||
:github-repo: spring-cloud/spring-cloud-netflix
|
:github-repo: spring-cloud/spring-cloud-netflix
|
||||||
:github-raw: http://raw.github.com/{github-repo}/{github-tag}
|
:github-raw: https://raw.github.com/{github-repo}/{github-tag}
|
||||||
:github-code: http://github.com/{github-repo}/tree/{github-tag}
|
:github-code: https://github.com/{github-repo}/tree/{github-tag}
|
||||||
:all: {asterisk}{asterisk}
|
:all: {asterisk}{asterisk}
|
||||||
:nofooter:
|
:nofooter:
|
||||||
:branch: master
|
:branch: master
|
||||||
@@ -23,7 +23,7 @@ The server can be configured and deployed to be highly available, with each serv
|
|||||||
=== How to Include Eureka Client
|
=== How to Include Eureka Client
|
||||||
|
|
||||||
To include the Eureka Client in your project, use the starter with a group ID of `org.springframework.cloud` and an artifact ID of `spring-cloud-starter-netflix-eureka-client`.
|
To include the Eureka Client in your project, use the starter with a group ID of `org.springframework.cloud` and an artifact ID of `spring-cloud-starter-netflix-eureka-client`.
|
||||||
See the http://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
See the https://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
||||||
|
|
||||||
=== Registering with Eureka
|
=== Registering with Eureka
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ To disable the Eureka Discovery Client, you can set `eureka.client.enabled` to `
|
|||||||
|
|
||||||
=== Authenticating with the Eureka Server
|
=== Authenticating with the Eureka Server
|
||||||
|
|
||||||
HTTP basic authentication is automatically added to your eureka client if one of the `eureka.client.serviceUrl.defaultZone` URLs has credentials embedded in it (curl style, as follows: `http://user:password@localhost:8761/eureka`).
|
HTTP basic authentication is automatically added to your eureka client if one of the `eureka.client.serviceUrl.defaultZone` URLs has credentials embedded in it (curl style, as follows: `https://user:password@localhost:8761/eureka`).
|
||||||
For more complex needs, you can create a `@Bean` of type `DiscoveryClientOptionalArgs` and inject `ClientFilter` instances into it, all of which is applied to the calls from the client to the server.
|
For more complex needs, you can create a `@Bean` of type `DiscoveryClientOptionalArgs` and inject `ClientFilter` instances into it, all of which is applied to the calls from the client to the server.
|
||||||
|
|
||||||
NOTE: Because of a limitation in Eureka, it is not possible to support per-server basic auth credentials, so only the first set that are found is used.
|
NOTE: Because of a limitation in Eureka, it is not possible to support per-server basic auth credentials, so only the first set that are found is used.
|
||||||
@@ -333,7 +333,7 @@ This section describes how to set up a Eureka server.
|
|||||||
=== How to Include Eureka Server
|
=== How to Include Eureka Server
|
||||||
|
|
||||||
To include Eureka Server in your project, use the starter with a group ID of `org.springframework.cloud` and an artifact ID of `spring-cloud-starter-netflix-eureka-server`.
|
To include Eureka Server in your project, use the starter with a group ID of `org.springframework.cloud` and an artifact ID of `spring-cloud-starter-netflix-eureka-server`.
|
||||||
See the http://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
See the https://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
||||||
|
|
||||||
NOTE: If your project already uses Thymeleaf as its template engine, the Freemarker templates of the Eureka server may not be loaded correctly. In this case it is necessary to configure the template loader manually:
|
NOTE: If your project already uses Thymeleaf as its template engine, the Freemarker templates of the Eureka server may not be loaded correctly. In this case it is necessary to configure the template loader manually:
|
||||||
|
|
||||||
@@ -443,7 +443,7 @@ eureka:
|
|||||||
hostname: peer1
|
hostname: peer1
|
||||||
client:
|
client:
|
||||||
serviceUrl:
|
serviceUrl:
|
||||||
defaultZone: http://peer2/eureka/
|
defaultZone: https://peer2/eureka/
|
||||||
|
|
||||||
---
|
---
|
||||||
spring:
|
spring:
|
||||||
@@ -453,7 +453,7 @@ eureka:
|
|||||||
hostname: peer2
|
hostname: peer2
|
||||||
client:
|
client:
|
||||||
serviceUrl:
|
serviceUrl:
|
||||||
defaultZone: http://peer1/eureka/
|
defaultZone: https://peer1/eureka/
|
||||||
----
|
----
|
||||||
|
|
||||||
In the preceding example, we have a YAML file that can be used to run the same server on two hosts (`peer1` and `peer2`) by running it in different Spring profiles.
|
In the preceding example, we have a YAML file that can be used to run the same server on two hosts (`peer1` and `peer2`) by running it in different Spring profiles.
|
||||||
@@ -472,7 +472,7 @@ the registrations amongst themselves.
|
|||||||
eureka:
|
eureka:
|
||||||
client:
|
client:
|
||||||
serviceUrl:
|
serviceUrl:
|
||||||
defaultZone: http://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/
|
defaultZone: https://peer1/eureka/,http://peer2/eureka/,http://peer3/eureka/
|
||||||
|
|
||||||
---
|
---
|
||||||
spring:
|
spring:
|
||||||
@@ -549,7 +549,7 @@ when running a Eureka server you must include these dependencies in your POM or
|
|||||||
|
|
||||||
== Circuit Breaker: Hystrix Clients
|
== Circuit Breaker: Hystrix Clients
|
||||||
|
|
||||||
Netflix has created a library called https://github.com/Netflix/Hystrix[Hystrix] that implements the http://martinfowler.com/bliki/CircuitBreaker.html[circuit breaker pattern].
|
Netflix has created a library called https://github.com/Netflix/Hystrix[Hystrix] that implements the https://martinfowler.com/bliki/CircuitBreaker.html[circuit breaker pattern].
|
||||||
In a microservice architecture, it is common to have multiple layers of service calls, as shown in the following example:
|
In a microservice architecture, it is common to have multiple layers of service calls, as shown in the following example:
|
||||||
|
|
||||||
.Microservice Graph
|
.Microservice Graph
|
||||||
@@ -571,7 +571,7 @@ Fallbacks may be chained so that the first fallback makes some other business ca
|
|||||||
|
|
||||||
To include Hystrix in your project, use the starter with a group ID of `org.springframework.cloud`
|
To include Hystrix in your project, use the starter with a group ID of `org.springframework.cloud`
|
||||||
and a artifact ID of `spring-cloud-starter-netflix-hystrix`.
|
and a artifact ID of `spring-cloud-starter-netflix-hystrix`.
|
||||||
See the http://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
See the https://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
||||||
|
|
||||||
The following example shows a minimal Eureka server with a Hystrix circuit breaker:
|
The following example shows a minimal Eureka server with a Hystrix circuit breaker:
|
||||||
|
|
||||||
@@ -688,7 +688,7 @@ be slightly more than three seconds.
|
|||||||
=== How to Include the Hystrix Dashboard
|
=== How to Include the Hystrix Dashboard
|
||||||
|
|
||||||
To include the Hystrix Dashboard in your project, use the starter with a group ID of `org.springframework.cloud` and an artifact ID of `spring-cloud-starter-netflix-hystrix-dashboard`.
|
To include the Hystrix Dashboard in your project, use the starter with a group ID of `org.springframework.cloud` and an artifact ID of `spring-cloud-starter-netflix-hystrix-dashboard`.
|
||||||
See the http://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
See the https://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
||||||
|
|
||||||
To run the Hystrix Dashboard, annotate your Spring Boot main class with `@EnableHystrixDashboard`.
|
To run the Hystrix Dashboard, annotate your Spring Boot main class with `@EnableHystrixDashboard`.
|
||||||
Then visit `/hystrix` and point the dashboard to an individual instance's `/hystrix.stream` endpoint in a Hystrix client application.
|
Then visit `/hystrix` and point the dashboard to an individual instance's `/hystrix.stream` endpoint in a Hystrix client application.
|
||||||
@@ -720,7 +720,7 @@ eureka:
|
|||||||
The `turbine.appConfig` configuration key is a list of Eureka serviceIds that turbine uses to lookup instances.
|
The `turbine.appConfig` configuration key is a list of Eureka serviceIds that turbine uses to lookup instances.
|
||||||
The turbine stream is then used in the Hystrix dashboard with a URL similar to the following:
|
The turbine stream is then used in the Hystrix dashboard with a URL similar to the following:
|
||||||
|
|
||||||
`http://my.turbine.server:8080/turbine.stream?cluster=CLUSTERNAME`
|
`https://my.turbine.server:8080/turbine.stream?cluster=CLUSTERNAME`
|
||||||
|
|
||||||
The cluster parameter can be omitted if the name is `default`.
|
The cluster parameter can be omitted if the name is `default`.
|
||||||
The `cluster` parameter must match an entry in `turbine.aggregator.clusterConfig`.
|
The `cluster` parameter must match an entry in `turbine.aggregator.clusterConfig`.
|
||||||
@@ -799,7 +799,7 @@ The Turbine Stream server requires the use of Spring Webflux, therefore `spring-
|
|||||||
By default `spring-boot-starter-webflux` is included when adding `spring-cloud-starter-netflix-turbine-stream` to your application.
|
By default `spring-boot-starter-webflux` is included when adding `spring-cloud-starter-netflix-turbine-stream` to your application.
|
||||||
|
|
||||||
You can then point the Hystrix Dashboard to the Turbine Stream Server instead of individual Hystrix streams.
|
You can then point the Hystrix Dashboard to the Turbine Stream Server instead of individual Hystrix streams.
|
||||||
If Turbine Stream is running on port 8989 on myhost, then put `http://myhost:8989` in the stream input field in the Hystrix Dashboard.
|
If Turbine Stream is running on port 8989 on myhost, then put `https://myhost:8989` in the stream input field in the Hystrix Dashboard.
|
||||||
Circuits are prefixed by their respective `serviceId`, followed by a dot (`.`), and then the circuit name.
|
Circuits are prefixed by their respective `serviceId`, followed by a dot (`.`), and then the circuit name.
|
||||||
|
|
||||||
Spring Cloud provides a `spring-cloud-starter-netflix-turbine-stream` that has all the dependencies you need to get a Turbine Stream server running.
|
Spring Cloud provides a `spring-cloud-starter-netflix-turbine-stream` that has all the dependencies you need to get a Turbine Stream server running.
|
||||||
@@ -811,10 +811,10 @@ Unlike Turbine server, Turbine Stream uses eureka serviceIds as cluster names an
|
|||||||
If Turbine Stream server is running on port 8989 on `my.turbine.server` and you have two eureka serviceIds `customers` and `products` in your environment, the following URLs will be available on your Turbine Stream server. `default` and empty cluster name will provide all metrics that Turbine Stream server receives.
|
If Turbine Stream server is running on port 8989 on `my.turbine.server` and you have two eureka serviceIds `customers` and `products` in your environment, the following URLs will be available on your Turbine Stream server. `default` and empty cluster name will provide all metrics that Turbine Stream server receives.
|
||||||
|
|
||||||
----
|
----
|
||||||
http://my.turbine.sever:8989/turbine.stream?cluster=customers
|
https://my.turbine.sever:8989/turbine.stream?cluster=customers
|
||||||
http://my.turbine.sever:8989/turbine.stream?cluster=products
|
https://my.turbine.sever:8989/turbine.stream?cluster=products
|
||||||
http://my.turbine.sever:8989/turbine.stream?cluster=default
|
https://my.turbine.sever:8989/turbine.stream?cluster=default
|
||||||
http://my.turbine.sever:8989/turbine.stream
|
https://my.turbine.sever:8989/turbine.stream
|
||||||
----
|
----
|
||||||
|
|
||||||
So, you can use eureka serviceIds as cluster names for your Turbine dashboard (or any compatible dashboard).
|
So, you can use eureka serviceIds as cluster names for your Turbine dashboard (or any compatible dashboard).
|
||||||
@@ -839,7 +839,7 @@ This contains (amongst other things) an `ILoadBalancer`, a `RestClient`, and a `
|
|||||||
=== How to Include Ribbon
|
=== How to Include Ribbon
|
||||||
|
|
||||||
To include Ribbon in your project, use the starter with a group ID of `org.springframework.cloud` and an artifact ID of `spring-cloud-starter-netflix-ribbon`.
|
To include Ribbon in your project, use the starter with a group ID of `org.springframework.cloud` and an artifact ID of `spring-cloud-starter-netflix-ribbon`.
|
||||||
See the http://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
See the https://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
||||||
|
|
||||||
=== Customizing the Ribbon Client
|
=== Customizing the Ribbon Client
|
||||||
|
|
||||||
@@ -980,7 +980,7 @@ public class MyClass {
|
|||||||
|
|
||||||
public void doStuff() {
|
public void doStuff() {
|
||||||
ServiceInstance instance = loadBalancer.choose("stores");
|
ServiceInstance instance = loadBalancer.choose("stores");
|
||||||
URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
|
URI storesUri = URI.create(String.format("https://%s:%s", instance.getHost(), instance.getPort()));
|
||||||
// ... do something with the URI
|
// ... do something with the URI
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1058,7 +1058,7 @@ If you do not put any value with `LOAD_BALANCER_KEY` in `RequestContext`, null i
|
|||||||
|
|
||||||
https://github.com/Netflix/archaius[Archaius] is the Netflix client-side configuration library.
|
https://github.com/Netflix/archaius[Archaius] is the Netflix client-side configuration library.
|
||||||
It is the library used by all of the Netflix OSS components for configuration.
|
It is the library used by all of the Netflix OSS components for configuration.
|
||||||
Archaius is an extension of the http://commons.apache.org/proper/commons-configuration[Apache Commons Configuration] project.
|
Archaius is an extension of the https://commons.apache.org/proper/commons-configuration[Apache Commons Configuration] project.
|
||||||
It allows updates to configuration by either polling a source for changes or by letting a source push changes to the client.
|
It allows updates to configuration by either polling a source for changes or by letting a source push changes to the client.
|
||||||
Archaius uses Dynamic<Type>Property classes as handles to properties, as shown in the following example:
|
Archaius uses Dynamic<Type>Property classes as handles to properties, as shown in the following example:
|
||||||
|
|
||||||
@@ -1087,7 +1087,7 @@ Routing is an integral part of a microservice architecture.
|
|||||||
For example, `/` may be mapped to your web application, `/api/users` is mapped to the user service and `/api/shop` is mapped to the shop service.
|
For example, `/` may be mapped to your web application, `/api/users` is mapped to the user service and `/api/shop` is mapped to the shop service.
|
||||||
https://github.com/Netflix/zuul[Zuul] is a JVM-based router and server-side load balancer from Netflix.
|
https://github.com/Netflix/zuul[Zuul] is a JVM-based router and server-side load balancer from Netflix.
|
||||||
|
|
||||||
http://www.slideshare.net/MikeyCohen1/edge-architecture-ieee-international-conference-on-cloud-engineering-32240146/27[Netflix uses Zuul] for the following:
|
https://www.slideshare.net/MikeyCohen1/edge-architecture-ieee-international-conference-on-cloud-engineering-32240146/27[Netflix uses Zuul] for the following:
|
||||||
|
|
||||||
* Authentication
|
* Authentication
|
||||||
* Insights
|
* Insights
|
||||||
@@ -1111,7 +1111,7 @@ NOTE: The default Hystrix isolation pattern (`ExecutionIsolationStrategy`) for a
|
|||||||
=== How to Include Zuul
|
=== How to Include Zuul
|
||||||
|
|
||||||
To include Zuul in your project, use the starter with a group ID of `org.springframework.cloud` and a artifact ID of `spring-cloud-starter-netflix-zuul`.
|
To include Zuul in your project, use the starter with a group ID of `org.springframework.cloud` and a artifact ID of `spring-cloud-starter-netflix-zuul`.
|
||||||
See the http://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
See the https://projects.spring.io/spring-cloud/[Spring Cloud Project page] for details on setting up your build system with the current Spring Cloud Release Train.
|
||||||
|
|
||||||
[[netflix-zuul-reverse-proxy]]
|
[[netflix-zuul-reverse-proxy]]
|
||||||
=== Embedded Zuul Reverse Proxy
|
=== Embedded Zuul Reverse Proxy
|
||||||
@@ -1177,7 +1177,7 @@ The location of the back end can be specified as either a `serviceId` (for a ser
|
|||||||
routes:
|
routes:
|
||||||
users:
|
users:
|
||||||
path: /myusers/**
|
path: /myusers/**
|
||||||
url: http://example.com/users_service
|
url: https://example.com/users_service
|
||||||
----
|
----
|
||||||
|
|
||||||
These simple url-routes do not get executed as a `HystrixCommand`, nor do they load-balance multiple URLs with Ribbon.
|
These simple url-routes do not get executed as a `HystrixCommand`, nor do they load-balance multiple URLs with Ribbon.
|
||||||
@@ -1204,7 +1204,7 @@ hystrix:
|
|||||||
myusers-service:
|
myusers-service:
|
||||||
ribbon:
|
ribbon:
|
||||||
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
|
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
|
||||||
listOfServers: http://example1.com,http://example2.com
|
listOfServers: https://example1.com,http://example2.com
|
||||||
ConnectTimeout: 1000
|
ConnectTimeout: 1000
|
||||||
ReadTimeout: 3000
|
ReadTimeout: 3000
|
||||||
MaxTotalHttpConnections: 500
|
MaxTotalHttpConnections: 500
|
||||||
@@ -1440,7 +1440,7 @@ The following example shows the configuration details for a "`strangle`" scenari
|
|||||||
routes:
|
routes:
|
||||||
first:
|
first:
|
||||||
path: /first/**
|
path: /first/**
|
||||||
url: http://first.example.com
|
url: https://first.example.com
|
||||||
second:
|
second:
|
||||||
path: /second/**
|
path: /second/**
|
||||||
url: forward:/second
|
url: forward:/second
|
||||||
@@ -1449,7 +1449,7 @@ The following example shows the configuration details for a "`strangle`" scenari
|
|||||||
url: forward:/3rd
|
url: forward:/3rd
|
||||||
legacy:
|
legacy:
|
||||||
path: /**
|
path: /**
|
||||||
url: http://legacy.example.com
|
url: https://legacy.example.com
|
||||||
----
|
----
|
||||||
|
|
||||||
In the preceding example, we are strangle the "`legacy`" application, which is mapped to all requests that do not match one of the other patterns.
|
In the preceding example, we are strangle the "`legacy`" application, which is mapped to all requests that do not match one of the other patterns.
|
||||||
@@ -1710,13 +1710,13 @@ public WebMvcConfigurer corsConfigurer() {
|
|||||||
return new WebMvcConfigurer() {
|
return new WebMvcConfigurer() {
|
||||||
public void addCorsMappings(CorsRegistry registry) {
|
public void addCorsMappings(CorsRegistry registry) {
|
||||||
registry.addMapping("/path-1/**")
|
registry.addMapping("/path-1/**")
|
||||||
.allowedOrigins("http://allowed-origin.com")
|
.allowedOrigins("https://allowed-origin.com")
|
||||||
.allowedMethods("GET", "POST");
|
.allowedMethods("GET", "POST");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
----
|
----
|
||||||
In the example above, we allow `GET` and `POST` methods from `http://allowed-origin.com` to send cross-origin requests to the endpoints starting with `path-1`.
|
In the example above, we allow `GET` and `POST` methods from `https://allowed-origin.com` to send cross-origin requests to the endpoints starting with `path-1`.
|
||||||
You can apply CORS configuration to a specific path pattern or globally for the whole application, using `/**` mapping.
|
You can apply CORS configuration to a specific path pattern or globally for the whole application, using `/**` mapping.
|
||||||
You can customize properties: `allowedOrigins`,`allowedMethods`,`allowedHeaders`,`exposedHeaders`,`allowCredentials` and `maxAge` via this configuration.
|
You can customize properties: `allowedOrigins`,`allowedMethods`,`allowedHeaders`,`exposedHeaders`,`allowCredentials` and `maxAge` via this configuration.
|
||||||
|
|
||||||
@@ -2043,14 +2043,14 @@ The following example response for `/hosts/customers` returns two instances on d
|
|||||||
{
|
{
|
||||||
"host": "myhost",
|
"host": "myhost",
|
||||||
"port": 9000,
|
"port": 9000,
|
||||||
"uri": "http://myhost:9000",
|
"uri": "https://myhost:9000",
|
||||||
"serviceId": "CUSTOMERS",
|
"serviceId": "CUSTOMERS",
|
||||||
"secure": false
|
"secure": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"host": "myhost2",
|
"host": "myhost2",
|
||||||
"port": 9000,
|
"port": 9000,
|
||||||
"uri": "http://myhost2:9000",
|
"uri": "https://myhost2:9000",
|
||||||
"serviceId": "CUSTOMERS",
|
"serviceId": "CUSTOMERS",
|
||||||
"secure": false
|
"secure": false
|
||||||
}
|
}
|
||||||
@@ -2066,7 +2066,7 @@ If the Config Server is registered with Eureka, the non-JVM application can acce
|
|||||||
If the `serviceId` of the ConfigServer is `configserver` and the Sidecar is on port 5678, then it can be accessed at http://localhost:5678/configserver.
|
If the `serviceId` of the ConfigServer is `configserver` and the Sidecar is on port 5678, then it can be accessed at http://localhost:5678/configserver.
|
||||||
|
|
||||||
Non-JVM applications can take advantage of the Config Server's ability to return YAML documents.
|
Non-JVM applications can take advantage of the Config Server's ability to return YAML documents.
|
||||||
For example, a call to http://sidecar.local.spring.io:5678/configserver/default-master.yml
|
For example, a call to https://sidecar.local.spring.io:5678/configserver/default-master.yml
|
||||||
might result in a YAML document resembling the following:
|
might result in a YAML document resembling the following:
|
||||||
|
|
||||||
[source,yaml]
|
[source,yaml]
|
||||||
|
|||||||
+1
-1
@@ -241,7 +241,7 @@ public class EurekaClientConfigBean implements EurekaClientConfig, Ordered {
|
|||||||
*
|
*
|
||||||
* Typically the eureka server URLs carry protocol,host,port,context and version
|
* Typically the eureka server URLs carry protocol,host,port,context and version
|
||||||
* information if any. Example:
|
* information if any. Example:
|
||||||
* http://ec2-256-156-243-129.compute-1.amazonaws.com:7001/eureka/
|
* https://ec2-256-156-243-129.compute-1.amazonaws.com:7001/eureka/
|
||||||
*
|
*
|
||||||
* The changes are effective at runtime at the next service url refresh cycle as
|
* The changes are effective at runtime at the next service url refresh cycle as
|
||||||
* specified by eurekaServiceUrlPollIntervalSeconds.
|
* specified by eurekaServiceUrlPollIntervalSeconds.
|
||||||
|
|||||||
+3
-3
@@ -360,9 +360,9 @@ public class EurekaClientAutoConfigurationTests {
|
|||||||
.getBean(EurekaInstanceConfigBean.class);
|
.getBean(EurekaInstanceConfigBean.class);
|
||||||
|
|
||||||
assertThat(instance.getStatusPageUrl()).as("statusPageUrl is wrong")
|
assertThat(instance.getStatusPageUrl()).as("statusPageUrl is wrong")
|
||||||
.isEqualTo("http://192.168.13.90:9999/actuator/info");
|
.isEqualTo("https://192.168.13.90:9999/actuator/info");
|
||||||
assertThat(instance.getHealthCheckUrl()).as("healthCheckUrl is wrong")
|
assertThat(instance.getHealthCheckUrl()).as("healthCheckUrl is wrong")
|
||||||
.isEqualTo("http://192.168.13.90:9999/actuator/health");
|
.isEqualTo("https://192.168.13.90:9999/actuator/health");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -474,7 +474,7 @@ public class EurekaClientAutoConfigurationTests {
|
|||||||
@Test
|
@Test
|
||||||
public void basicAuth() {
|
public void basicAuth() {
|
||||||
TestPropertyValues.of("server.port=8989",
|
TestPropertyValues.of("server.port=8989",
|
||||||
"eureka.client.serviceUrl.defaultZone=http://user:foo@example.com:80/eureka")
|
"eureka.client.serviceUrl.defaultZone=https://user:foo@example.com:80/eureka")
|
||||||
.applyTo(this.context);
|
.applyTo(this.context);
|
||||||
setupContext(MockClientConfiguration.class);
|
setupContext(MockClientConfiguration.class);
|
||||||
// ApacheHttpClient4 http = this.context.getBean(ApacheHttpClient4.class);
|
// ApacheHttpClient4 http = this.context.getBean(ApacheHttpClient4.class);
|
||||||
|
|||||||
+10
-10
@@ -58,15 +58,15 @@ public class EurekaClientConfigBeanTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void serviceUrl() {
|
public void serviceUrl() {
|
||||||
TestPropertyValues.of("eureka.client.serviceUrl.defaultZone:http://example.com")
|
TestPropertyValues.of("eureka.client.serviceUrl.defaultZone:https://example.com")
|
||||||
.applyTo(this.context);
|
.applyTo(this.context);
|
||||||
this.context.register(PropertyPlaceholderAutoConfiguration.class,
|
this.context.register(PropertyPlaceholderAutoConfiguration.class,
|
||||||
TestConfiguration.class);
|
TestConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
assertThat(this.context.getBean(EurekaClientConfigBean.class).getServiceUrl()
|
assertThat(this.context.getBean(EurekaClientConfigBean.class).getServiceUrl()
|
||||||
.toString()).isEqualTo("{defaultZone=http://example.com}");
|
.toString()).isEqualTo("{defaultZone=https://example.com}");
|
||||||
assertThat(getEurekaServiceUrlsForDefaultZone())
|
assertThat(getEurekaServiceUrlsForDefaultZone())
|
||||||
.isEqualTo("[http://example.com/]");
|
.isEqualTo("[https://example.com/]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -76,38 +76,38 @@ public class EurekaClientConfigBeanTests {
|
|||||||
source.addPropertySource(new MapPropertySource("config",
|
source.addPropertySource(new MapPropertySource("config",
|
||||||
Collections.<String, Object>singletonMap(
|
Collections.<String, Object>singletonMap(
|
||||||
"eureka.client.serviceUrl.defaultZone",
|
"eureka.client.serviceUrl.defaultZone",
|
||||||
"http://example.com,http://example2.com, http://example3.com")));
|
"https://example.com,http://example2.com, https://www.hugedomains.com/domain_profile.cfm?d=example3&e=com")));
|
||||||
this.context.register(PropertyPlaceholderAutoConfiguration.class,
|
this.context.register(PropertyPlaceholderAutoConfiguration.class,
|
||||||
TestConfiguration.class);
|
TestConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
assertThat(this.context.getBean(EurekaClientConfigBean.class).getServiceUrl()
|
assertThat(this.context.getBean(EurekaClientConfigBean.class).getServiceUrl()
|
||||||
.toString()).isEqualTo(
|
.toString()).isEqualTo(
|
||||||
"{defaultZone=http://example.com,http://example2.com, http://example3.com}");
|
"{defaultZone=https://example.com,http://example2.com, https://www.hugedomains.com/domain_profile.cfm?d=example3&e=com}");
|
||||||
assertThat(getEurekaServiceUrlsForDefaultZone()).isEqualTo(
|
assertThat(getEurekaServiceUrlsForDefaultZone()).isEqualTo(
|
||||||
"[http://example.com/, http://example2.com/, http://example3.com/]");
|
"[https://example.com/, https://example2.com/, https://www.hugedomains.com/domain_profile.cfm?d=example3&e=com]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void serviceUrlWithDefault() {
|
public void serviceUrlWithDefault() {
|
||||||
TestPropertyValues.of("eureka.client.serviceUrl.defaultZone:http://example.com")
|
TestPropertyValues.of("eureka.client.serviceUrl.defaultZone:https://example.com")
|
||||||
.applyTo(this.context);
|
.applyTo(this.context);
|
||||||
this.context.register(PropertyPlaceholderAutoConfiguration.class,
|
this.context.register(PropertyPlaceholderAutoConfiguration.class,
|
||||||
TestConfiguration.class);
|
TestConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
assertThat(getEurekaServiceUrlsForDefaultZone())
|
assertThat(getEurekaServiceUrlsForDefaultZone())
|
||||||
.isEqualTo("[http://example.com/]");
|
.isEqualTo("[https://example.com/]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void serviceUrlWithCustomZone() {
|
public void serviceUrlWithCustomZone() {
|
||||||
TestPropertyValues
|
TestPropertyValues
|
||||||
.of("eureka.client.serviceUrl.customZone:http://custom-example.com")
|
.of("eureka.client.serviceUrl.customZone:https://custom-example.com")
|
||||||
.applyTo(this.context);
|
.applyTo(this.context);
|
||||||
this.context.register(PropertyPlaceholderAutoConfiguration.class,
|
this.context.register(PropertyPlaceholderAutoConfiguration.class,
|
||||||
TestConfiguration.class);
|
TestConfiguration.class);
|
||||||
this.context.refresh();
|
this.context.refresh();
|
||||||
assertThat(getEurekaServiceUrls("customZone"))
|
assertThat(getEurekaServiceUrls("customZone"))
|
||||||
.isEqualTo("[http://custom-example.com/]");
|
.isEqualTo("[https://custom-example.com/]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
+1
-1
@@ -73,7 +73,7 @@ public class DiscoveryClientConfigServiceAutoConfigurationTests {
|
|||||||
Mockito.verify(eurekaClient, times(1)).shutdown();
|
Mockito.verify(eurekaClient, times(1)).shutdown();
|
||||||
ConfigClientProperties locator = this.context
|
ConfigClientProperties locator = this.context
|
||||||
.getBean(ConfigClientProperties.class);
|
.getBean(ConfigClientProperties.class);
|
||||||
assertThat(locator.getUri()[0]).isEqualTo("http://foo:7001/");
|
assertThat(locator.getUri()[0]).isEqualTo("https://foo:7001/");
|
||||||
ApplicationInfoManager infoManager = this.context
|
ApplicationInfoManager infoManager = this.context
|
||||||
.getBean(ApplicationInfoManager.class);
|
.getBean(ApplicationInfoManager.class);
|
||||||
assertThat(infoManager.getInfo().getMetadata().get("foo")).isEqualTo("bar");
|
assertThat(infoManager.getInfo().getMetadata().get("foo")).isEqualTo("bar");
|
||||||
|
|||||||
+18
-18
@@ -74,9 +74,9 @@ public class DefaultManagementMetadataProviderTest {
|
|||||||
ManagementMetadata actual = provider.get(INSTANCE, serverPort, serverContextPath,
|
ManagementMetadata actual = provider.get(INSTANCE, serverPort, serverContextPath,
|
||||||
managementContextPath, managementPort);
|
managementContextPath, managementPort);
|
||||||
|
|
||||||
assertThat(actual.getHealthCheckUrl()).isEqualTo("http://host:7777/health");
|
assertThat(actual.getHealthCheckUrl()).isEqualTo("https://host:7777/health");
|
||||||
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
||||||
assertThat(actual.getStatusPageUrl()).isEqualTo("http://host:7777/info");
|
assertThat(actual.getStatusPageUrl()).isEqualTo("https://host:7777/info");
|
||||||
assertThat(actual.getManagementPort()).isEqualTo(7777);
|
assertThat(actual.getManagementPort()).isEqualTo(7777);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,9 +89,9 @@ public class DefaultManagementMetadataProviderTest {
|
|||||||
ManagementMetadata actual = provider.get(INSTANCE, serverPort, serverContextPath,
|
ManagementMetadata actual = provider.get(INSTANCE, serverPort, serverContextPath,
|
||||||
managementContextPath, managementPort);
|
managementContextPath, managementPort);
|
||||||
|
|
||||||
assertThat(actual.getHealthCheckUrl()).isEqualTo("http://host:8888/health");
|
assertThat(actual.getHealthCheckUrl()).isEqualTo("https://host:8888/health");
|
||||||
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
||||||
assertThat(actual.getStatusPageUrl()).isEqualTo("http://host:8888/info");
|
assertThat(actual.getStatusPageUrl()).isEqualTo("https://host:8888/info");
|
||||||
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,9 +104,9 @@ public class DefaultManagementMetadataProviderTest {
|
|||||||
ManagementMetadata actual = provider.get(INSTANCE, serverPort, serverContextPath,
|
ManagementMetadata actual = provider.get(INSTANCE, serverPort, serverContextPath,
|
||||||
managementContextPath, managementPort);
|
managementContextPath, managementPort);
|
||||||
|
|
||||||
assertThat(actual.getHealthCheckUrl()).isEqualTo("http://host:8888/health");
|
assertThat(actual.getHealthCheckUrl()).isEqualTo("https://host:8888/health");
|
||||||
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
||||||
assertThat(actual.getStatusPageUrl()).isEqualTo("http://host:8888/info");
|
assertThat(actual.getStatusPageUrl()).isEqualTo("https://host:8888/info");
|
||||||
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,10 +121,10 @@ public class DefaultManagementMetadataProviderTest {
|
|||||||
managementContextPath, managementPort);
|
managementContextPath, managementPort);
|
||||||
|
|
||||||
assertThat(actual.getHealthCheckUrl())
|
assertThat(actual.getHealthCheckUrl())
|
||||||
.isEqualTo("http://host:8888/Management/health");
|
.isEqualTo("https://host:8888/Management/health");
|
||||||
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
||||||
assertThat(actual.getStatusPageUrl())
|
assertThat(actual.getStatusPageUrl())
|
||||||
.isEqualTo("http://host:8888/Management/info");
|
.isEqualTo("https://host:8888/Management/info");
|
||||||
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,10 +138,10 @@ public class DefaultManagementMetadataProviderTest {
|
|||||||
managementContextPath, managementPort);
|
managementContextPath, managementPort);
|
||||||
|
|
||||||
assertThat(actual.getHealthCheckUrl())
|
assertThat(actual.getHealthCheckUrl())
|
||||||
.isEqualTo("http://host:7777/Server/Management/health");
|
.isEqualTo("https://host:7777/Server/Management/health");
|
||||||
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
||||||
assertThat(actual.getStatusPageUrl())
|
assertThat(actual.getStatusPageUrl())
|
||||||
.isEqualTo("http://host:7777/Server/Management/info");
|
.isEqualTo("https://host:7777/Server/Management/info");
|
||||||
assertThat(actual.getManagementPort()).isEqualTo(7777);
|
assertThat(actual.getManagementPort()).isEqualTo(7777);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,10 +155,10 @@ public class DefaultManagementMetadataProviderTest {
|
|||||||
managementContextPath, managementPort);
|
managementContextPath, managementPort);
|
||||||
|
|
||||||
assertThat(actual.getHealthCheckUrl())
|
assertThat(actual.getHealthCheckUrl())
|
||||||
.isEqualTo("http://host:7777/Management/health");
|
.isEqualTo("https://host:7777/Management/health");
|
||||||
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
||||||
assertThat(actual.getStatusPageUrl())
|
assertThat(actual.getStatusPageUrl())
|
||||||
.isEqualTo("http://host:7777/Management/info");
|
.isEqualTo("https://host:7777/Management/info");
|
||||||
assertThat(actual.getManagementPort()).isEqualTo(7777);
|
assertThat(actual.getManagementPort()).isEqualTo(7777);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,9 +172,9 @@ public class DefaultManagementMetadataProviderTest {
|
|||||||
managementContextPath, managementPort);
|
managementContextPath, managementPort);
|
||||||
|
|
||||||
assertThat(actual.getHealthCheckUrl())
|
assertThat(actual.getHealthCheckUrl())
|
||||||
.isEqualTo("http://host:7777/Server/health");
|
.isEqualTo("https://host:7777/Server/health");
|
||||||
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
||||||
assertThat(actual.getStatusPageUrl()).isEqualTo("http://host:7777/Server/info");
|
assertThat(actual.getStatusPageUrl()).isEqualTo("https://host:7777/Server/info");
|
||||||
assertThat(actual.getManagementPort()).isEqualTo(7777);
|
assertThat(actual.getManagementPort()).isEqualTo(7777);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,10 +188,10 @@ public class DefaultManagementMetadataProviderTest {
|
|||||||
managementContextPath, managementPort);
|
managementContextPath, managementPort);
|
||||||
|
|
||||||
assertThat(actual.getHealthCheckUrl())
|
assertThat(actual.getHealthCheckUrl())
|
||||||
.isEqualTo("http://host:8888/Management/health");
|
.isEqualTo("https://host:8888/Management/health");
|
||||||
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
assertThat(actual.getSecureHealthCheckUrl()).isNullOrEmpty();
|
||||||
assertThat(actual.getStatusPageUrl())
|
assertThat(actual.getStatusPageUrl())
|
||||||
.isEqualTo("http://host:8888/Management/info");
|
.isEqualTo("https://host:8888/Management/info");
|
||||||
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -207,11 +207,11 @@ public class DefaultManagementMetadataProviderTest {
|
|||||||
managementContextPath, managementPort);
|
managementContextPath, managementPort);
|
||||||
|
|
||||||
assertThat(actual.getHealthCheckUrl())
|
assertThat(actual.getHealthCheckUrl())
|
||||||
.isEqualTo("http://host:8888/Management/health");
|
.isEqualTo("https://host:8888/Management/health");
|
||||||
assertThat(actual.getSecureHealthCheckUrl())
|
assertThat(actual.getSecureHealthCheckUrl())
|
||||||
.isEqualTo("https://host:8888/Management/health");
|
.isEqualTo("https://host:8888/Management/health");
|
||||||
assertThat(actual.getStatusPageUrl())
|
assertThat(actual.getStatusPageUrl())
|
||||||
.isEqualTo("http://host:8888/Management/info");
|
.isEqualTo("https://host:8888/Management/info");
|
||||||
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
assertThat(actual.getManagementPort()).isEqualTo(8888);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -90,7 +90,7 @@ public class RibbonEurekaAutoConfigurationTests {
|
|||||||
|
|
||||||
public void doStuff() {
|
public void doStuff() {
|
||||||
ServiceInstance serviceInstance = loadBalancerClient
|
ServiceInstance serviceInstance = loadBalancerClient
|
||||||
.choose("http://host/doStuff");
|
.choose("https://host/doStuff");
|
||||||
if (serviceInstance != null) {
|
if (serviceInstance != null) {
|
||||||
log.info(
|
log.info(
|
||||||
"There is a service instance, because Eureka discovery is enabled and the service is registered");
|
"There is a service instance, because Eureka discovery is enabled and the service is registered");
|
||||||
|
|||||||
+2
-2
@@ -36,9 +36,9 @@ public class EurekaControllerReplicasTests {
|
|||||||
|
|
||||||
String noAuthList2 = noAuthList1 + ",http://test2.com";
|
String noAuthList2 = noAuthList1 + ",http://test2.com";
|
||||||
|
|
||||||
String authList1 = "http://user:pwd@test1.com";
|
String authList1 = "https://user:pwd@test1.com";
|
||||||
|
|
||||||
String authList2 = authList1 + ",http://user2:pwd2@test2.com";
|
String authList2 = authList1 + ",https://user2:pwd2@test2.com";
|
||||||
|
|
||||||
String combinationAuthList1 = "http://test1.com,http://user2:pwd2@test2.com";
|
String combinationAuthList1 = "http://test1.com,http://user2:pwd2@test2.com";
|
||||||
|
|
||||||
|
|||||||
+19
-19
@@ -82,11 +82,11 @@ public class RefreshablePeerEurekaNodesTests {
|
|||||||
public void notUpdatedWhenDnsIsTrue() {
|
public void notUpdatedWhenDnsIsTrue() {
|
||||||
changeProperty("eureka.client.use-dns-for-fetching-service-urls=true",
|
changeProperty("eureka.client.use-dns-for-fetching-service-urls=true",
|
||||||
"eureka.client.region=unavailable-region", // to force defaultZone
|
"eureka.client.region=unavailable-region", // to force defaultZone
|
||||||
"eureka.client.service-url.defaultZone=http://default-host1:8678/eureka/");
|
"eureka.client.service-url.defaultZone=https://default-host1:8678/eureka/");
|
||||||
this.context.publishEvent(new EnvironmentChangeEvent(
|
this.context.publishEvent(new EnvironmentChangeEvent(
|
||||||
new HashSet<String>(Arrays.asList(USE_DNS, DEFAULT_ZONE))));
|
new HashSet<String>(Arrays.asList(USE_DNS, DEFAULT_ZONE))));
|
||||||
|
|
||||||
assertThat(serviceUrlMatches("http://default-host1:8678/eureka/")).as(
|
assertThat(serviceUrlMatches("https://default-host1:8678/eureka/")).as(
|
||||||
"PeerEurekaNodes' are updated when eureka.client.use-dns-for-fetching-service-urls is true")
|
"PeerEurekaNodes' are updated when eureka.client.use-dns-for-fetching-service-urls is true")
|
||||||
.isFalse();
|
.isFalse();
|
||||||
}
|
}
|
||||||
@@ -95,11 +95,11 @@ public class RefreshablePeerEurekaNodesTests {
|
|||||||
public void updatedWhenDnsIsFalse() {
|
public void updatedWhenDnsIsFalse() {
|
||||||
changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
|
changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
|
||||||
"eureka.client.region=unavailable-region", // to force defaultZone
|
"eureka.client.region=unavailable-region", // to force defaultZone
|
||||||
"eureka.client.service-url.defaultZone=http://default-host2:8678/eureka/");
|
"eureka.client.service-url.defaultZone=https://default-host2:8678/eureka/");
|
||||||
this.context.publishEvent(new EnvironmentChangeEvent(
|
this.context.publishEvent(new EnvironmentChangeEvent(
|
||||||
new HashSet<String>(Arrays.asList(USE_DNS, DEFAULT_ZONE))));
|
new HashSet<String>(Arrays.asList(USE_DNS, DEFAULT_ZONE))));
|
||||||
|
|
||||||
assertThat(serviceUrlMatches("http://default-host2:8678/eureka/")).as(
|
assertThat(serviceUrlMatches("https://default-host2:8678/eureka/")).as(
|
||||||
"PeerEurekaNodes' are not updated when eureka.client.use-dns-for-fetching-service-urls is false")
|
"PeerEurekaNodes' are not updated when eureka.client.use-dns-for-fetching-service-urls is false")
|
||||||
.isTrue();
|
.isTrue();
|
||||||
}
|
}
|
||||||
@@ -110,18 +110,18 @@ public class RefreshablePeerEurekaNodesTests {
|
|||||||
"eureka.client.region=region1",
|
"eureka.client.region=region1",
|
||||||
"eureka.client.availability-zones.region1=region1-zone",
|
"eureka.client.availability-zones.region1=region1-zone",
|
||||||
"eureka.client.availability-zones.region2=region2-zone",
|
"eureka.client.availability-zones.region2=region2-zone",
|
||||||
"eureka.client.service-url.region1-zone=http://region1-zone-host:8678/eureka/",
|
"eureka.client.service-url.region1-zone=https://region1-zone-host:8678/eureka/",
|
||||||
"eureka.client.service-url.region2-zone=http://region2-zone-host:8678/eureka/");
|
"eureka.client.service-url.region2-zone=https://region2-zone-host:8678/eureka/");
|
||||||
this.context
|
this.context
|
||||||
.publishEvent(new EnvironmentChangeEvent(Collections.singleton(REGION)));
|
.publishEvent(new EnvironmentChangeEvent(Collections.singleton(REGION)));
|
||||||
assertThat(serviceUrlMatches("http://region1-zone-host:8678/eureka/")).as(
|
assertThat(serviceUrlMatches("https://region1-zone-host:8678/eureka/")).as(
|
||||||
"PeerEurekaNodes' are not updated when eureka.client.region is changed")
|
"PeerEurekaNodes' are not updated when eureka.client.region is changed")
|
||||||
.isTrue();
|
.isTrue();
|
||||||
|
|
||||||
changeProperty("eureka.client.region=region2");
|
changeProperty("eureka.client.region=region2");
|
||||||
this.context
|
this.context
|
||||||
.publishEvent(new EnvironmentChangeEvent(Collections.singleton(REGION)));
|
.publishEvent(new EnvironmentChangeEvent(Collections.singleton(REGION)));
|
||||||
assertThat(serviceUrlMatches("http://region2-zone-host:8678/eureka/")).as(
|
assertThat(serviceUrlMatches("https://region2-zone-host:8678/eureka/")).as(
|
||||||
"PeerEurekaNodes' are not updated when eureka.client.region is changed")
|
"PeerEurekaNodes' are not updated when eureka.client.region is changed")
|
||||||
.isTrue();
|
.isTrue();
|
||||||
}
|
}
|
||||||
@@ -131,17 +131,17 @@ public class RefreshablePeerEurekaNodesTests {
|
|||||||
changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
|
changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
|
||||||
"eureka.client.region=region4",
|
"eureka.client.region=region4",
|
||||||
"eureka.client.availability-zones.region3=region3-zone",
|
"eureka.client.availability-zones.region3=region3-zone",
|
||||||
"eureka.client.service-url.region4-zone=http://region4-zone-host:8678/eureka/",
|
"eureka.client.service-url.region4-zone=https://region4-zone-host:8678/eureka/",
|
||||||
"eureka.client.service-url.defaultZone=http://default-host3:8678/eureka/");
|
"eureka.client.service-url.defaultZone=https://default-host3:8678/eureka/");
|
||||||
this.context.publishEvent(new EnvironmentChangeEvent(
|
this.context.publishEvent(new EnvironmentChangeEvent(
|
||||||
Collections.singleton("eureka.client.availability-zones.region3")));
|
Collections.singleton("eureka.client.availability-zones.region3")));
|
||||||
assertThat(this.peerEurekaNodes.getPeerEurekaNodes().get(0).getServiceUrl()
|
assertThat(this.peerEurekaNodes.getPeerEurekaNodes().get(0).getServiceUrl()
|
||||||
.equals("http://default-host3:8678/eureka/")).isTrue();
|
.equals("https://default-host3:8678/eureka/")).isTrue();
|
||||||
|
|
||||||
changeProperty("eureka.client.availability-zones.region4=region4-zone");
|
changeProperty("eureka.client.availability-zones.region4=region4-zone");
|
||||||
this.context.publishEvent(new EnvironmentChangeEvent(
|
this.context.publishEvent(new EnvironmentChangeEvent(
|
||||||
Collections.singleton("eureka.client.availability-zones.region4")));
|
Collections.singleton("eureka.client.availability-zones.region4")));
|
||||||
assertThat(serviceUrlMatches("http://region4-zone-host:8678/eureka/")).as(
|
assertThat(serviceUrlMatches("https://region4-zone-host:8678/eureka/")).as(
|
||||||
"PeerEurekaNodes' are not updated when eureka.client.availability-zones are changed")
|
"PeerEurekaNodes' are not updated when eureka.client.availability-zones are changed")
|
||||||
.isTrue();
|
.isTrue();
|
||||||
}
|
}
|
||||||
@@ -191,7 +191,7 @@ public class RefreshablePeerEurekaNodesTests {
|
|||||||
@Test
|
@Test
|
||||||
public void serviceUrlsCountAsSoonAsRefreshed() {
|
public void serviceUrlsCountAsSoonAsRefreshed() {
|
||||||
changeProperty(
|
changeProperty(
|
||||||
"eureka.client.service-url.defaultZone=http://defaul-host3:8678/eureka/,http://defaul-host4:8678/eureka/");
|
"eureka.client.service-url.defaultZone=https://defaul-host3:8678/eureka/,http://defaul-host4:8678/eureka/");
|
||||||
forceUpdate();
|
forceUpdate();
|
||||||
assertThat(this.peerEurekaNodes.getPeerEurekaNodes().size())
|
assertThat(this.peerEurekaNodes.getPeerEurekaNodes().size())
|
||||||
.as("PeerEurekaNodes' peer count is incorrect.").isEqualTo(2);
|
.as("PeerEurekaNodes' peer count is incorrect.").isEqualTo(2);
|
||||||
@@ -200,23 +200,23 @@ public class RefreshablePeerEurekaNodesTests {
|
|||||||
@Test
|
@Test
|
||||||
public void serviceUrlsValueAsSoonAsRefreshed() {
|
public void serviceUrlsValueAsSoonAsRefreshed() {
|
||||||
changeProperty(
|
changeProperty(
|
||||||
"eureka.client.service-url.defaultZone=http://defaul-host4:8678/eureka/");
|
"eureka.client.service-url.defaultZone=https://defaul-host4:8678/eureka/");
|
||||||
forceUpdate();
|
forceUpdate();
|
||||||
assertThat(serviceUrlMatches("http://defaul-host4:8678/eureka/"))
|
assertThat(serviceUrlMatches("https://defaul-host4:8678/eureka/"))
|
||||||
.as("PeerEurekaNodes' new peer[0] is incorrect").isTrue();
|
.as("PeerEurekaNodes' new peer[0] is incorrect").isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dashboardUpdatedAsSoonAsRefreshed() {
|
public void dashboardUpdatedAsSoonAsRefreshed() {
|
||||||
changeProperty(
|
changeProperty(
|
||||||
"eureka.client.service-url.defaultZone=http://defaul-host5:8678/eureka/");
|
"eureka.client.service-url.defaultZone=https://defaul-host5:8678/eureka/");
|
||||||
forceUpdate();
|
forceUpdate();
|
||||||
final ResponseEntity<String> entity = new TestRestTemplate()
|
final ResponseEntity<String> entity = new TestRestTemplate()
|
||||||
.getForEntity("http://localhost:" + this.port + "/", String.class);
|
.getForEntity("http://localhost:" + this.port + "/", String.class);
|
||||||
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
|
||||||
final String body = entity.getBody();
|
final String body = entity.getBody();
|
||||||
assertThat(body).isNotNull();
|
assertThat(body).isNotNull();
|
||||||
assertThat(body.contains("http://defaul-host5:8678/eureka/"))
|
assertThat(body.contains("https://defaul-host5:8678/eureka/"))
|
||||||
.as("DS Replicas not updated in the Eureka Server dashboard").isTrue();
|
.as("DS Replicas not updated in the Eureka Server dashboard").isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,10 +224,10 @@ public class RefreshablePeerEurekaNodesTests {
|
|||||||
public void notUpdatedForRelaxedKeys() {
|
public void notUpdatedForRelaxedKeys() {
|
||||||
changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
|
changeProperty("eureka.client.use-dns-for-fetching-service-urls=false",
|
||||||
"eureka.client.region=unavailable-region", // to force defaultZone
|
"eureka.client.region=unavailable-region", // to force defaultZone
|
||||||
"eureka.client.service-url.defaultZone=http://defaul-host6:8678/eureka/");
|
"eureka.client.service-url.defaultZone=https://defaul-host6:8678/eureka/");
|
||||||
this.context.publishEvent(new EnvironmentChangeEvent(
|
this.context.publishEvent(new EnvironmentChangeEvent(
|
||||||
Collections.singleton("eureka.client.serviceUrl.defaultZone")));
|
Collections.singleton("eureka.client.serviceUrl.defaultZone")));
|
||||||
assertThat(serviceUrlMatches("http://defaul-host6:8678/eureka/"))
|
assertThat(serviceUrlMatches("https://defaul-host6:8678/eureka/"))
|
||||||
.as("PeerEurekaNodes' are updated for keys with relaxed binding")
|
.as("PeerEurekaNodes' are updated for keys with relaxed binding")
|
||||||
.isFalse();
|
.isFalse();
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
/* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
/* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
||||||
* http://simplegrid.info
|
* https://simplegrid.info
|
||||||
* by Conor Muirhead (http://conor.cc) of Early LLC (http://earlymade.com)
|
* by Conor Muirhead (http://conor.cc) of Early LLC (https://earlymade.com)
|
||||||
* License: http://creativecommons.org/licenses/MIT/ */
|
* License: https://creativecommons.org/licenses/MIT/ */
|
||||||
|
|
||||||
/* Containers */
|
/* Containers */
|
||||||
body { font-size: 1.125em; }
|
body { font-size: 1.125em; }
|
||||||
|
|||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
/* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
/* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
||||||
* http://simplegrid.info
|
* https://simplegrid.info
|
||||||
* by Conor Muirhead (http://conor.cc) of Early LLC (http://earlymade.com)
|
* by Conor Muirhead (http://conor.cc) of Early LLC (https://earlymade.com)
|
||||||
* License: http://creativecommons.org/licenses/MIT/ */
|
* License: https://creativecommons.org/licenses/MIT/ */
|
||||||
|
|
||||||
/* Containers */
|
/* Containers */
|
||||||
body { font-size: 0.875em; padding: 0; }
|
body { font-size: 0.875em; padding: 0; }
|
||||||
|
|||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
/* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
/* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
||||||
* http://simplegrid.info
|
* https://simplegrid.info
|
||||||
* by Conor Muirhead (http://conor.cc) of Early LLC (http://earlymade.com)
|
* by Conor Muirhead (http://conor.cc) of Early LLC (https://earlymade.com)
|
||||||
* License: http://creativecommons.org/licenses/MIT/ */
|
* License: https://creativecommons.org/licenses/MIT/ */
|
||||||
|
|
||||||
/* Containers */
|
/* Containers */
|
||||||
body { font-size: 100%; }
|
body { font-size: 100%; }
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
http://simplegrid.info/
|
https://simplegrid.info/
|
||||||
+3
-3
@@ -1,9 +1,9 @@
|
|||||||
/* Extension of SimpleGrid by benjchristensen to allow percentage based sizing on very large displays
|
/* Extension of SimpleGrid by benjchristensen to allow percentage based sizing on very large displays
|
||||||
*
|
*
|
||||||
* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
* SimpleGrid - a fork of CSSGrid by Crowd Favorite (https://github.com/crowdfavorite/css-grid)
|
||||||
* http://simplegrid.info
|
* https://simplegrid.info
|
||||||
* by Conor Muirhead (http://conor.cc) of Early LLC (http://earlymade.com)
|
* by Conor Muirhead (http://conor.cc) of Early LLC (https://earlymade.com)
|
||||||
* License: http://creativecommons.org/licenses/MIT/ */
|
* License: https://creativecommons.org/licenses/MIT/ */
|
||||||
|
|
||||||
/* Containers */
|
/* Containers */
|
||||||
body { font-size: 1.125em; }
|
body { font-size: 1.125em; }
|
||||||
|
|||||||
Vendored
+3
-3
@@ -3,10 +3,10 @@
|
|||||||
*
|
*
|
||||||
* Version: 1.0.5
|
* Version: 1.0.5
|
||||||
*
|
*
|
||||||
* Copyright (c) 2008-2011 Ron Valstar http://www.sjeiti.com/
|
* Copyright (c) 2008-2011 Ron Valstar http://ronvalstar.nl/
|
||||||
*
|
*
|
||||||
* Dual licensed under the MIT and GPL licenses:
|
* Dual licensed under the MIT and GPL licenses:
|
||||||
* http://www.opensource.org/licenses/mit-license.php
|
* https://www.opensource.org/licenses/mit-license.php
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* https://www.gnu.org/licenses/gpl.html
|
||||||
*/
|
*/
|
||||||
(function(b){b.tinysort={id:"TinySort",version:"1.0.5",copyright:"Copyright (c) 2008-2011 Ron Valstar",uri:"http://tinysort.sjeiti.com/",defaults:{order:"asc",attr:"",place:"start",returns:false,useVal:false}};b.fn.extend({tinysort:function(h,j){if(h&&typeof(h)!="string"){j=h;h=null}var e=b.extend({},b.tinysort.defaults,j);var p={};this.each(function(t){var v=(!h||h=="")?b(this):b(this).find(h);var u=e.order=="rand"?""+Math.random():(e.attr==""?(e.useVal?v.val():v.text()):v.attr(e.attr));var s=b(this).parent();if(!p[s]){p[s]={s:[],n:[]}}if(v.length>0){p[s].s.push({s:u,e:b(this),n:t})}else{p[s].n.push({e:b(this),n:t})}});for(var g in p){var d=p[g];d.s.sort(function k(t,s){var i=t.s.toLowerCase?t.s.toLowerCase():t.s;var u=s.s.toLowerCase?s.s.toLowerCase():s.s;if(c(t.s)&&c(s.s)){i=parseFloat(t.s);u=parseFloat(s.s)}return(e.order=="asc"?1:-1)*(i<u?-1:(i>u?1:0))})}var m=[];for(var g in p){var d=p[g];var n=[];var f=b(this).length;switch(e.place){case"first":b.each(d.s,function(s,t){f=Math.min(f,t.n)});break;case"org":b.each(d.s,function(s,t){n.push(t.n)});break;case"end":f=d.n.length;break;default:f=0}var q=[0,0];for(var l=0;l<b(this).length;l++){var o=l>=f&&l<f+d.s.length;if(a(n,l)){o=true}var r=(o?d.s:d.n)[q[o?0:1]].e;r.parent().append(r);if(o||!e.returns){m.push(r.get(0))}q[o?0:1]++}}return this.pushStack(m)}});function c(e){var d=/^\s*?[\+-]?(\d*\.?\d*?)\s*?$/.exec(e);return d&&d.length>0?d[1]:false}function a(e,f){var d=false;b.each(e,function(h,g){if(!d){d=g==f}});return d}b.fn.TinySort=b.fn.Tinysort=b.fn.tsort=b.fn.tinysort})(jQuery);
|
(function(b){b.tinysort={id:"TinySort",version:"1.0.5",copyright:"Copyright (c) 2008-2011 Ron Valstar",uri:"http://tinysort.sjeiti.com/",defaults:{order:"asc",attr:"",place:"start",returns:false,useVal:false}};b.fn.extend({tinysort:function(h,j){if(h&&typeof(h)!="string"){j=h;h=null}var e=b.extend({},b.tinysort.defaults,j);var p={};this.each(function(t){var v=(!h||h=="")?b(this):b(this).find(h);var u=e.order=="rand"?""+Math.random():(e.attr==""?(e.useVal?v.val():v.text()):v.attr(e.attr));var s=b(this).parent();if(!p[s]){p[s]={s:[],n:[]}}if(v.length>0){p[s].s.push({s:u,e:b(this),n:t})}else{p[s].n.push({e:b(this),n:t})}});for(var g in p){var d=p[g];d.s.sort(function k(t,s){var i=t.s.toLowerCase?t.s.toLowerCase():t.s;var u=s.s.toLowerCase?s.s.toLowerCase():s.s;if(c(t.s)&&c(s.s)){i=parseFloat(t.s);u=parseFloat(s.s)}return(e.order=="asc"?1:-1)*(i<u?-1:(i>u?1:0))})}var m=[];for(var g in p){var d=p[g];var n=[];var f=b(this).length;switch(e.place){case"first":b.each(d.s,function(s,t){f=Math.min(f,t.n)});break;case"org":b.each(d.s,function(s,t){n.push(t.n)});break;case"end":f=d.n.length;break;default:f=0}var q=[0,0];for(var l=0;l<b(this).length;l++){var o=l>=f&&l<f+d.s.length;if(a(n,l)){o=true}var r=(o?d.s:d.n)[q[o?0:1]].e;r.parent().append(r);if(o||!e.returns){m.push(r.get(0))}q[o?0:1]++}}return this.pushStack(m)}});function c(e){var d=/^\s*?[\+-]?(\d*\.?\d*?)\s*?$/.exec(e);return d&&d.length>0?d[1]:false}function a(e,f){var d=false;b.each(e,function(h,g){if(!d){d=g==f}});return d}b.fn.TinySort=b.fn.Tinysort=b.fn.tsort=b.fn.tinysort})(jQuery);
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
//Simple JavaScript Templating
|
//Simple JavaScript Templating
|
||||||
//John Resig - http://ejohn.org/ - MIT Licensed
|
//John Resig - https://johnresig.com/ - MIT Licensed
|
||||||
// http://ejohn.org/blog/javascript-micro-templating/
|
// https://johnresig.com/blog/javascript-micro-templating/
|
||||||
(function(window, undefined) {
|
(function(window, undefined) {
|
||||||
var cache = {};
|
var cache = {};
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -1,5 +1,5 @@
|
|||||||
<#import "/spring.ftl" as spring />
|
<#import "/spring.ftl" as spring />
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<base href="${basePath}">
|
<base href="${basePath}">
|
||||||
@@ -36,13 +36,13 @@
|
|||||||
<br>
|
<br>
|
||||||
|
|
||||||
<h2>Hystrix Dashboard</h2>
|
<h2>Hystrix Dashboard</h2>
|
||||||
<input id="stream" type="textfield" size="120" placeholder="http://hostname:port/turbine/turbine.stream"></input>
|
<input id="stream" type="textfield" size="120" placeholder="https://hostname:port/turbine/turbine.stream"></input>
|
||||||
<br><br>
|
<br><br>
|
||||||
<i>Cluster via Turbine (default cluster):</i> http://turbine-hostname:port/turbine.stream
|
<i>Cluster via Turbine (default cluster):</i> https://turbine-hostname:port/turbine.stream
|
||||||
<br>
|
<br>
|
||||||
<i>Cluster via Turbine (custom cluster):</i> http://turbine-hostname:port/turbine.stream?cluster=[clusterName]
|
<i>Cluster via Turbine (custom cluster):</i> https://turbine-hostname:port/turbine.stream?cluster=[clusterName]
|
||||||
<br>
|
<br>
|
||||||
<i>Single Hystrix App:</i> http://hystrix-app:port/actuator/hystrix.stream
|
<i>Single Hystrix App:</i> https://hystrix-app:port/actuator/hystrix.stream
|
||||||
<br><br>
|
<br><br>
|
||||||
Delay: <input id="delay" type="textfield" size="10" placeholder="2000"></input>ms
|
Delay: <input id="delay" type="textfield" size="10" placeholder="2000"></input>ms
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -181,7 +181,7 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Read a page's GET URL variables and return them as an associative array.
|
//Read a page's GET URL variables and return them as an associative array.
|
||||||
// from: http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html
|
// from: https://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html
|
||||||
function getUrlVars()
|
function getUrlVars()
|
||||||
{
|
{
|
||||||
var vars = [], hash;
|
var vars = [], hash;
|
||||||
|
|||||||
+4
-4
@@ -77,7 +77,7 @@ public class RestTemplateRetryTests {
|
|||||||
@Before
|
@Before
|
||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
// Force Ribbon configuration by making one call.
|
// Force Ribbon configuration by making one call.
|
||||||
this.testClient.getForObject("http://badClients/ping", Integer.class);
|
this.testClient.getForObject("https://badClients/ping", Integer.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -100,7 +100,7 @@ public class RestTemplateRetryTests {
|
|||||||
// A null pointer should NOT trigger a circuit breaker.
|
// A null pointer should NOT trigger a circuit breaker.
|
||||||
for (int index = 0; index < numCalls; index++) {
|
for (int index = 0; index < numCalls; index++) {
|
||||||
try {
|
try {
|
||||||
this.testClient.getForObject("http://badClients/null", Integer.class);
|
this.testClient.getForObject("https://badClients/null", Integer.class);
|
||||||
}
|
}
|
||||||
catch (Exception exception) {
|
catch (Exception exception) {
|
||||||
}
|
}
|
||||||
@@ -149,7 +149,7 @@ public class RestTemplateRetryTests {
|
|||||||
int hits = 0;
|
int hits = 0;
|
||||||
|
|
||||||
for (int index = 0; index < numCalls; index++) {
|
for (int index = 0; index < numCalls; index++) {
|
||||||
hits = this.testClient.getForObject("http://badClients/good", Integer.class);
|
hits = this.testClient.getForObject("https://badClients/good", Integer.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
logServerStats(LocalBadClientConfiguration.badServer);
|
logServerStats(LocalBadClientConfiguration.badServer);
|
||||||
@@ -185,7 +185,7 @@ public class RestTemplateRetryTests {
|
|||||||
|
|
||||||
int numCalls = 15;
|
int numCalls = 15;
|
||||||
for (int index = 0; index < numCalls; index++) {
|
for (int index = 0; index < numCalls; index++) {
|
||||||
hits = this.testClient.getForObject("http://badClients/timeout",
|
hits = this.testClient.getForObject("https://badClients/timeout",
|
||||||
Integer.class);
|
Integer.class);
|
||||||
}
|
}
|
||||||
logServerStats(LocalBadClientConfiguration.badServer);
|
logServerStats(LocalBadClientConfiguration.badServer);
|
||||||
|
|||||||
+1
-1
@@ -61,7 +61,7 @@ public class HttpClientStatusCodeExceptionTest {
|
|||||||
doReturn(entity).when(response).getEntity();
|
doReturn(entity).when(response).getEntity();
|
||||||
HttpEntity copiedEntity = HttpClientUtils.createEntity(response);
|
HttpEntity copiedEntity = HttpClientUtils.createEntity(response);
|
||||||
HttpClientStatusCodeException ex = new HttpClientStatusCodeException("service",
|
HttpClientStatusCodeException ex = new HttpClientStatusCodeException("service",
|
||||||
response, copiedEntity, new URI("http://service.com"));
|
response, copiedEntity, new URI("https://service.com"));
|
||||||
assertThat(ex.getResponse().getLocale().toString()).isEqualTo("en");
|
assertThat(ex.getResponse().getLocale().toString()).isEqualTo("en");
|
||||||
assertThat(ex.getResponse().getAllHeaders()).isEqualTo(headers);
|
assertThat(ex.getResponse().getAllHeaders()).isEqualTo(headers);
|
||||||
assertThat(ex.getResponse().getStatusLine().getReasonPhrase())
|
assertThat(ex.getResponse().getStatusLine().getReasonPhrase())
|
||||||
|
|||||||
+2
-2
@@ -43,10 +43,10 @@ public class OkHttpStatusCodeExceptionTest {
|
|||||||
.message("Success")
|
.message("Success")
|
||||||
.body(ResponseBody.create(MediaType.parse("text/plain"), "foo"))
|
.body(ResponseBody.create(MediaType.parse("text/plain"), "foo"))
|
||||||
.protocol(Protocol.HTTP_1_1)
|
.protocol(Protocol.HTTP_1_1)
|
||||||
.request(new Request.Builder().url("http://service.com").build()).build();
|
.request(new Request.Builder().url("https://service.com").build()).build();
|
||||||
ResponseBody body = response.peekBody(Integer.MAX_VALUE);
|
ResponseBody body = response.peekBody(Integer.MAX_VALUE);
|
||||||
OkHttpStatusCodeException ex = new OkHttpStatusCodeException("service", response,
|
OkHttpStatusCodeException ex = new OkHttpStatusCodeException("service", response,
|
||||||
body, new URI("http://service.com"));
|
body, new URI("https://service.com"));
|
||||||
assertThat(ex.getResponse().headers()).isEqualTo(headers);
|
assertThat(ex.getResponse().headers()).isEqualTo(headers);
|
||||||
assertThat(ex.getResponse().code()).isEqualTo(200);
|
assertThat(ex.getResponse().code()).isEqualTo(200);
|
||||||
assertThat(ex.getResponse().message()).isEqualTo("Success");
|
assertThat(ex.getResponse().message()).isEqualTo("Success");
|
||||||
|
|||||||
+5
-5
@@ -91,7 +91,7 @@ public class RibbonClientConfigurationTests {
|
|||||||
when(this.inspector.isSecure(server)).thenReturn(true);
|
when(this.inspector.isSecure(server)).thenReturn(true);
|
||||||
|
|
||||||
for (AbstractLoadBalancerAwareClient client : clients()) {
|
for (AbstractLoadBalancerAwareClient client : clients()) {
|
||||||
URI uri = client.reconstructURIWithServer(server, new URI("http://foo/"));
|
URI uri = client.reconstructURIWithServer(server, new URI("https://foo/"));
|
||||||
assertThat(uri).as(getReason(client)).isEqualTo(new URI("https://foo:7777/"));
|
assertThat(uri).as(getReason(client)).isEqualTo(new URI("https://foo:7777/"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -102,8 +102,8 @@ public class RibbonClientConfigurationTests {
|
|||||||
when(this.inspector.isSecure(server)).thenReturn(false);
|
when(this.inspector.isSecure(server)).thenReturn(false);
|
||||||
|
|
||||||
for (AbstractLoadBalancerAwareClient client : clients()) {
|
for (AbstractLoadBalancerAwareClient client : clients()) {
|
||||||
URI uri = client.reconstructURIWithServer(server, new URI("http://foo/"));
|
URI uri = client.reconstructURIWithServer(server, new URI("https://foo/"));
|
||||||
assertThat(uri).as(getReason(client)).isEqualTo(new URI("http://foo:7777/"));
|
assertThat(uri).as(getReason(client)).isEqualTo(new URI("https://foo:7777/"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ public class RibbonClientConfigurationTests {
|
|||||||
|
|
||||||
for (AbstractLoadBalancerAwareClient client : clients()) {
|
for (AbstractLoadBalancerAwareClient client : clients()) {
|
||||||
URI uri = client.reconstructURIWithServer(server,
|
URI uri = client.reconstructURIWithServer(server,
|
||||||
new URI("http://foo/%20bar"));
|
new URI("https://foo/%20bar"));
|
||||||
assertThat(uri).as(getReason(client))
|
assertThat(uri).as(getReason(client))
|
||||||
.isEqualTo(new URI("https://foo:7777/%20bar"));
|
.isEqualTo(new URI("https://foo:7777/%20bar"));
|
||||||
}
|
}
|
||||||
@@ -131,7 +131,7 @@ public class RibbonClientConfigurationTests {
|
|||||||
|
|
||||||
for (AbstractLoadBalancerAwareClient client : clients()) {
|
for (AbstractLoadBalancerAwareClient client : clients()) {
|
||||||
URI uri = client.reconstructURIWithServer(server,
|
URI uri = client.reconstructURIWithServer(server,
|
||||||
new URI("http://foo/%20bar?hello=1+2"));
|
new URI("https://foo/%20bar?hello=1+2"));
|
||||||
assertThat(uri).isEqualTo(new URI("https://foo:7777/%20bar?hello=1%202"));
|
assertThat(uri).isEqualTo(new URI("https://foo:7777/%20bar?hello=1%202"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-8
@@ -82,7 +82,7 @@ public class RibbonClientHttpRequestFactoryTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void vanillaRequestWorks() {
|
public void vanillaRequestWorks() {
|
||||||
ResponseEntity<String> response = this.restTemplate.getForEntity("http://simple/",
|
ResponseEntity<String> response = this.restTemplate.getForEntity("https://simple/",
|
||||||
String.class);
|
String.class);
|
||||||
assertThat(response.getStatusCode()).as("wrong response code")
|
assertThat(response.getStatusCode()).as("wrong response code")
|
||||||
.isEqualTo(HttpStatus.OK);
|
.isEqualTo(HttpStatus.OK);
|
||||||
@@ -92,7 +92,7 @@ public class RibbonClientHttpRequestFactoryTests {
|
|||||||
@Test
|
@Test
|
||||||
public void requestWithPathParamWorks() {
|
public void requestWithPathParamWorks() {
|
||||||
ResponseEntity<String> response = this.restTemplate
|
ResponseEntity<String> response = this.restTemplate
|
||||||
.getForEntity("http://simple/path/{param}", String.class, "world");
|
.getForEntity("https://simple/path/{param}", String.class, "world");
|
||||||
assertThat(response.getStatusCode()).as("wrong response code")
|
assertThat(response.getStatusCode()).as("wrong response code")
|
||||||
.isEqualTo(HttpStatus.OK);
|
.isEqualTo(HttpStatus.OK);
|
||||||
assertThat(response.getBody()).as("wrong response body").isEqualTo("hello world");
|
assertThat(response.getBody()).as("wrong response body").isEqualTo("hello world");
|
||||||
@@ -101,7 +101,7 @@ public class RibbonClientHttpRequestFactoryTests {
|
|||||||
@Test
|
@Test
|
||||||
public void requestWithEncodedPathParamWorks() {
|
public void requestWithEncodedPathParamWorks() {
|
||||||
ResponseEntity<String> response = this.restTemplate.getForEntity(
|
ResponseEntity<String> response = this.restTemplate.getForEntity(
|
||||||
"http://simple/path/{param}", String.class, "world & everyone else");
|
"https://simple/path/{param}", String.class, "world & everyone else");
|
||||||
assertThat(response.getStatusCode()).as("wrong response code")
|
assertThat(response.getStatusCode()).as("wrong response code")
|
||||||
.isEqualTo(HttpStatus.OK);
|
.isEqualTo(HttpStatus.OK);
|
||||||
assertThat(response.getBody()).as("wrong response body")
|
assertThat(response.getBody()).as("wrong response body")
|
||||||
@@ -111,7 +111,7 @@ public class RibbonClientHttpRequestFactoryTests {
|
|||||||
@Test
|
@Test
|
||||||
public void requestWithRequestParamWorks() {
|
public void requestWithRequestParamWorks() {
|
||||||
ResponseEntity<String> response = this.restTemplate.getForEntity(
|
ResponseEntity<String> response = this.restTemplate.getForEntity(
|
||||||
"http://simple/request?param={param}", String.class, "world");
|
"https://simple/request?param={param}", String.class, "world");
|
||||||
assertThat(response.getStatusCode()).as("wrong response code")
|
assertThat(response.getStatusCode()).as("wrong response code")
|
||||||
.isEqualTo(HttpStatus.OK);
|
.isEqualTo(HttpStatus.OK);
|
||||||
assertThat(response.getBody()).as("wrong response body").isEqualTo("hello world");
|
assertThat(response.getBody()).as("wrong response body").isEqualTo("hello world");
|
||||||
@@ -120,7 +120,7 @@ public class RibbonClientHttpRequestFactoryTests {
|
|||||||
@Test
|
@Test
|
||||||
public void requestWithPostWorks() {
|
public void requestWithPostWorks() {
|
||||||
ResponseEntity<String> response = this.restTemplate
|
ResponseEntity<String> response = this.restTemplate
|
||||||
.postForEntity("http://simple/post", "world", String.class);
|
.postForEntity("https://simple/post", "world", String.class);
|
||||||
assertThat(response.getStatusCode()).as("wrong response code")
|
assertThat(response.getStatusCode()).as("wrong response code")
|
||||||
.isEqualTo(HttpStatus.OK);
|
.isEqualTo(HttpStatus.OK);
|
||||||
assertThat(response.getBody()).as("wrong response body").isEqualTo("hello world");
|
assertThat(response.getBody()).as("wrong response body").isEqualTo("hello world");
|
||||||
@@ -129,7 +129,7 @@ public class RibbonClientHttpRequestFactoryTests {
|
|||||||
@Test
|
@Test
|
||||||
public void requestWithEmptyPostWorks() {
|
public void requestWithEmptyPostWorks() {
|
||||||
ResponseEntity<String> response = this.restTemplate
|
ResponseEntity<String> response = this.restTemplate
|
||||||
.postForEntity("http://simple/emptypost", "", String.class);
|
.postForEntity("https://simple/emptypost", "", String.class);
|
||||||
assertThat(response.getStatusCode()).as("wrong response code")
|
assertThat(response.getStatusCode()).as("wrong response code")
|
||||||
.isEqualTo(HttpStatus.OK);
|
.isEqualTo(HttpStatus.OK);
|
||||||
assertThat(response.getBody()).as("wrong response body").isEqualTo("hello empty");
|
assertThat(response.getBody()).as("wrong response body").isEqualTo("hello empty");
|
||||||
@@ -137,7 +137,7 @@ public class RibbonClientHttpRequestFactoryTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void requestWithHeaderWorks() throws Exception {
|
public void requestWithHeaderWorks() throws Exception {
|
||||||
RequestEntity<Void> entity = RequestEntity.get(new URI("http://simple/header"))
|
RequestEntity<Void> entity = RequestEntity.get(new URI("https://simple/header"))
|
||||||
.header("X-Param", "world").build();
|
.header("X-Param", "world").build();
|
||||||
ResponseEntity<String> response = this.restTemplate.exchange(entity,
|
ResponseEntity<String> response = this.restTemplate.exchange(entity,
|
||||||
String.class);
|
String.class);
|
||||||
@@ -150,7 +150,7 @@ public class RibbonClientHttpRequestFactoryTests {
|
|||||||
public void invalidHostNameError() {
|
public void invalidHostNameError() {
|
||||||
this.exceptionRule.expect(ResourceAccessException.class);
|
this.exceptionRule.expect(ResourceAccessException.class);
|
||||||
this.exceptionRule.expectMessage("Invalid hostname");
|
this.exceptionRule.expectMessage("Invalid hostname");
|
||||||
this.restTemplate.getForEntity("http://simple_bad", String.class);
|
this.restTemplate.getForEntity("https://simple_bad", String.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
|
|||||||
+2
-2
@@ -68,7 +68,7 @@ public class RibbonInterceptorTests {
|
|||||||
RibbonServer server = new RibbonServer("myservice", new Server("myhost", 8080));
|
RibbonServer server = new RibbonServer("myservice", new Server("myhost", 8080));
|
||||||
LoadBalancerInterceptor interceptor = new LoadBalancerInterceptor(
|
LoadBalancerInterceptor interceptor = new LoadBalancerInterceptor(
|
||||||
new MyClient(server));
|
new MyClient(server));
|
||||||
given(this.request.getURI()).willReturn(new URL("http://myservice").toURI());
|
given(this.request.getURI()).willReturn(new URL("https://myservice").toURI());
|
||||||
given(this.execution.execute(isA(HttpRequest.class), isA(byte[].class)))
|
given(this.execution.execute(isA(HttpRequest.class), isA(byte[].class)))
|
||||||
.willReturn(this.response);
|
.willReturn(this.response);
|
||||||
ArgumentCaptor<HttpRequestWrapper> argument = ArgumentCaptor
|
ArgumentCaptor<HttpRequestWrapper> argument = ArgumentCaptor
|
||||||
@@ -79,7 +79,7 @@ public class RibbonInterceptorTests {
|
|||||||
verify(this.execution).execute(argument.capture(), isA(byte[].class));
|
verify(this.execution).execute(argument.capture(), isA(byte[].class));
|
||||||
HttpRequestWrapper wrapper = argument.getValue();
|
HttpRequestWrapper wrapper = argument.getValue();
|
||||||
assertThat(wrapper.getURI()).as("wrong constructed uri")
|
assertThat(wrapper.getURI()).as("wrong constructed uri")
|
||||||
.isEqualTo(new URL("http://myhost:8080").toURI());
|
.isEqualTo(new URL("https://myhost:8080").toURI());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static class MyClient implements LoadBalancerClient {
|
protected static class MyClient implements LoadBalancerClient {
|
||||||
|
|||||||
+3
-3
@@ -88,7 +88,7 @@ public class RibbonUtilsTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void uriIsNotChangedWhenServerIsNotSecured() throws URISyntaxException {
|
public void uriIsNotChangedWhenServerIsNotSecured() throws URISyntaxException {
|
||||||
URI original = new URI("http://foo");
|
URI original = new URI("https://foo");
|
||||||
URI updated = updateToSecureConnectionIfNeeded(original, NON_SECURE_CONFIG,
|
URI updated = updateToSecureConnectionIfNeeded(original, NON_SECURE_CONFIG,
|
||||||
NON_SECURE_INTROSPECTOR, SERVER);
|
NON_SECURE_INTROSPECTOR, SERVER);
|
||||||
assertThat(original)
|
assertThat(original)
|
||||||
@@ -110,7 +110,7 @@ public class RibbonUtilsTests {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldUpgradeUriToHttpsWhenServerIsSecureAndUriNotInHttps()
|
public void shouldUpgradeUriToHttpsWhenServerIsSecureAndUriNotInHttps()
|
||||||
throws URISyntaxException {
|
throws URISyntaxException {
|
||||||
URI original = new URI("http://foo");
|
URI original = new URI("https://foo");
|
||||||
URI updated = updateToSecureConnectionIfNeeded(original, SECURE_CONFIG,
|
URI updated = updateToSecureConnectionIfNeeded(original, SECURE_CONFIG,
|
||||||
SECURE_INTROSPECTOR, SERVER);
|
SECURE_INTROSPECTOR, SERVER);
|
||||||
assertThat(updated).as("URI should have been updated to https.")
|
assertThat(updated).as("URI should have been updated to https.")
|
||||||
@@ -129,7 +129,7 @@ public class RibbonUtilsTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void shouldSubstitutePlusInQueryParam() throws URISyntaxException {
|
public void shouldSubstitutePlusInQueryParam() throws URISyntaxException {
|
||||||
URI original = new URI("http://foo/%20bar?hello=1+2");
|
URI original = new URI("https://foo/%20bar?hello=1+2");
|
||||||
URI updated = updateToSecureConnectionIfNeeded(original, SECURE_CONFIG,
|
URI updated = updateToSecureConnectionIfNeeded(original, SECURE_CONFIG,
|
||||||
SECURE_INTROSPECTOR, SERVER);
|
SECURE_INTROSPECTOR, SERVER);
|
||||||
assertThat(updated)
|
assertThat(updated)
|
||||||
|
|||||||
+2
-2
@@ -44,7 +44,7 @@ public class RibbonApacheHttpRequestTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNullEntity() throws Exception {
|
public void testNullEntity() throws Exception {
|
||||||
String uri = "http://example.com";
|
String uri = "https://example.com";
|
||||||
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
headers.add("my-header", "my-value");
|
headers.add("my-header", "my-value");
|
||||||
headers.add("content-length", "5192");
|
headers.add("content-length", "5192");
|
||||||
@@ -90,7 +90,7 @@ public class RibbonApacheHttpRequestTests {
|
|||||||
boolean addContentLengthHeader, String method) throws IOException {
|
boolean addContentLengthHeader, String method) throws IOException {
|
||||||
String lengthString = String.valueOf(entityValue.length());
|
String lengthString = String.valueOf(entityValue.length());
|
||||||
Long length = null;
|
Long length = null;
|
||||||
URI uri = URI.create("http://example.com");
|
URI uri = URI.create("https://example.com");
|
||||||
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
if (addContentLengthHeader) {
|
if (addContentLengthHeader) {
|
||||||
headers.add("Content-Length", lengthString);
|
headers.add("Content-Length", lengthString);
|
||||||
|
|||||||
+2
-2
@@ -41,7 +41,7 @@ public class RibbonApacheHttpResponseTests {
|
|||||||
given(response.getStatusLine()).willReturn(statusLine);
|
given(response.getStatusLine()).willReturn(statusLine);
|
||||||
|
|
||||||
RibbonApacheHttpResponse httpResponse = new RibbonApacheHttpResponse(response,
|
RibbonApacheHttpResponse httpResponse = new RibbonApacheHttpResponse(response,
|
||||||
URI.create("http://example.com"));
|
URI.create("https://example.com"));
|
||||||
|
|
||||||
assertThat(httpResponse.isSuccess()).isTrue();
|
assertThat(httpResponse.isSuccess()).isTrue();
|
||||||
assertThat(httpResponse.hasPayload()).isFalse();
|
assertThat(httpResponse.hasPayload()).isFalse();
|
||||||
@@ -60,7 +60,7 @@ public class RibbonApacheHttpResponseTests {
|
|||||||
given(response.getEntity()).willReturn(entity);
|
given(response.getEntity()).willReturn(entity);
|
||||||
|
|
||||||
RibbonApacheHttpResponse httpResponse = new RibbonApacheHttpResponse(response,
|
RibbonApacheHttpResponse httpResponse = new RibbonApacheHttpResponse(response,
|
||||||
URI.create("http://example.com"));
|
URI.create("https://example.com"));
|
||||||
|
|
||||||
assertThat(httpResponse.isSuccess()).isTrue();
|
assertThat(httpResponse.isSuccess()).isTrue();
|
||||||
assertThat(httpResponse.hasPayload()).isTrue();
|
assertThat(httpResponse.hasPayload()).isTrue();
|
||||||
|
|||||||
+2
-2
@@ -39,7 +39,7 @@ public class OkHttpRibbonRequestTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNullEntity() throws Exception {
|
public void testNullEntity() throws Exception {
|
||||||
String uri = "http://example.com";
|
String uri = "https://example.com";
|
||||||
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
headers.add("my-header", "my-value");
|
headers.add("my-header", "my-value");
|
||||||
// headers.add(HttpEncoding.CONTENT_LENGTH, "5192");
|
// headers.add(HttpEncoding.CONTENT_LENGTH, "5192");
|
||||||
@@ -79,7 +79,7 @@ public class OkHttpRibbonRequestTests {
|
|||||||
boolean addContentLengthHeader, String method) throws IOException {
|
boolean addContentLengthHeader, String method) throws IOException {
|
||||||
String lengthString = String.valueOf(entityValue.length());
|
String lengthString = String.valueOf(entityValue.length());
|
||||||
Long length = null;
|
Long length = null;
|
||||||
String uri = "http://example.com";
|
String uri = "https://example.com";
|
||||||
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
if (addContentLengthHeader) {
|
if (addContentLengthHeader) {
|
||||||
headers.add("Content-Length", lengthString);
|
headers.add("Content-Length", lengthString);
|
||||||
|
|||||||
+2
-2
@@ -37,7 +37,7 @@ public class OkHttpRibbonResponseTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNullEntity() throws Exception {
|
public void testNullEntity() throws Exception {
|
||||||
URI uri = URI.create("http://example.com");
|
URI uri = URI.create("https://example.com");
|
||||||
Response response = response(uri).build();
|
Response response = response(uri).build();
|
||||||
|
|
||||||
OkHttpRibbonResponse httpResponse = new OkHttpRibbonResponse(response, uri);
|
OkHttpRibbonResponse httpResponse = new OkHttpRibbonResponse(response, uri);
|
||||||
@@ -50,7 +50,7 @@ public class OkHttpRibbonResponseTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNotNullEntity() throws Exception {
|
public void testNotNullEntity() throws Exception {
|
||||||
URI uri = URI.create("http://example.com");
|
URI uri = URI.create("https://example.com");
|
||||||
Response response = response(uri)
|
Response response = response(uri)
|
||||||
.body(ResponseBody.create(MediaType.parse("text/plain"), "abcd")).build();
|
.body(ResponseBody.create(MediaType.parse("text/plain"), "abcd")).build();
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -51,7 +51,7 @@ public class ContextAwareRequestTests {
|
|||||||
headers.put("header2", Arrays.asList("value1", "value2"));
|
headers.put("header2", Arrays.asList("value1", "value2"));
|
||||||
headers.put("header3", Arrays.asList("value1"));
|
headers.put("header3", Arrays.asList("value1"));
|
||||||
doReturn(headers).when(context).getHeaders();
|
doReturn(headers).when(context).getHeaders();
|
||||||
doReturn(new URI("http://foo")).when(context).uri();
|
doReturn(new URI("https://foo")).when(context).uri();
|
||||||
doReturn("foo").when(context).getServiceId();
|
doReturn("foo").when(context).getServiceId();
|
||||||
doReturn(new LinkedMultiValueMap<>()).when(context).getParams();
|
doReturn(new LinkedMultiValueMap<>()).when(context).getParams();
|
||||||
doReturn("testLoadBalancerKey").when(context).getLoadBalancerKey();
|
doReturn("testLoadBalancerKey").when(context).getLoadBalancerKey();
|
||||||
@@ -76,7 +76,7 @@ public class ContextAwareRequestTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getURI() throws Exception {
|
public void getURI() throws Exception {
|
||||||
assertThat(request.getURI()).isEqualTo(new URI("http://foo"));
|
assertThat(request.getURI()).isEqualTo(new URI("https://foo"));
|
||||||
|
|
||||||
RibbonCommandContext badUriContext = mock(RibbonCommandContext.class);
|
RibbonCommandContext badUriContext = mock(RibbonCommandContext.class);
|
||||||
doReturn(new LinkedMultiValueMap()).when(badUriContext).getHeaders();
|
doReturn(new LinkedMultiValueMap()).when(badUriContext).getHeaders();
|
||||||
|
|||||||
+4
-4
@@ -124,9 +124,9 @@ public class SidecarApplicationTests {
|
|||||||
EurekaInstanceConfigBean config;
|
EurekaInstanceConfigBean config;
|
||||||
|
|
||||||
public void testStatusAndHealthCheckUrls() {
|
public void testStatusAndHealthCheckUrls() {
|
||||||
assertThat(config.getStatusPageUrl()).isEqualTo("http://mhhost2:0/foo/info");
|
assertThat(config.getStatusPageUrl()).isEqualTo("https://mhhost2:0/foo/info");
|
||||||
assertThat(config.getHealthCheckUrl())
|
assertThat(config.getHealthCheckUrl())
|
||||||
.isEqualTo("http://mhhost2:0/foo/health");
|
.isEqualTo("https://mhhost2:0/foo/health");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -144,9 +144,9 @@ public class SidecarApplicationTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStatusAndHealthCheckUrls() {
|
public void testStatusAndHealthCheckUrls() {
|
||||||
assertThat(config.getStatusPageUrl()).isEqualTo("http://mhhost2:0/foo/info");
|
assertThat(config.getStatusPageUrl()).isEqualTo("https://mhhost2:0/foo/info");
|
||||||
assertThat(config.getHealthCheckUrl())
|
assertThat(config.getHealthCheckUrl())
|
||||||
.isEqualTo("http://mhhost2:0/foo/health");
|
.isEqualTo("https://mhhost2:0/foo/health");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ eureka:
|
|||||||
app-group-name: mysidecargroup
|
app-group-name: mysidecargroup
|
||||||
client:
|
client:
|
||||||
serviceUrl:
|
serviceUrl:
|
||||||
defaultZone: http://user:password@localhost:8761/eureka/
|
defaultZone: https://user:password@localhost:8761/eureka/
|
||||||
|
|
||||||
ribbon:
|
ribbon:
|
||||||
ServerListRefreshInterval: 5000
|
ServerListRefreshInterval: 5000
|
||||||
|
|||||||
+2
-2
@@ -46,10 +46,10 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||||||
public class TurbineHttpTests {
|
public class TurbineHttpTests {
|
||||||
|
|
||||||
private static final ClusterInformation foo = new ClusterInformation("foo",
|
private static final ClusterInformation foo = new ClusterInformation("foo",
|
||||||
"http://foo");
|
"https://foo");
|
||||||
|
|
||||||
private static final ClusterInformation bar = new ClusterInformation("bar",
|
private static final ClusterInformation bar = new ClusterInformation("bar",
|
||||||
"http://bar");
|
"https://bar");
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
TestRestTemplate rest;
|
TestRestTemplate rest;
|
||||||
|
|||||||
+3
-3
@@ -99,7 +99,7 @@ public class ZuulProxyApplicationTests {
|
|||||||
@Test
|
@Test
|
||||||
public void preflightRequestSucceedsForGetRequest() {
|
public void preflightRequestSucceedsForGetRequest() {
|
||||||
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
headers.put("Origin", singletonList("http://hello.com"));
|
headers.put("Origin", singletonList("https://hello.com"));
|
||||||
headers.put("Access-Control-Request-Method", singletonList("GET"));
|
headers.put("Access-Control-Request-Method", singletonList("GET"));
|
||||||
ResponseEntity<Void> result = testRestTemplate.exchange(url(), HttpMethod.OPTIONS,
|
ResponseEntity<Void> result = testRestTemplate.exchange(url(), HttpMethod.OPTIONS,
|
||||||
new HttpEntity<>(headers), Void.class);
|
new HttpEntity<>(headers), Void.class);
|
||||||
@@ -110,7 +110,7 @@ public class ZuulProxyApplicationTests {
|
|||||||
@Test
|
@Test
|
||||||
public void preflightRequestIsForbiddenForUnsupportedMethod() {
|
public void preflightRequestIsForbiddenForUnsupportedMethod() {
|
||||||
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
headers.put("Origin", singletonList("http://hello.com"));
|
headers.put("Origin", singletonList("https://hello.com"));
|
||||||
headers.put("Access-Control-Request-Method", singletonList("PUT"));
|
headers.put("Access-Control-Request-Method", singletonList("PUT"));
|
||||||
ResponseEntity<Void> result = testRestTemplate.exchange(url(), HttpMethod.OPTIONS,
|
ResponseEntity<Void> result = testRestTemplate.exchange(url(), HttpMethod.OPTIONS,
|
||||||
new HttpEntity<>(headers), Void.class);
|
new HttpEntity<>(headers), Void.class);
|
||||||
@@ -166,7 +166,7 @@ public class ZuulProxyApplicationTests {
|
|||||||
return new WebMvcConfigurer() {
|
return new WebMvcConfigurer() {
|
||||||
public void addCorsMappings(CorsRegistry registry) {
|
public void addCorsMappings(CorsRegistry registry) {
|
||||||
registry.addMapping("/simplezpat/**")
|
registry.addMapping("/simplezpat/**")
|
||||||
.allowedOrigins("http://hello.com")
|
.allowedOrigins("https://hello.com")
|
||||||
.allowedMethods("GET", "POST")
|
.allowedMethods("GET", "POST")
|
||||||
.allowedHeaders("Authorization");
|
.allowedHeaders("Authorization");
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -81,7 +81,7 @@ public class ProxyRequestHelperTests {
|
|||||||
|
|
||||||
MultiValueMap<String, String> headers = helper.buildZuulRequestHeaders(request);
|
MultiValueMap<String, String> headers = helper.buildZuulRequestHeaders(request);
|
||||||
|
|
||||||
helper.debug("POST", "http://example.com", headers, new LinkedMultiValueMap<>(),
|
helper.debug("POST", "https://example.com", headers, new LinkedMultiValueMap<>(),
|
||||||
request.getInputStream());
|
request.getInputStream());
|
||||||
HttpTrace actual = this.traceRepository.findAll().get(0);
|
HttpTrace actual = this.traceRepository.findAll().get(0);
|
||||||
Assertions.assertThat(actual.getRequest().getHeaders()).containsKeys("singleName",
|
Assertions.assertThat(actual.getRequest().getHeaders()).containsKeys("singleName",
|
||||||
|
|||||||
+3
-3
@@ -523,7 +523,7 @@ public class DiscoveryClientRouteLocatorTests {
|
|||||||
@Test
|
@Test
|
||||||
public void testIgnoredRouteIncludedIfConfiguredAndNotDiscovered() {
|
public void testIgnoredRouteIncludedIfConfiguredAndNotDiscovered() {
|
||||||
this.properties.getRoutes().put("foo",
|
this.properties.getRoutes().put("foo",
|
||||||
new ZuulRoute("/foo/**", "http://foo.com"));
|
new ZuulRoute("/foo/**", "http://www.foo.com/"));
|
||||||
DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/",
|
DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/",
|
||||||
this.discovery, this.properties);
|
this.discovery, this.properties);
|
||||||
this.properties.setIgnoredServices(Collections.singleton("*"));
|
this.properties.setIgnoredServices(Collections.singleton("*"));
|
||||||
@@ -548,7 +548,7 @@ public class DiscoveryClientRouteLocatorTests {
|
|||||||
@Test
|
@Test
|
||||||
public void testAutoRoutesCanBeOverridden() {
|
public void testAutoRoutesCanBeOverridden() {
|
||||||
ZuulRoute route = new ZuulRoute("/" + MYSERVICE + "/**",
|
ZuulRoute route = new ZuulRoute("/" + MYSERVICE + "/**",
|
||||||
"http://example.com/" + MYSERVICE);
|
"https://example.com/" + MYSERVICE);
|
||||||
this.properties.getRoutes().put(MYSERVICE, route);
|
this.properties.getRoutes().put(MYSERVICE, route);
|
||||||
DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/",
|
DiscoveryClientRouteLocator routeLocator = new DiscoveryClientRouteLocator("/",
|
||||||
this.discovery, this.properties);
|
this.discovery, this.properties);
|
||||||
@@ -557,7 +557,7 @@ public class DiscoveryClientRouteLocatorTests {
|
|||||||
List<Route> routesMap = routeLocator.getRoutes();
|
List<Route> routesMap = routeLocator.getRoutes();
|
||||||
assertThat(routesMap).as("routesMap was null").isNotNull();
|
assertThat(routesMap).as("routesMap was null").isNotNull();
|
||||||
assertThat(routesMap.isEmpty()).as("routesMap was empty").isFalse();
|
assertThat(routesMap.isEmpty()).as("routesMap was empty").isFalse();
|
||||||
assertMapping(routesMap, "http://example.com/" + MYSERVICE, MYSERVICE);
|
assertMapping(routesMap, "https://example.com/" + MYSERVICE, MYSERVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
+3
-3
@@ -55,7 +55,7 @@ public class RestClientRibbonCommandTests {
|
|||||||
@Test
|
@Test
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public void testNullEntityWithOldConstruct() throws Exception {
|
public void testNullEntityWithOldConstruct() throws Exception {
|
||||||
String uri = "http://example.com";
|
String uri = "https://example.com";
|
||||||
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
headers.add("my-header", "my-value");
|
headers.add("my-header", "my-value");
|
||||||
LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
||||||
@@ -85,7 +85,7 @@ public class RestClientRibbonCommandTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNullEntity() throws Exception {
|
public void testNullEntity() throws Exception {
|
||||||
String uri = "http://example.com";
|
String uri = "https://example.com";
|
||||||
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
headers.add("my-header", "my-value");
|
headers.add("my-header", "my-value");
|
||||||
LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
LinkedMultiValueMap<String, String> params = new LinkedMultiValueMap<>();
|
||||||
@@ -131,7 +131,7 @@ public class RestClientRibbonCommandTests {
|
|||||||
boolean addContentLengthHeader, String method) throws Exception {
|
boolean addContentLengthHeader, String method) throws Exception {
|
||||||
String lengthString = String.valueOf(entityValue.length());
|
String lengthString = String.valueOf(entityValue.length());
|
||||||
Long length = null;
|
Long length = null;
|
||||||
URI uri = URI.create("http://example.com");
|
URI uri = URI.create("https://example.com");
|
||||||
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
LinkedMultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
|
||||||
if (addContentLengthHeader) {
|
if (addContentLengthHeader) {
|
||||||
headers.add("Content-Length", lengthString);
|
headers.add("Content-Length", lengthString);
|
||||||
|
|||||||
Reference in New Issue
Block a user