private static void putRequestMap( Env env, ArrayValue post, ArrayValue files, HttpServletRequest request, boolean addSlashesToValues, boolean isAllowUploads) { // this call consumes the inputstream Map<String, String[]> map = request.getParameterMap(); if (map == null) return; long maxFileSize = Long.MAX_VALUE; Value maxFileSizeV = post.get(MAX_FILE_SIZE); if (maxFileSizeV.isNull()) maxFileSize = maxFileSizeV.toLong(); if (isAllowUploads) { for (Map.Entry<String, String[]> entry : map.entrySet()) { String key = entry.getKey(); int len = key.length(); if (len < 10 || !key.endsWith(".filename")) continue; String name = key.substring(0, len - 9); String[] fileNames = request.getParameterValues(name + ".filename"); String[] tmpNames = request.getParameterValues(name + ".file"); String[] mimeTypes = request.getParameterValues(name + ".content-type"); for (int i = 0; i < fileNames.length; i++) { long fileLength = new FilePath(tmpNames[i]).getLength(); addFormFile( env, files, name, fileNames[i], tmpNames[i], mimeTypes[i], fileLength, addSlashesToValues, maxFileSize); } } } ArrayList<String> keys = new ArrayList<String>(); keys.addAll(request.getParameterMap().keySet()); Collections.sort(keys); for (String key : keys) { String[] value = request.getParameterValues(key); Post.addFormValue(env, post, key, value, addSlashesToValues); } }
/** * Changes the current domain. * * @param env * @param domain * @return name of current domain after change. */ public String textdomain(Env env, @Optional Value domain) { if (! domain.isNull()) { String name = domain.toString(); setCurrentDomain(env, name); return name; } return getCurrentDomain(env).getName(); }
private static void readMultipartStream( Env env, MultipartStream ms, ArrayValue postArray, ArrayValue files, boolean addSlashesToValues, boolean isAllowUploads) throws IOException { ReadStream is; while ((is = ms.openRead()) != null) { String attr = (String) ms.getAttribute("content-disposition"); if (attr == null || !attr.startsWith("form-data")) { // XXX: is this an error? continue; } String name = getAttribute(attr, "name", addSlashesToValues); String filename = getAttribute(attr, "filename", addSlashesToValues); if (filename != null) { int slashIndex = filename.lastIndexOf('/'); int slashIndex2 = filename.lastIndexOf('\\'); slashIndex = Math.max(slashIndex, slashIndex2); if (slashIndex >= 0) filename = filename.substring(slashIndex + 1); } int bracketIndex = -1; if (name != null) bracketIndex = name.lastIndexOf(']'); if (bracketIndex >= 0 && bracketIndex < name.length() - 1) { // php/085c } else if (filename == null) { StringValue value = env.createStringBuilder(); value.appendReadAll(is, Integer.MAX_VALUE); if (name != null) { addFormValue(env, postArray, name, value, null, addSlashesToValues); } else { env.warning(L.l("file upload is missing name and filename")); } } else { if (!isAllowUploads) { continue; } String tmpName = ""; long tmpLength = 0; // A POST file upload with an empty string as the filename does not // create a temp file in the upload directory. if (filename.length() > 0) { Path tmpPath = env.getUploadDirectory().createTempFile("php", ".tmp"); env.addRemovePath(tmpPath); WriteStream os = tmpPath.openWrite(); try { os.writeStream(is); } finally { os.close(); } tmpName = tmpPath.getFullPath(); tmpLength = tmpPath.getLength(); } // php/0865 // // A header like "Content-Type: image/gif" indicates the mime type // for an uploaded file. String mimeType = getAttribute(attr, "mime-type", addSlashesToValues); if (mimeType == null) { mimeType = (String) ms.getAttribute("content-type"); // php/085f if (mimeType != null && mimeType.endsWith(";")) mimeType = mimeType.substring(0, mimeType.length() - 1); } // php/0864 // // mime type is empty string when no file is uploaded. if (filename.length() == 0) { mimeType = ""; } long maxFileSize = Long.MAX_VALUE; Value maxFileSizeV = postArray.get(MAX_FILE_SIZE); if (!maxFileSizeV.isNull()) maxFileSize = maxFileSizeV.toLong(); if (name != null) { addFormFile( env, files, name, filename, tmpName, mimeType, tmpLength, addSlashesToValues, maxFileSize); } else { addFormFile( env, files, filename, tmpName, mimeType, tmpLength, addSlashesToValues, maxFileSize); } } } }
/** * Semantically compare two non-null values. This includes comparing numeric values of different * types (e.g., an integer and long), but excludes {@code null} and {@link Value#nullValue()} * references. * * @param value1 the first value; may be null * @param value2 the second value; may be null * @return a negative integer, zero, or a positive integer as this object is less than, equal to, * or greater than the specified object. */ protected int compareNonNull(Value value1, Value value2) { if (Value.isNull(value1) || Value.isNull(value2)) return 0; return value1.comparable().compareTo(value2.comparable()); }
/** * Semantically compare two values. This includes comparing numeric values of different types * (e.g., an integer and long), and {@code null} and {@link Value#nullValue()} references. * * @param value1 the first value; may be null * @param value2 the second value; may be null * @return a negative integer, zero, or a positive integer as this object is less than, equal to, * or greater than the specified object. */ protected int compare(Value value1, Value value2) { if (value1 == null) return Value.isNull(value2) ? 0 : 1; return value1.comparable().compareTo(value2.comparable()); }