/** * Returns a string representation of the cookies. * * @param cookies The cookies * @return The string representation. */ private static String getCookiesStringRepresentation( final Collection<Cookie> cookies) { // <- IA/HERITRIX CHANGE StringBuffer sbResult = new StringBuffer(); Iterator<Cookie> iter = cookies.iterator(); while (iter.hasNext()) { Cookie ck = iter.next(); if (sbResult.length() > 0) { sbResult.append("#"); } sbResult.append(ck.toExternalForm()); } return sbResult.toString(); }
/** Invoked by the HTTPClient. */ public int requestHandler(Request req, Response[] resp) { // First remove any Cookie headers we might have set for a previous // request NVPair[] hdrs = req.getHeaders(); int length = hdrs.length; for (int idx = 0; idx < hdrs.length; idx++) { int beg = idx; while (idx < hdrs.length && hdrs[idx].getName().equalsIgnoreCase("Cookie")) idx++; if (idx - beg > 0) { length -= idx - beg; System.arraycopy(hdrs, idx, hdrs, beg, length - beg); } } if (length < hdrs.length) { hdrs = Util.resizeArray(hdrs, length); req.setHeaders(hdrs); } // Now set any new cookie headers Hashtable cookie_list = Util.getList(cookie_cntxt_list, req.getConnection().getContext()); if (cookie_list.size() == 0) return REQ_CONTINUE; // no need to create a lot of objects Vector names = new Vector(); Vector lens = new Vector(); int version = 0; synchronized (cookie_list) { Enumeration list = cookie_list.elements(); Vector remove_list = null; while (list.hasMoreElements()) { Cookie cookie = (Cookie) list.nextElement(); if (cookie.hasExpired()) { if (LOG.isDebugEnabled()) LOG.debug("Cookie has expired and is being removed: " + cookie); if (remove_list == null) remove_list = new Vector(); remove_list.addElement(cookie); continue; } if (cookie.sendWith(req) && (cookie_handler == null || cookie_handler.sendCookie(cookie, req))) { int len = cookie.getPath().length(); int idx; // insert in correct position for (idx = 0; idx < lens.size(); idx++) if (((Integer) lens.elementAt(idx)).intValue() < len) break; names.insertElementAt(cookie.toExternalForm(), idx); lens.insertElementAt(new Integer(len), idx); if (cookie instanceof Cookie2) version = Math.max(version, ((Cookie2) cookie).getVersion()); } } // remove any marked cookies // Note: we can't do this during the enumeration! if (remove_list != null) { for (int idx = 0; idx < remove_list.size(); idx++) cookie_list.remove(remove_list.elementAt(idx)); } } if (!names.isEmpty()) { StringBuffer value = new StringBuffer(); if (version > 0) value.append("$Version=\"" + version + "\"; "); value.append((String) names.elementAt(0)); for (int idx = 1; idx < names.size(); idx++) { value.append("; "); value.append((String) names.elementAt(idx)); } hdrs = Util.resizeArray(hdrs, hdrs.length + 1); hdrs[hdrs.length - 1] = new NVPair("Cookie", value.toString()); // add Cookie2 header if necessary if (version != 1) // we currently know about version 1 only { int idx; for (idx = 0; idx < hdrs.length; idx++) if (hdrs[idx].getName().equalsIgnoreCase("Cookie2")) break; if (idx == hdrs.length) { hdrs = Util.resizeArray(hdrs, hdrs.length + 1); hdrs[hdrs.length - 1] = new NVPair("Cookie2", "$Version=\"1\""); } } req.setHeaders(hdrs); if (LOG.isDebugEnabled()) LOG.debug("Sending cookies '" + value + "'"); } return REQ_CONTINUE; }