/* * Utilities.java * * Copyright � 1998-2011 Research In Motion Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Note: For the sake of simplicity, this sample application may not leverage * resource bundles and resource strings. However, it is STRONGLY recommended * that application developers make use of the localization features available * within the BlackBerry development platform to ensure a seamless application * experience across a variety of languages and geographies. For more information * on localizing your application, please refer to the BlackBerry Java Development * Environment Development Guide associated with this release. */ package com.rim.samples.device.browser; import java.io.IOException; import java.io.OutputStream; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; import net.rim.device.api.io.http.HttpHeaders; import net.rim.device.api.io.http.HttpProtocolConstants; import net.rim.device.api.ui.UiApplication; import net.rim.device.api.ui.component.Dialog; import net.rim.device.api.util.StringUtilities; /** * This class provides common functions required by the * BrowserContentManagerDemo and BrowserFieldDemo. This class allows the * aforementioned classes to make a connection to a specified url. */ public class Utilities { /** * Connect to a web resource * * @param url * The url of the resource * @param requestHeaders * The request headers describing the connection to be made * @param postData * The data to post to the web resource * @return The HttpConnection object representing the connection to the * resource, null if no connection could be made */ public static HttpConnection makeConnection(final String url, final HttpHeaders requestHeaders, final byte[] postData) { HttpConnection conn = null; OutputStream out = null; try { conn = (HttpConnection) Connector.open(url); if (requestHeaders != null) { // From // http://www.w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.3 // // Clients SHOULD NOT include a Referer header field in a // (non-secure) HTTP // request if the referring page was transferred with a secure // protocol. final String referer = requestHeaders.getPropertyValue("referer"); boolean sendReferrer = true; if (referer != null && StringUtilities.startsWithIgnoreCase(referer, "https:") && !StringUtilities.startsWithIgnoreCase(url, "https:")) { sendReferrer = false; } int size = requestHeaders.size(); for (int i = 0; i < size;) { final String header = requestHeaders.getPropertyKey(i); // Remove referer header if needed. if (!sendReferrer && header.equals("referer")) { requestHeaders.removeProperty(i); --size; continue; } final String value = requestHeaders.getPropertyValue(i++); if (value != null) { conn.setRequestProperty(header, value); } } } if (postData == null) { conn.setRequestMethod(HttpConnection.GET); } else { conn.setRequestMethod(HttpConnection.POST); conn.setRequestProperty( HttpProtocolConstants.HEADER_CONTENT_LENGTH, String .valueOf(postData.length)); out = conn.openOutputStream(); out.write(postData); } } catch (final IOException e1) { errorDialog(e1.toString()); } finally { if (out != null) { try { out.close(); } catch (final IOException e2) { errorDialog("OutputStream#close() threw " + e2.toString()); } } } return conn; } /** * Presents a dialog to the user with a given message * * @param message * The text to display */ public static void errorDialog(final String message) { UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { Dialog.alert(message); } }); } }