13c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerpackage com.squareup.okhttp.internal.http;
23c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
33c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport com.squareup.okhttp.Request;
43c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.net.Proxy;
53c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport java.net.URL;
63c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
73c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerpublic final class RequestLine {
83c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  private RequestLine() {
93c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
103c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
113c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  /**
123c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   * Returns the request status line, like "GET / HTTP/1.1". This is exposed
133c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   * to the application by {@link HttpURLConnectionImpl#getHeaderFields}, so
143c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   * it needs to be set even if the transport is SPDY.
153c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   */
163c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  static String get(Request request, Proxy.Type proxyType, int httpMinorVersion) {
173c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    StringBuilder result = new StringBuilder();
183c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    result.append(request.method());
193c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    result.append(" ");
203c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
213c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    if (includeAuthorityInRequestLine(request, proxyType)) {
223c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller      result.append(request.url());
233c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    } else {
243c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller      result.append(requestPath(request.url()));
253c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    }
263c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
273c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    result.append(" ");
283c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    result.append(version(httpMinorVersion));
293c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    return result.toString();
303c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
313c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
323c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  /**
333c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   * Returns true if the request line should contain the full URL with host
343c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   * and port (like "GET http://android.com/foo HTTP/1.1") or only the path
353c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   * (like "GET /foo HTTP/1.1").
363c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   */
373c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  private static boolean includeAuthorityInRequestLine(Request request, Proxy.Type proxyType) {
383c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    return !request.isHttps() && proxyType == Proxy.Type.HTTP;
393c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
403c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
413c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  /**
423c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   * Returns the path to request, like the '/' in 'GET / HTTP/1.1'. Never empty,
433c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   * even if the request URL is. Includes the query component if it exists.
443c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller   */
453c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  public static String requestPath(URL url) {
463c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    String pathAndQuery = url.getFile();
473c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    if (pathAndQuery == null) return "/";
483c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    if (!pathAndQuery.startsWith("/")) return "/" + pathAndQuery;
493c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    return pathAndQuery;
503c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
513c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller
523c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  public static String version(int httpMinorVersion) {
533c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller    return httpMinorVersion == 1 ? "HTTP/1.1" : "HTTP/1.0";
543c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller  }
553c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller}
56