OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / libcore / luni / src / main / java / org / apache / harmony / xnet / provider / jsse / ServerSessionContext.java
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.apache.harmony.xnet.provider.jsse;
18
19 import javax.net.ssl.SSLSession;
20
21 /**
22  * Caches server sessions. Indexes by session ID. Users typically look up
23  * sessions using the ID provided by an SSL client.
24  */
25 public class ServerSessionContext extends AbstractSessionContext {
26
27     private SSLServerSessionCache persistentCache;
28
29     public ServerSessionContext() {
30         super(100, 0);
31
32         // TODO make sure SSL_CTX does not automaticaly clear sessions we want it to cache
33         // SSL_CTX_set_session_cache_mode(sslCtxNativePointer, SSL_SESS_CACHE_NO_AUTO_CLEAR);
34
35         // TODO remove SSL_CTX session cache limit so we can manage it
36         // SSL_CTX_sess_set_cache_size(sslCtxNativePointer, 0);
37
38         // TODO override trimToSize and removeEldestEntry to use
39         // SSL_CTX_sessions to remove from native cache
40     }
41
42     public void setPersistentCache(SSLServerSessionCache persistentCache) {
43         this.persistentCache = persistentCache;
44     }
45
46     protected void sessionRemoved(SSLSession session) {}
47
48     @Override
49     public SSLSession getSession(byte[] sessionId) {
50         SSLSession session = super.getSession(sessionId);
51         if (session != null) {
52             return session;
53         }
54
55         // Check persistent cache.
56         if (persistentCache != null) {
57             byte[] data = persistentCache.getSessionData(sessionId);
58             if (data != null) {
59                 session = toSession(data, null, -1);
60                 if (session != null && session.isValid()) {
61                     super.putSession(session);
62                     return session;
63                 }
64             }
65         }
66
67         return null;
68     }
69
70     @Override
71     void putSession(SSLSession session) {
72         super.putSession(session);
73
74         // TODO: In background thread.
75         if (persistentCache != null) {
76             byte[] data = toBytes(session);
77             if (data != null) {
78                 persistentCache.putSessionData(session, data);
79             }
80         }
81     }
82 }