Skip to content
This repository has been archived by the owner on May 20, 2021. It is now read-only.

Commit

Permalink
Disable GZIP content encoding on SSE output only (vs globally)
Browse files Browse the repository at this point in the history
  • Loading branch information
Greg Wittel committed Aug 22, 2016
1 parent ee7de6e commit 5c5dda3
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
6 changes: 0 additions & 6 deletions reference.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,6 @@ logging:

# HTTP-specific options.
server:
# Must disable gzip as Jersey/gzip will buffer SSE events rather than send them to clients immediately
# Future: Integrate changes via enabling 'syncFlush' fix
# from https://github.com/dropwizard/dropwizard/issues/1673
gzip:
enabled: false

applicationConnectors:
- type: http
port: 8081
Expand Down
29 changes: 20 additions & 9 deletions src/main/java/com/airbnb/airpal/AirpalApplicationBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import com.airbnb.airpal.core.AirpalUserFactory;
import com.airbnb.airpal.core.health.PrestoHealthCheck;
import com.airbnb.airpal.modules.AirpalModule;
import com.airbnb.airpal.modules.DropwizardModule;
import com.airbnb.airpal.resources.ExecuteResource;
import com.airbnb.airpal.resources.FilesResource;
import com.airbnb.airpal.resources.HealthResource;
Expand All @@ -22,25 +20,29 @@
import com.google.inject.Injector;
import com.google.inject.Stage;
import io.dropwizard.Application;
import io.dropwizard.assets.AssetsBundle;
import io.dropwizard.Bundle;
import io.dropwizard.ConfiguredBundle;
import io.dropwizard.assets.AssetsBundle;
import io.dropwizard.db.DataSourceFactory;
import io.dropwizard.flyway.FlywayBundle;
import io.dropwizard.flyway.FlywayFactory;
import io.dropwizard.jetty.BiDiGzipHandler;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import io.dropwizard.views.ViewBundle;

import java.util.Arrays;
import java.util.Collections;
import org.eclipse.jetty.server.Handler;

import javax.servlet.ServletRegistration;

import java.util.Arrays;

import static org.glassfish.jersey.message.MessageProperties.IO_BUFFER_SIZE;

public abstract class AirpalApplicationBase<T extends AirpalConfiguration> extends Application<T>
public abstract class AirpalApplicationBase<T extends AirpalConfiguration>
extends Application<T>
{
private static final String SERVER_SENT_EVENTS = "text/event-stream";

protected Injector injector;

@Override
Expand All @@ -65,7 +67,8 @@ public Iterable<Bundle> getBundles()
{
return Arrays.asList(
new AssetsBundle("/assets", "/app", "index.html"),
new FlywayBundle<T>() {
new FlywayBundle<T>()
{
@Override
public DataSourceFactory getDataSourceFactory(T configuration)
{
Expand All @@ -81,7 +84,8 @@ public FlywayFactory getFlywayFactory(T configuration)
}

@Override
public void run(T config, Environment environment) throws Exception
public void run(T config, Environment environment)
throws Exception
{
this.injector = Guice.createInjector(Stage.PRODUCTION, getModules(config, environment));

Expand Down Expand Up @@ -109,5 +113,12 @@ public void run(T config, Environment environment) throws Exception
.addServlet("updates", injector.getInstance(SSEEventSourceServlet.class));
sseServlet.setAsyncSupported(true);
sseServlet.addMapping("/api/updates/subscribe");

// Disable GZIP content encoding for SSE endpoints
environment.lifecycle().addServerLifecycleListener(server -> {
for (Handler handler : server.getChildHandlersByClass(BiDiGzipHandler.class)) {
((BiDiGzipHandler) handler).addExcludedMimeTypes(SERVER_SENT_EVENTS);
}
});
}
}

0 comments on commit 5c5dda3

Please sign in to comment.