1 package com.ibm.webdav.protocol.http; 2 3 17 import java.io.*; 18 import java.net.*; 19 import java.rmi.*; 20 import java.util.*; 21 import java.util.logging.*; 22 23 import javax.servlet.*; 24 import javax.servlet.http.*; 25 26 import com.ibm.webdav.*; 27 import com.ibm.webdav.impl.*; 28 29 30 70 public abstract class WebDAVMethod extends Object { 71 protected ResourceImpl resource; protected HttpServletRequest request; protected HttpServletResponse response; 75 protected ResourceContext context = new ResourceContext(); 77 protected String methodName = null; 78 private static final Logger logger = Logger.getLogger(WebDAVMethod.class.getName()); 79 80 85 public WebDAVMethod(HttpServletRequest request, 86 HttpServletResponse response) throws WebDAVException { 87 this.request = request; 88 this.response = response; 89 90 URL requestURL = getRequestURL(); 94 95 resource = new ResourceImpl(requestURL, request.getPathTranslated()); 96 97 if ((resource.exists() && resource.isCollection()) || 98 request.getMethod().equals("MKCOL")) { 99 resource = new CollectionImpl(requestURL, 100 request.getPathTranslated(), null); 101 } 102 } 103 104 111 protected void copy(InputStream in, HttpServletResponse response, 112 int length, String mime) throws WebDAVException { 113 try { 114 int totalRead = 0; 115 int numRead = 0; 116 int numToRead = 0; 117 boolean isText = mime.regionMatches(0, "text", 0, 4); 118 119 if (!isText) { 121 ServletOutputStream out = (ServletOutputStream) response.getOutputStream(); 122 byte[] buf = new byte[4096]; 123 124 while (totalRead < length) { 125 if ((length - totalRead) < buf.length) { 126 numToRead = length - totalRead; 127 } else { 128 numToRead = buf.length; 129 } 130 131 numRead = in.read(buf, 0, numToRead); 132 133 if (numRead == -1) { 134 break; 135 } 136 137 totalRead += numRead; 138 out.write(buf, 0, numRead); 139 } 140 } else { 142 Reader isr = new InputStreamReader(in, 143 Resource.defaultCharEncoding); 144 145 ServletOutputStream out = (ServletOutputStream) response.getOutputStream(); 146 147 148 159 PrintWriter writer = new PrintWriter( 160 new BufferedWriter( 161 new OutputStreamWriter(out, 162 Resource.defaultCharEncoding), 163 1024), false); 164 numToRead = 4096; 165 166 char[] buf = new char[numToRead]; 167 168 while ((numRead = isr.read(buf, 0, numToRead)) != -1) { 169 writer.write(buf, 0, numRead); 170 } 171 172 writer.flush(); 173 } 174 } catch (WebDAVException exc) { 175 throw exc; 176 } catch (java.io.IOException exc) { 177 throw new WebDAVException(WebDAVStatus.SC_INTERNAL_SERVER_ERROR, 178 "IO Error"); 179 } 180 } 181 182 189 protected void copy(HttpServletRequest request, OutputStream out, 190 int length, String mime) throws WebDAVException { 191 try { 192 int totalRead = 0; 193 int numRead = 0; 194 int numToRead = 0; 195 boolean isText = (length > 0) 196 ? mime.regionMatches(0, "text", 0, 4) : false; 197 198 if (!isText) { 200 ServletInputStream in = (ServletInputStream) request.getInputStream(); 201 byte[] buf = new byte[4096]; 202 203 while (totalRead < length) { 204 if ((length - totalRead) < buf.length) { 205 numToRead = length - totalRead; 206 } else { 207 numToRead = buf.length; 208 } 209 210 numRead = in.read(buf, 0, numToRead); 211 212 if (numRead == -1) { 213 break; 214 } 215 216 totalRead += numRead; 217 out.write(buf, 0, numRead); 218 } 219 } else { 221 Reader isr = request.getReader(); 222 PrintWriter osw = new PrintWriter( 223 new OutputStreamWriter(out, 224 Resource.defaultCharEncoding), 225 false); 226 char[] buf = new char[4096]; 227 228 while (totalRead < length) { 229 if ((length - totalRead) < buf.length) { 230 numToRead = length - totalRead; 231 } else { 232 numToRead = buf.length; 233 } 234 235 numRead = isr.read(buf, 0, numToRead); 236 237 if (numRead == -1) { 238 break; 239 } 240 241 totalRead += numRead; 242 osw.write(buf, 0, numRead); 243 } 244 245 osw.flush(); 246 } 247 } catch (WebDAVException exc) { 248 throw exc; 249 } catch (java.io.IOException exc) { 250 throw new WebDAVException(WebDAVStatus.SC_INTERNAL_SERVER_ERROR, 251 "IO Error"); 252 } 253 } 254 255 262 public static WebDAVMethod create(HttpServletRequest request, 263 HttpServletResponse response) 264 throws WebDAVException { 265 String methodName = request.getMethod(); 266 WebDAVMethod method = null; 267 268 if(logger.isLoggable(Level.FINE)) { 269 logger.logp(Level.FINE, WebDAVMethod.class.getName(), "create", "Processing " + methodName + " request for " + request.getRequestURI()); 270 } 271 272 if (methodName.equals("GET")) { 277 method = new GetMethod(request, response); 278 } else if (methodName.equals("HEAD")) { 279 method = new HeadMethod(request, response); 280 } else if (methodName.equals("PUT")) { 281 method = new PutMethod(request, response); 282 } else if (methodName.equals("DELETE")) { 283 method = new DeleteMethod(request, response); 284 } else if (methodName.equals("COPY")) { 285 method = new CopyMethod(request, response); 286 } else if (methodName.equals("MOVE")) { 287 method = new MoveMethod(request, response); 288 } else if (methodName.equals("PROPFIND")) { 289 method = new PropFindMethod(request, response); 290 } else if (methodName.equals("PROPPATCH")) { 291 method = new PropPatchMethod(request, response); 292 } else if (methodName.equals("MKCOL")) { 293 method = new MkcolMethod(request, response); 294 } else if (methodName.equals("LOCK")) { 295 method = new LockMethod(request, response); 296 } else if (methodName.equals("UNLOCK")) { 297 method = new UnlockMethod(request, response); 298 } else if (methodName.equals("OPTIONS")) { 299 method = new OptionsMethod(request, response); 300 } else if (methodName.equals("POST")) { 301 method = new PostMethod(request, response); 302 } else if (methodName.equals("SEARCH")) { 303 method = new SearchMethod(request, response); 304 } else if (methodName.equals("BIND")) { 305 method = new BindMethod(request, response); 306 } else if (methodName.equals(CheckInMethod.METHOD_NAME)) { 307 method = new CheckInMethod(request, response); 308 } else if (methodName.equals(CheckOutMethod.METHOD_NAME)) { 309 method = new CheckOutMethod(request, response); 310 } else if (methodName.equals(ReportMethod.METHOD_NAME)) { 311 method = new ReportMethod(request, response); 312 } else if (methodName.equals(VersionControlMethod.METHOD_NAME)) { 313 method = new VersionControlMethod(request, response); 314 } else if (methodName.equals(UncheckOutMethod.METHOD_NAME)) { 315 method = new UncheckOutMethod(request, response); 316 } else if (methodName.equals(OrderPatchMethod.METHOD_NAME)) { 317 method = new OrderPatchMethod(request, response); 318 } 319 320 method.getRequestHeaders(); 321 322 return method; 323 } 324 325 332 public abstract WebDAVStatus execute() throws WebDAVException; 333 334 337 public String getMethodName() { 338 return methodName; 339 } 340 341 346 public void getRequestHeaders() throws WebDAVException { 347 context = getResource().getContext(); 349 350 Enumeration headerNames = request.getHeaderNames(); 351 352 while (headerNames.hasMoreElements()) { 353 String name = ((String ) headerNames.nextElement()).toLowerCase(); 354 String value = request.getHeader(name); 355 context.getRequestContext().put(name, value); 356 } 357 } 358 359 369 public URL getRequestURL() { 370 StringBuffer url = new StringBuffer (); 371 372 String scheme = request.getScheme(); 373 int port = request.getServerPort(); 374 String requestURI = request.getRequestURI(); 375 int q = requestURI.indexOf('?'); 376 377 if (q >= 0) { 378 requestURI = requestURI.substring(0, q); } 380 381 url.append(scheme); url.append("://"); 383 384 385 url.append(request.getServerName()); 388 389 if (port != -1) { 390 url.append(':'); 391 url.append(request.getServerPort()); 392 } 393 394 url.append(requestURI); 395 396 URL result = null; 397 398 try { 399 result = new URL(url.toString()); 400 } catch (Exception exc) { 401 } 402 403 return result; 404 } 405 406 408 public ResourceImpl getResource() { 409 return resource; 410 } 411 412 418 public String getResponseCharset() { 419 String accept = null; 420 String charEncoding = null; 421 422 try { 423 accept = resource.getRequestContext().accept(); 424 } catch (Exception exc) { 425 } 426 427 if (accept != null) { 428 charEncoding = ((ServletResponse) response).getCharacterEncoding(); 429 430 433 } 434 435 if (charEncoding == null) { 436 charEncoding = Resource.defaultXMLEncoding; 437 } 438 439 return charEncoding; 440 } 441 442 446 public int getStatusCode() { 447 return context.getStatusCode().getStatusCode(); 448 } 449 450 455 public void setResponseHeaders() throws WebDAVException { 456 ResourceContext context = resource.getContext(); 458 459 Enumeration propertyNames = context.getResponseContext().keys(); 461 462 while (propertyNames.hasMoreElements()) { 463 String name = (String ) propertyNames.nextElement(); 464 String value = (String ) context.getResponseContext().get(name); 465 466 if (!name.equals("content-length")) { 467 if (name.equals("content-type")) { 468 response.setContentType(value); 471 } else { 472 response.setHeader(name, value); 473 } 474 } 475 } 476 } 477 478 485 public void setStatusCode(int statusCode) { 486 context.getStatusCode().setStatusCode(statusCode); 487 488 489 response.setStatus(statusCode, 494 WebDAVStatus.getStatusMessage(statusCode)); 495 } 496 } | Popular Tags |