env.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 3,016 行 · 第 1/5 页
JAVA
3,016 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */package com.caucho.quercus.env;import com.caucho.quercus.*;import com.caucho.quercus.expr.Expr;import com.caucho.quercus.function.Marshal;import com.caucho.quercus.function.MarshalFactory;import com.caucho.quercus.lib.ErrorModule;import com.caucho.quercus.lib.VariableModule;import com.caucho.quercus.lib.OptionsModule;import com.caucho.quercus.lib.file.FileModule;import com.caucho.quercus.lib.file.PhpStderr;import com.caucho.quercus.lib.file.PhpStdin;import com.caucho.quercus.lib.file.PhpStdout;import com.caucho.quercus.lib.string.StringModule;import com.caucho.quercus.lib.string.StringUtility;import com.caucho.quercus.module.ModuleContext;import com.caucho.quercus.module.ModuleStartupListener;import com.caucho.quercus.module.IniDefinition;import com.caucho.quercus.page.QuercusPage;import com.caucho.quercus.program.*;import com.caucho.quercus.resources.StreamContextResource;import com.caucho.util.*;import com.caucho.vfs.ByteToChar;import com.caucho.vfs.Encoding;import com.caucho.vfs.NullPath;import com.caucho.vfs.Path;import com.caucho.vfs.ReadStream;import com.caucho.vfs.WriteStream;import com.caucho.vfs.TempBuffer;import com.caucho.vfs.i18n.EncodingReader;import javax.script.Bindings;import javax.script.ScriptContext;import javax.servlet.ServletContext;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import javax.sql.DataSource;import java.io.IOException;import java.io.InputStream;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;import java.lang.reflect.Array;import java.net.URL;import java.sql.Connection;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedHashMap;import java.util.Map;import java.util.IdentityHashMap;import java.util.TimeZone;import java.util.logging.Level;import java.util.logging.Logger;/** * Represents the Quercus environment. */public class Env { private static final L10N L = new L10N(Env.class); private static final Logger log = Logger.getLogger(Env.class.getName()); public static final int B_ERROR = 0; public static final int B_WARNING = 1; public static final int B_PARSE = 2; public static final int B_NOTICE = 3; public static final int B_CORE_ERROR = 4; public static final int B_CORE_WARNING = 5; public static final int B_COMPILE_ERROR = 6; public static final int B_COMPILE_WARNING = 7; public static final int B_USER_ERROR = 8; public static final int B_USER_WARNING = 9; public static final int B_USER_NOTICE = 10; public static final int B_STRICT = 11; public static final int B_RECOVERABLE_ERROR = 12; public static final int B_LAST = B_RECOVERABLE_ERROR; public static final int E_ERROR = 1 << B_ERROR; public static final int E_WARNING = 1 << B_WARNING; public static final int E_PARSE = 1 << B_PARSE; public static final int E_NOTICE = 1 << B_NOTICE; public static final int E_CORE_ERROR = 1 << B_CORE_ERROR; public static final int E_CORE_WARNING = 1 << B_CORE_WARNING; public static final int E_COMPILE_ERROR = 1 << B_COMPILE_ERROR; public static final int E_COMPILE_WARNING = 1 << B_COMPILE_WARNING; public static final int E_USER_ERROR = 1 << B_USER_ERROR; public static final int E_USER_WARNING = 1 << B_USER_WARNING; public static final int E_USER_NOTICE = 1 << B_USER_NOTICE; public static final int E_ALL = 6143; //(4096 + 2048 - 1) public static final int E_STRICT = 1 << B_STRICT; public static final int E_RECOVERABLE_ERROR = 1 << B_RECOVERABLE_ERROR; public static final int E_DEFAULT = E_ALL & ~E_NOTICE; private static final int _SERVER = 1; private static final int _GET = 2; private static final int _POST = 3; private static final int _COOKIE = 4; private static final int _GLOBAL = 5; private static final int _REQUEST = 6; private static final int _SESSION = 7; private static final int HTTP_GET_VARS = 8; private static final int HTTP_POST_VARS = 9; private static final int HTTP_COOKIE_VARS = 10; private static final int PHP_SELF = 11; private static final int _FILES = 12; private static final int HTTP_POST_FILES = 13; private static final int _ENV = 14; private static final int HTTP_SERVER_VARS = 15; private static final int HTTP_RAW_POST_DATA = 16; private static final IntMap SPECIAL_VARS = new IntMap(); private static final StringValue PHP_SELF_STRING = new StringBuilderValue("PHP_SELF"); private static final StringValue UTF8_STRING = new StringBuilderValue("utf-8"); public static final Value []EMPTY_VALUE = new Value[0]; private static final LruCache<ClassKey,SoftReference<QuercusClass>> _classCache = new LruCache<ClassKey,SoftReference<QuercusClass>>(4096); private static final LruCache<IncludeKey,SoftReference<IncludeCache>> _includeCache = new LruCache<IncludeKey,SoftReference<IncludeCache>>(4096); private static ThreadLocal<Env> _threadEnv = new ThreadLocal<Env>(); private static final FreeList<AbstractFunction[]> _freeFunList = new FreeList<AbstractFunction[]>(256); protected final Quercus _quercus; private final boolean _isUnicodeSemantics; private QuercusPage _page; private Value _this = NullThisValue.NULL; private ArrayList<EnvCleanup> _cleanupList = new ArrayList<EnvCleanup>(); private ArrayList<Shutdown> _shutdownList = new ArrayList<Shutdown>(); private final HashMap<String, Var> _globalMap = new HashMap<String, Var>(1024); private HashMap<String, Var> _staticMap = new HashMap<String, Var>(); private HashMap<String, Var> _map = _globalMap; private HashMap<String, Value> _constMap = new HashMap<String, Value>(1024); private HashMap<String, Value> _lowerConstMap = new HashMap<String, Value>(1024); private HashMap<String, QuercusClass> _classMap = new HashMap<String, QuercusClass>(); private HashMap<String, QuercusClass> _lowerClassMap = new HashMap<String, QuercusClass>(); private HashSet<String> _initializedClassSet = new HashSet<String>(); // Function map public AbstractFunction []_fun; // anonymous functions created by create_function() public HashMap<String, AbstractFunction> _anonymousFunMap; // Class map public ClassDef []_classDef; public QuercusClass []_qClass; private IdentityHashMap<String, Value> _iniMap; // specialMap is used for implicit resources like the mysql link private HashMap<String, Object> _specialMap = new HashMap<String, Object>(); // include_path ini private int _iniCount = 1; private String _defaultIncludePath; private String _includePath; private int _includePathIniCount; private ArrayList<String> _includePathList; private HashMap<Path,ArrayList<Path>> _includePathMap; private LinkedHashMap<Path,QuercusPage> _includeMap = new LinkedHashMap<Path,QuercusPage>(); private boolean _isAllowUrlInclude; private boolean _isAllowUrlFopen; private HashMap<StringValue,Path> _lookupCache = new HashMap<StringValue,Path>(); private HashMap<ConnectionEntry,ConnectionEntry> _connMap = new HashMap<ConnectionEntry,ConnectionEntry>(); private AbstractFunction _autoload; private HashSet<String> _autoloadClasses = new HashSet<String>(); private ArrayList<Callback> _autoloadList; private long _startTime; private long _timeLimit = 600000L; private Expr [] _callStack = new Expr[256]; private Value [] _callThisStack = new Value[256]; private int _callStackTop; private String _callingClass; private Value [] _functionArgs; private Path _selfPath; private Path _selfDirectory; private Path _pwd; private Path _uploadPath; private Path _tmpPath; private ArrayList<Path> _removePaths; private final boolean _isStrict; private HttpServletRequest _request; private HttpServletResponse _response; private ArrayValue _postArray; private StringValue _inputData; private ArrayValue _files; private SessionArrayValue _session; private HttpSession _javaSession; private ScriptContext _scriptContext; private WriteStream _originalOut; private OutputBuffer _outputBuffer; private WriteStream _out; private LocaleInfo _locale; private Callback [] _prevErrorHandlers = new Callback[B_LAST + 1]; private Callback [] _errorHandlers = new Callback[B_LAST + 1]; private Callback _prevExceptionHandler; private Callback _exceptionHandler; private SessionCallback _sessionCallback; private StreamContextResource _defaultStreamContext; // XXX: need to look this up from the module itself private int _errorMask = E_DEFAULT; private int _objectId = 0; private Logger _logger; // hold special Quercus php import statements private ImportMap _importMap; private TimeZone _defaultTimeZone; private Object _gzStream; private Env _oldThreadEnv; public Env(Quercus quercus, QuercusPage page, WriteStream out, HttpServletRequest request, HttpServletResponse response) { _quercus = quercus; _isStrict = quercus.isStrict(); _isUnicodeSemantics = quercus.isUnicodeSemantics(); _isAllowUrlInclude = quercus.isAllowUrlInclude(); _isAllowUrlFopen = quercus.isAllowUrlFopen(); _page = page; // XXX: grab initial from page // _defState = new DefinitionState(quercus); AbstractFunction []defFuns = quercus.getFunctionMap(); _fun = _freeFunList.allocate(); if (_fun == null || _fun.length != defFuns.length) _fun = new AbstractFunction[defFuns.length]; System.arraycopy(defFuns, 0, _fun, 0, defFuns.length); ClassDef []defClasses = quercus.getClassDefMap(); _classDef = new ClassDef[defClasses.length]; _qClass = new QuercusClass[_classDef.length]; _originalOut = out; _out = out; _request = request; _response = response; if (_page != null) { _page.init(this); _page.importDefinitions(this); } setPwd(_quercus.getPwd()); if (_page != null) { setSelfPath(_page.getSelfPath(null)); // php/0b32 _includeMap.put(_selfPath, _page); } if (_request != null && _request.getMethod().equals("POST")) { _postArray = new ArrayValueImpl(); _files = new ArrayValueImpl(); Post.fillPost(this, _postArray, _files, _request, getIniBoolean("magic_quotes_gpc")); } else if (_request != null && ! _request.getMethod().equals("GET")) { InputStream is = null; try { is = _request.getInputStream(); } catch (IOException e) { warning(e); } StringValue bb = createBinaryBuilder(); bb.appendReadAll(is, Integer.MAX_VALUE); setInputData(bb); } /* Cluster cluster = Cluster.getLocal(); if (cluster != null) { ClusterServer selfServer = cluster.getSelfServer(); if (selfServer != null) setIni("caucho.server_id", selfServer.getId()); } */ // Define the constant string PHP_VERSION VariableModule.define(this, this.createString("PHP_VERSION"), OptionsModule.phpversion(this, null), true); // STDIN, STDOUT, STDERR // php://stdin, php://stdout, php://stderr if (response == null) { VariableModule.define(this, this.createString("STDOUT"), wrapJava(new PhpStdout()), false); VariableModule.define(this, this.createString("STDERR"), wrapJava(new PhpStderr()), false); VariableModule.define(this, this.createString("STDIN"), wrapJava(new PhpStdin(this)), false); } } public Env(Quercus quercus) { this(quercus, null, null, null, null); } public static Env getInstance() { return _threadEnv.get(); } // // i18n // /** * Returns true if unicode.semantics is on. */ public boolean isUnicodeSemantics() { return _isUnicodeSemantics; } /** * Returns the encoding used for scripts. */ public String getScriptEncoding() { StringValue encoding = getIni("unicode.script_encoding"); if (encoding.length() == 0) { encoding = getIni("unicode.fallback_encoding"); if (encoding.length() == 0) return getQuercus().getScriptEncoding(); } return encoding.toString(); } /** * Returns the encoding used for runtime conversions, e.g. files * XXX: ISO-8859-1 when unicode.semantics is OFF */ public String getRuntimeEncoding() { if (! _isUnicodeSemantics) return "iso-8859-1"; StringValue encoding = getIni("unicode.runtime_encoding"); if (encoding.length() == 0) { encoding = getIni("unicode.fallback_encoding"); if (encoding.length() == 0) encoding = UTF8_STRING; } return encoding.toString(); } /** * Sets the encoding used for runtime conversions. */ public Value setRuntimeEncoding(String encoding) { return setIni("unicode.runtime_encoding", encoding); } /** * Returns the encoding used for runtime conversions, e.g. files */ public EncodingReader getRuntimeEncodingFactory() throws IOException { return Encoding.getReadFactory(getRuntimeEncoding()); } /** * Returns the encoding used for input, i.e. post, * null if unicode.semantics is off. */ public String getHttpInputEncoding() { if (! _isUnicodeSemantics) return null; StringValue encoding = getIni("unicode.http_input_encoding"); if (encoding.length() == 0) { encoding = getIni("unicode.fallback_encoding"); if (encoding.length() == 0) encoding = UTF8_STRING; } return encoding.toString(); } /** * Returns the encoding used for output, null if unicode.semantics is off. */ public String getOutputEncoding() { if (! _isUnicodeSemantics) return null; String encoding = Quercus.INI_UNICODE_OUTPUT_ENCODING.getAsString(this); if (encoding == null) encoding = Quercus.INI_UNICODE_FALLBACK_ENCODING.getAsString(this); if (encoding == null) encoding = "utf-8"; return encoding; } /** * Creates a binary builder. */ public StringValue createBinaryBuilder() { if (_isUnicodeSemantics) return new BinaryBuilderValue(); else return new StringBuilderValue(); } /** * Creates a binary builder for large things like files. */ public StringValue createLargeBinaryBuilder() { if (_isUnicodeSemantics) return new BinaryBuilderValue(); else return new LargeStringBuilderValue(); } /** * Creates a binary builder. */ public StringValue createBinaryBuilder(int length) { if (_isUnicodeSemantics) return new BinaryBuilderValue(length); else return new StringBuilderValue(length); } /** * Creates a binary builder. */ public StringValue createBinaryBuilder(byte []buffer, int offset, int length) { if (_isUnicodeSemantics) return new BinaryBuilderValue(buffer, offset, length); else return new StringBuilderValue(buffer, offset, length); } /** * Creates a binary builder. */ public StringValue createBinaryBuilder(byte []buffer) { if (_isUnicodeSemantics) return new BinaryBuilderValue(buffer, 0, buffer.length); else return new StringBuilderValue(buffer, 0, buffer.length); } /** * Creates a unicode builder. */ public StringValue createUnicodeBuilder() { if (_isUnicodeSemantics) return new UnicodeBuilderValue(); else return new StringBuilderValue(); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?