View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.websocket.servlet;
20  
21  import java.io.IOException;
22  import java.util.List;
23  import java.util.Map;
24  import javax.servlet.http.HttpServletResponse;
25  
26  import org.eclipse.jetty.websocket.api.UpgradeResponse;
27  import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
28  
29  /**
30   * Servlet Specific UpgradeResponse implementation.
31   */
32  public class ServletUpgradeResponse extends UpgradeResponse
33  {
34      private HttpServletResponse response;
35      private boolean extensionsNegotiated = false;
36      private boolean subprotocolNegotiated = false;
37  
38      public ServletUpgradeResponse(HttpServletResponse response)
39      {
40          this.response = response;
41      }
42  
43      @Override
44      public int getStatusCode()
45      {
46          return response.getStatus();
47      }
48  
49      public void setStatus(int status)
50      {
51          response.setStatus(status);
52      }
53  
54      @Override
55      public String getStatusReason()
56      {
57          throw new UnsupportedOperationException("Server cannot get Status Reason Message");
58      }
59  
60      public boolean isCommitted()
61      {
62          return response.isCommitted();
63      }
64  
65      public boolean isExtensionsNegotiated()
66      {
67          return extensionsNegotiated;
68      }
69  
70      public boolean isSubprotocolNegotiated()
71      {
72          return subprotocolNegotiated;
73      }
74  
75      public void sendError(int statusCode, String message) throws IOException
76      {
77          setSuccess(false);
78          commitHeaders();
79          response.sendError(statusCode, message);
80          response = null;
81      }
82  
83      @Override
84      public void sendForbidden(String message) throws IOException
85      {
86          setSuccess(false);
87          commitHeaders();
88          response.sendError(HttpServletResponse.SC_FORBIDDEN, message);
89          response = null;
90      }
91  
92      @Override
93      public void setAcceptedSubProtocol(String protocol)
94      {
95          super.setAcceptedSubProtocol(protocol);
96          subprotocolNegotiated = true;
97      }
98  
99      @Override
100     public void setExtensions(List<ExtensionConfig> extensions)
101     {
102         super.setExtensions(extensions);
103         extensionsNegotiated = true;
104     }
105 
106     public void complete()
107     {
108         commitHeaders();
109         response = null;
110     }
111 
112     private void commitHeaders()
113     {
114         // Transfer all headers to the real HTTP response
115         for (Map.Entry<String, List<String>> entry : getHeaders().entrySet())
116         {
117             for (String value : entry.getValue())
118             {
119                 response.addHeader(entry.getKey(), value);
120             }
121         }
122     }
123 }