Changeset 773:bf439ae8d130


Ignore:
Timestamp:
01/15/12 02:36:22 (4 months ago)
Author:
xeraph
Branch:
default
Message:

fixed and implemented more servlet request methods

Location:
kraken-httpd/src/main/java/org/krakenapps/httpd/impl
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kraken-httpd/src/main/java/org/krakenapps/httpd/impl/Request.java

    r772 r773  
    2525import java.nio.charset.Charset; 
    2626import java.security.Principal; 
     27import java.util.ArrayList; 
    2728import java.util.Collection; 
    2829import java.util.Collections; 
     
    3334import java.util.Map; 
    3435 
     36import javax.net.ssl.SSLPeerUnverifiedException; 
     37import javax.net.ssl.SSLSession; 
    3538import javax.servlet.AsyncContext; 
    3639import javax.servlet.DispatcherType; 
     
    5255import org.jboss.netty.handler.codec.http.HttpMethod; 
    5356import org.jboss.netty.handler.codec.http.HttpRequest; 
     57import org.jboss.netty.handler.ssl.SslHandler; 
    5458import org.slf4j.Logger; 
    5559import org.slf4j.LoggerFactory; 
     
    5761@SuppressWarnings("rawtypes") 
    5862public class Request implements HttpServletRequest { 
     63        private final String contextPath = ""; 
    5964        private ChannelHandlerContext ctx; 
     65        private boolean secure; 
    6066        private HttpRequest req; 
    6167        private String servletPath; 
     
    6470        private ServletInputStream is; 
    6571        private Map<String, Object> attributes = new HashMap<String, Object>(); 
    66         private Map<String, String> parameters = new HashMap<String, String>(); 
     72        private Map<String, List<String>> parameters = new HashMap<String, List<String>>(); 
    6773        private Cookie[] cookies; 
     74        private List<Locale> locales = new ArrayList<Locale>(); 
    6875        private Logger logger = LoggerFactory.getLogger(this.getClass().getName()); 
    6976 
     
    7481                this.pathInfo = pathInfo; 
    7582                this.queryString = ""; 
     83 
     84                SslHandler sslHandler = (SslHandler) ctx.getPipeline().get("ssl"); 
     85                this.secure = sslHandler != null; 
     86                if (secure) { 
     87                        SSLSession session = sslHandler.getEngine().getSession(); 
     88                        String cipherSuite = session.getCipherSuite(); 
     89                        try { 
     90                                setAttribute("javax.servlet.request.X509Certificate", session.getPeerCertificateChain()); 
     91                        } catch (SSLPeerUnverifiedException e) { 
     92                        } 
     93 
     94                        setAttribute("javax.servlet.request.cipher_suite", cipherSuite); 
     95                        setAttribute("javax.servlet.request.key_size", deduceKeyLength(cipherSuite)); 
     96                } 
    7697 
    7798                ChannelBuffer content = req.getContent(); 
     
    111132                } 
    112133 
     134                List<String> langs = req.getHeaders(HttpHeaders.Names.ACCEPT_LANGUAGE); 
     135                if (langs != null) 
     136                        for (String lang : langs) 
     137                                locales.add(new Locale(lang)); 
     138 
     139                // see servlet spec section 3.9 
     140                if (langs.size() == 0) 
     141                        locales.add(Locale.getDefault()); 
     142 
    113143                setAttribute("netty.channel", ctx.getChannel()); 
     144        } 
     145 
     146        private int deduceKeyLength(String cipherSuite) { 
     147                if (cipherSuite.equals("IDEA_CBC")) 
     148                        return 128; 
     149                if (cipherSuite.equals("RC2_CBC_40")) 
     150                        return 40; 
     151                if (cipherSuite.equals("RC4_40")) 
     152                        return 40; 
     153                if (cipherSuite.equals("RC4_128")) 
     154                        return 128; 
     155                if (cipherSuite.equals("DES40_CBC")) 
     156                        return 40; 
     157                if (cipherSuite.equals("DES_CBC")) 
     158                        return 56; 
     159                if (cipherSuite.equals("3DES_EDE_CBC")) 
     160                        return 168; 
     161                return 0; 
    114162        } 
    115163 
     
    127175                                        value = null; 
    128176 
    129                                 parameters.put(name, value); 
     177                                List<String> values = new ArrayList<String>(); 
     178                                if (!parameters.containsKey(name)) 
     179                                        parameters.put(name, values); 
     180                                else 
     181                                        values = parameters.get(name); 
     182 
     183                                values.add(value); 
    130184                                logger.trace("kraken webconsole: param name [{}], value [{}]", name, value); 
    131185                        } else { 
     
    150204 
    151205        @Override 
     206        public boolean isSecure() { 
     207                return secure; 
     208        } 
     209 
     210        // TODO: parse should be deferred for character encoding support 
     211        @Override 
     212        public void setCharacterEncoding(String env) throws UnsupportedEncodingException { 
     213        } 
     214 
     215        @Override 
    152216        public Object getAttribute(String name) { 
    153217                return attributes.get(name); 
    154218        } 
    155219 
     220        @SuppressWarnings("unchecked") 
    156221        @Override 
    157222        public Enumeration getAttributeNames() { 
    158223                return Collections.enumeration(attributes.keySet()); 
     224        } 
     225 
     226        @Override 
     227        public void setAttribute(String name, Object o) { 
     228                attributes.put(name, o); 
     229        } 
     230 
     231        @Override 
     232        public void removeAttribute(String name) { 
     233                attributes.remove(name); 
    159234        } 
    160235 
     
    188263        @Override 
    189264        public String getParameter(String name) { 
    190                 return parameters.get(name); 
    191         } 
    192  
     265                String[] values = getParameterValues(name); 
     266                if (values == null || values.length == 0) 
     267                        return null; 
     268                return values[0]; 
     269        } 
     270 
     271        @Override 
     272        public Map<String, String[]> getParameterMap() { 
     273                Map<String, String[]> m = new HashMap<String, String[]>(); 
     274                for (String key : parameters.keySet()) 
     275                        m.put(key, (String[]) parameters.get(key).toArray()); 
     276                return m; 
     277        } 
     278 
     279        @SuppressWarnings("unchecked") 
    193280        @Override 
    194281        public Enumeration getParameterNames() { 
     
    198285        @Override 
    199286        public String[] getParameterValues(String name) { 
    200                 return (String[]) parameters.values().toArray(); 
     287                List<String> values = parameters.get(name); 
     288                if (values == null) 
     289                        return null; 
     290 
     291                return (String[]) values.toArray(); 
    201292        } 
    202293 
     
    215306        public String getRealPath(String path) { 
    216307                return null; 
     308        } 
     309 
     310        @Override 
     311        public String getLocalName() { 
     312                return null; 
     313        } 
     314 
     315        @Override 
     316        public String getLocalAddr() { 
     317                return ((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().getHostAddress(); 
     318        } 
     319 
     320        @Override 
     321        public int getLocalPort() { 
     322                return ((InetSocketAddress) ctx.getChannel().getLocalAddress()).getPort(); 
    217323        } 
    218324 
     
    258364 
    259365        @Override 
    260         public void setAttribute(String name, Object o) { 
    261                 attributes.put(name, o); 
    262         } 
    263  
    264         @Override 
    265366        public String getAuthType() { 
    266367                String auth = req.getHeader(HttpHeaders.Names.AUTHORIZATION); 
     
    275376        } 
    276377 
     378        @SuppressWarnings("unchecked") 
     379        @Override 
     380        public Enumeration getHeaderNames() { 
     381                return Collections.enumeration(req.getHeaderNames()); 
     382        } 
     383 
     384        @Override 
     385        public String getHeader(String name) { 
     386                return req.getHeader(name); 
     387        } 
     388 
     389        @Override 
     390        public Enumeration<String> getHeaders(String name) { 
     391                return Collections.enumeration(req.getHeaders(name)); 
     392        } 
     393 
    277394        @Override 
    278395        public long getDateHeader(String name) { 
    279396                try { 
    280                         long value = Long.parseLong(req.getHeader(name)); 
    281                         return value; 
     397                        return Long.parseLong(req.getHeader(name)); 
    282398                } catch (NumberFormatException e) { 
    283                         return -1; 
    284                 } 
    285         } 
    286  
    287         @Override 
    288         public String getHeader(String name) { 
    289                 return req.getHeader(name); 
    290         } 
    291  
    292         @Override 
    293         public Enumeration getHeaderNames() { 
    294                 return Collections.enumeration(req.getHeaderNames()); 
     399                        throw new IllegalArgumentException(e); 
     400                } 
    295401        } 
    296402 
     
    306412 
    307413        @Override 
     414        public String getQueryString() { 
     415                return queryString; 
     416        } 
     417 
     418        @Override 
     419        public String getRemoteUser() { 
     420                return null; 
     421        } 
     422 
     423        @Override 
     424        public String getRequestURI() { 
     425                return contextPath + servletPath + pathInfo; 
     426        } 
     427 
     428        @Override 
     429        public String getRequestedSessionId() { 
     430                // TODO Auto-generated method stub 
     431                return null; 
     432        } 
     433 
     434        @Override 
     435        public String getContextPath() { 
     436                return contextPath; 
     437        } 
     438 
     439        @Override 
     440        public String getServletPath() { 
     441                return servletPath; 
     442        } 
     443 
     444        @Override 
    308445        public String getPathInfo() { 
    309446                return pathInfo; 
     
    316453        @Override 
    317454        public String getPathTranslated() { 
    318                 // TODO Auto-generated method stub 
    319                 return null; 
    320         } 
    321  
    322         @Override 
    323         public String getQueryString() { 
    324                 return queryString; 
    325         } 
    326  
    327         @Override 
    328         public String getRemoteUser() { 
    329                 return null; 
    330         } 
    331  
    332         @Override 
    333         public String getRequestURI() { 
    334                 return servletPath + pathInfo; 
    335         } 
    336  
    337         @Override 
    338         public String getRequestedSessionId() { 
    339                 // TODO Auto-generated method stub 
    340                 return null; 
    341         } 
    342  
    343         @Override 
    344         public String getServletPath() { 
    345                 return servletPath; 
     455                // it must return null if local file system path cannot be determined 
     456                return null; 
     457        } 
     458 
     459        @Override 
     460        public Enumeration<Locale> getLocales() { 
     461                return Collections.enumeration(locales); 
     462        } 
     463 
     464        @Override 
     465        public Locale getLocale() { 
     466                return locales.get(0); 
    346467        } 
    347468 
     
    381502 
    382503        @Override 
    383         public void setCharacterEncoding(String env) throws UnsupportedEncodingException { 
    384                 // TODO Auto-generated method stub 
    385  
    386         } 
    387  
    388         @Override 
    389         public Map<String, String[]> getParameterMap() { 
    390                 // TODO Auto-generated method stub 
    391                 return null; 
    392         } 
    393  
    394         @Override 
    395         public void removeAttribute(String name) { 
    396                 // TODO Auto-generated method stub 
    397  
    398         } 
    399  
    400         @Override 
    401         public Locale getLocale() { 
    402                 // TODO Auto-generated method stub 
    403                 return null; 
    404         } 
    405  
    406         @Override 
    407         public Enumeration<Locale> getLocales() { 
    408                 // TODO Auto-generated method stub 
    409                 return null; 
    410         } 
    411  
    412         @Override 
    413         public boolean isSecure() { 
    414                 // TODO Auto-generated method stub 
    415                 return false; 
    416         } 
    417  
    418         @Override 
    419504        public RequestDispatcher getRequestDispatcher(String path) { 
    420505                // TODO Auto-generated method stub 
     
    423508 
    424509        @Override 
    425         public String getLocalName() { 
    426                 // TODO Auto-generated method stub 
    427                 return null; 
    428         } 
    429  
    430         @Override 
    431         public String getLocalAddr() { 
    432                 // TODO Auto-generated method stub 
    433                 return null; 
    434         } 
    435  
    436         @Override 
    437         public int getLocalPort() { 
    438                 // TODO Auto-generated method stub 
    439                 return 0; 
    440         } 
    441  
    442         @Override 
    443510        public ServletContext getServletContext() { 
    444                 // TODO Auto-generated method stub 
    445511                return null; 
    446512        } 
     
    483549 
    484550        @Override 
    485         public Enumeration<String> getHeaders(String name) { 
    486                 // TODO Auto-generated method stub 
    487                 return null; 
    488         } 
    489  
    490         @Override 
    491         public String getContextPath() { 
    492                 // TODO Auto-generated method stub 
    493                 return null; 
    494         } 
    495  
    496         @Override 
    497551        public boolean isUserInRole(String role) { 
    498552                // TODO Auto-generated method stub 
  • kraken-httpd/src/main/java/org/krakenapps/httpd/impl/ServletRegistryImpl.java

    r769 r773  
    7171                        prefix = dir; 
    7272 
     73                // TODO: For now, it does not comply with servlet spec. see section 3.5 
    7374                // longest match 
    7475                for (int i = 0; i < tokens.length; i++) { 
Note: See TracChangeset for help on using the changeset viewer.