Class TransportHttp
- All Implemented Interfaces:
AutoCloseable,PackTransport,WalkTransport
If the transport is using HTTP and the remote HTTP service is Git-aware (speaks the "smart-http protocol") this client will automatically take advantage of the additional Git-specific HTTP extensions. If the remote service does not support these extensions, the client will degrade to direct file fetching.
If the remote (server side) repository does not have the specialized Git support, object files are retrieved directly through standard HTTP GET (or binary FTP GET) requests. This make it easy to serve a Git repository through a standard web host provider that does not offer specific support for Git.
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumAccept-Encoding header in the HTTP request (https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html).private static class(package private) class(package private) classService for maintaining a single long-poll connection.(package private) classState required to speak multiple HTTP requests with the remote.(package private) classBasic service for sending and receiving HTTP requests.(package private) class(package private) classNested classes/interfaces inherited from class org.eclipse.jgit.transport.Transport
Transport.Operation -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate HttpAuthMethodprivate URLprivate final NetscapeCookieFileAll stored cookies bound to this repo (independent of the baseUrl)private URIishThe current URI we're talking to.private HttpConnectionFactoryprivate booleanprivate final HttpConfigprivate static final org.slf4j.Loggerprivate URL(package private) static final TransportProtocol(package private) static final TransportProtocolprivate final ProxySelectorprivate final Set<HttpCookie>The cookies to be sent with each request to the givenbaseUrl.private booleanprivate booleanprivate static final Stringprivate static final Stringprivate booleanprivate static final byte[]Fields inherited from class org.eclipse.jgit.transport.HttpTransport
connectionFactoryFields inherited from class org.eclipse.jgit.transport.Transport
DEFAULT_FETCH_THIN, DEFAULT_PUSH_THIN, local, protocol, REFSPEC_PUSH_ALL, REFSPEC_TAGS, uri -
Constructor Summary
ConstructorsConstructorDescriptionTransportHttp(Repository local, URIish uri) TransportHttp(URIish uri) Create a minimal HTTP transport with default configuration values. -
Method Summary
Modifier and TypeMethodDescription(package private) static voidaddHeaders(HttpConnection conn, List<String> headersToAdd) Adds a list of header strings to the connection.private HttpAuthMethodvoidclose()private HttpConnectionprivate HttpConnectionconnect(String service, TransferConfig.ProtocolVersion protocolVersion) private TransportHttp.CredentialItemsconstructSslTrustItems(Throwable cause) private NoRemoteRepositoryExceptioncreateNotFoundException(URIish u, URL url, String msg) private List<HttpCookie>extractCookies(String headerKey, List<String> headerValues) private static Set<HttpCookie>filterCookies(Set<HttpCookie> allCookies, URL url) private static Set<HttpCookie>filterCookies(NetscapeCookieFile cookieFile, URL url) private FetchConnectiongetConnection(HttpConnection c, InputStream in, String service, Collection<RefSpec> refSpecs, String... additionalPatterns) private NetscapeCookieFilegetCookieFileFromConfig(HttpConfig config) Retrieves theHttpConnectionFactoryused by thisTransportHttpinstance.private URLgetServiceURL(String service) private voidprotected HttpConnectionhttpOpen(String method, URL u, TransportHttp.AcceptEncoding acceptEncoding) Open an HTTP connection.private booleanprivate booleanisSmartHttp(HttpConnection c, String service) private booleanisValidRedirect(URL current, String next, String checkFor) (package private) static booleanmatchesCookieDomain(String host, String cookieDomain) The utility method to check whether a host name is in a cookie's domain or not.(package private) static booleanmatchesCookiePath(String path, String cookiePath) The utility method to check whether a path is matching a cookie path domain or not.private WalkFetchConnectionBegins a new connection for fetching from the remote repository.openFetch(Collection<RefSpec> refSpecs, String... additionalPatterns) Begins a new connection for fetching from the remote repository.(package private) final InputStreamopenPush()Begins a new connection for pushing into the remote repository.(package private) voidprivate voidreadSmartHeaders(InputStream in, String service) private URIishvoidsetAdditionalHeaders(Map<String, String> headers) Set additional headers on the HTTP connectionprivate voidvoidsetHttpConnectionFactory(HttpConnectionFactory customFactory) Sets theHttpConnectionFactoryto be used by thisTransportHttpinstance.voidsetPreemptiveBasicAuthentication(String username, String password) Sets preemptive Basic HTTP authentication.protected voidSet uri aURIishobject.voidsetUseSmartHttp(boolean on) Toggle whether or not smart HTTP transport should be used.private PushConnectionsmartPush(String service, HttpConnection c, InputStream in) private BufferedReaderprivate URLprivate booleanprivate voidupdateSslVerify(StoredConfig config, boolean value) private voidupdateSslVerifyUser(boolean value) (package private) IOExceptionwrongContentType(String expType, String actType) Methods inherited from class org.eclipse.jgit.transport.HttpTransport
getConnectionFactory, setConnectionFactoryMethods inherited from class org.eclipse.jgit.transport.Transport
applyConfig, fetch, fetch, findRemoteRefUpdatesFor, findRemoteRefUpdatesFor, findRemoteRefUpdatesFor, findRemoteRefUpdatesFor, findTrackingRefName, getCredentialsProvider, getFilterBlobLimit, getFilterSpec, getObjectChecker, getOptionReceivePack, getOptionUploadPack, getPackConfig, getPushOptions, getTagOpt, getTimeout, getTransportProtocols, getURI, isCheckFetchedObjects, isDryRun, isFetchThin, isPushAtomic, isPushThin, isRemoveDeletedRefs, open, open, open, open, open, open, open, openAll, openAll, openAll, openAll, push, push, register, setCheckFetchedObjects, setCredentialsProvider, setDryRun, setFetchThin, setFilterBlobLimit, setFilterSpec, setObjectChecker, setOptionReceivePack, setOptionUploadPack, setPackConfig, setPushAtomic, setPushOptions, setPushThin, setRemoveDeletedRefs, setTagOpt, setTimeout, unregister
-
Field Details
-
LOG
private static final org.slf4j.Logger LOG -
SVC_UPLOAD_PACK
- See Also:
-
SVC_RECEIVE_PACK
- See Also:
-
VERSION
private static final byte[] VERSION -
PROTO_HTTP
-
PROTO_FTP
-
currentUri
The current URI we're talking to. The inherited (final) fieldTransport.uristores the original URI;currentUrimay be different after redirects. -
baseUrl
-
objectsUrl
-
http
-
proxySelector
-
useSmartHttp
private boolean useSmartHttp -
authMethod
-
headers
-
sslVerify
private boolean sslVerify -
sslFailure
private boolean sslFailure -
factory
-
gitSession
-
factoryUsed
private boolean factoryUsed -
cookieFile
All stored cookies bound to this repo (independent of the baseUrl) -
relevantCookies
The cookies to be sent with each request to the givenbaseUrl. Filtered view on top ofcookieFilewhere only cookies which apply to the current url are left. This set needs to be filtered for expired entries each time prior to sending them.
-
-
Constructor Details
-
TransportHttp
TransportHttp(Repository local, URIish uri) throws NotSupportedException - Throws:
NotSupportedException
-
TransportHttp
TransportHttp(URIish uri) throws NotSupportedException Create a minimal HTTP transport with default configuration values.- Parameters:
uri-- Throws:
NotSupportedException
-
-
Method Details
-
toURL
- Throws:
MalformedURLException
-
setURI
Set uri aURIishobject.- Parameters:
uri- aURIishobject.- Throws:
NotSupportedException- Since:
- 4.9
-
setUseSmartHttp
public void setUseSmartHttp(boolean on) Toggle whether or not smart HTTP transport should be used.This flag exists primarily to support backwards compatibility testing within a testing framework, there is no need to modify it in most applications.
- Parameters:
on- iftrue(default), smart HTTP is enabled.
-
getConnection
private FetchConnection getConnection(HttpConnection c, InputStream in, String service, Collection<RefSpec> refSpecs, String... additionalPatterns) throws IOException - Throws:
IOException
-
setHttpConnectionFactory
Sets theHttpConnectionFactoryto be used by thisTransportHttpinstance.If no factory is set explicitly, the
TransportHttpinstance uses theglobally defined factory.- Parameters:
customFactory- theHttpConnectionFactoryto use- Throws:
IllegalStateException- if an HTTP/HTTPS connection has already been opened on thisTransportHttpinstance- Since:
- 5.11
-
getHttpConnectionFactory
Retrieves theHttpConnectionFactoryused by thisTransportHttpinstance.- Returns:
- the
HttpConnectionFactory - Since:
- 5.11
-
setPreemptiveBasicAuthentication
Sets preemptive Basic HTTP authentication. If the givenusernameorpasswordis empty ornull, no preemptive authentication will be done. Ifusernameandpasswordare set, they will override authority information from the URI ("user:password@").If the connection encounters redirects, the pre-authentication will be cleared if the redirect goes to a different host.
- Parameters:
username- to usepassword- to use- Throws:
IllegalStateException- if an HTTP/HTTPS connection has already been opened on thisTransportHttpinstance- Since:
- 5.11
-
openFetch
Begins a new connection for fetching from the remote repository.If the transport has no local repository, the fetch connection can only be used for reading remote refs.
- Specified by:
openFetchin classTransport- Returns:
- a fresh connection to fetch from the remote repository.
- Throws:
TransportException- the remote connection could not be established.NotSupportedException- the implementation does not support fetching.
-
openFetch
public FetchConnection openFetch(Collection<RefSpec> refSpecs, String... additionalPatterns) throws NotSupportedException, TransportException Description copied from class:TransportBegins a new connection for fetching from the remote repository.If the transport has no local repository, the fetch connection can only be used for reading remote refs.
If the server supports git protocol V2, the
RefSpecs and the additional patterns, if any, are used to restrict the server's ref advertisement to matching refs only.Transports that want to support git protocol V2 must override this; the default implementation ignores its arguments and calls
Transport.openFetch().- Overrides:
openFetchin classTransport- Parameters:
refSpecs- that will be fetched viaFetchConnection.fetch(ProgressMonitor, Collection, java.util.Set, OutputStream)lateradditionalPatterns- that will be set as ref prefixes if the server supports git protocol V2;nullvalues are ignored- Returns:
- a fresh connection to fetch from the remote repository.
- Throws:
NotSupportedException- the implementation does not support fetching.TransportException- the remote connection could not be established.
-
newDumbConnection
private WalkFetchConnection newDumbConnection(InputStream in) throws IOException, PackProtocolException - Throws:
IOExceptionPackProtocolException
-
toBufferedReader
-
openPush
Begins a new connection for pushing into the remote repository.- Specified by:
openPushin classTransport- Returns:
- a fresh connection to push into the remote repository.
- Throws:
NotSupportedException- the implementation does not support pushing.TransportException- the remote connection could not be established
-
smartPush
private PushConnection smartPush(String service, HttpConnection c, InputStream in) throws IOException, TransportException - Throws:
IOExceptionTransportException
-
close
public void close()Close any resources used by this transport.
If the remote repository is contacted by a network socket this method must close that network socket, disconnecting the two peers. If the remote repository is actually local (same system) this method must close any open file handles used to read the "remote" repository.
AutoClosable.close()declares that it throwsException. Implementers shouldn't throw checked exceptions. This override narrows the signature to prevent them from doing so.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein classTransport
-
setAdditionalHeaders
Set additional headers on the HTTP connection- Parameters:
headers- a map of name:values that are to be set as headers on the HTTP connection- Since:
- 3.4
-
createNotFoundException
-
authFromUri
-
connect
-
connect
private HttpConnection connect(String service, TransferConfig.ProtocolVersion protocolVersion) throws TransportException, NotSupportedException -
processResponseCookies
-
extractCookies
-
handleSslFailure
- Throws:
TransportException
-
trustInsecureSslConnection
-
constructSslTrustItems
-
updateSslVerify
-
updateSslVerifyUser
private void updateSslVerifyUser(boolean value) -
redirect
private URIish redirect(URL currentUrl, String location, String checkFor, int redirects) throws TransportException - Throws:
TransportException
-
isValidRedirect
-
getServiceURL
- Throws:
NotSupportedException
-
httpOpen
protected HttpConnection httpOpen(String method, URL u, TransportHttp.AcceptEncoding acceptEncoding) throws IOException Open an HTTP connection.- Parameters:
method- HTTP request methodu- url of the HTTP connectionacceptEncoding- accept-encoding header option- Returns:
- the HTTP connection
- Throws:
IOException- Since:
- 4.6
-
addHeaders
Adds a list of header strings to the connection. Headers are expected to separate keys from values, i.e. "Key: Value". Headers without colon or key are ignored (and logged), as are headers with keys that are not RFC 7230 tokens or with non-ASCII values.- Parameters:
conn- The target HttpConnectionheadersToAdd- A list of header strings
-
setCookieHeader
-
openInputStream
- Throws:
IOException
-
wrongContentType
-
getCookieFileFromConfig
-
filterCookies
-
filterCookies
- Parameters:
allCookies- a list of cookies.url- the url for which to filter the list of cookies.- Returns:
- only the cookies from
allCookieswhich are relevant (i.e. are not expired, have a matching domain, have a matching path and have a matching secure attribute)
-
matchesCookieDomain
The utility method to check whether a host name is in a cookie's domain or not. Similar toHttpCookie.domainMatches(String, String)but implements domain matching rules according to RFC 6265, section 5.1.3 instead of the rules from RFC 2965, section 3.3.1.The former rules are also used by libcurl internally.
The rules are as follows A string matches another domain string if at least one of the following conditions holds:
- The domain string and the string are identical. (Note that both the domain string and the string will have been canonicalized to lower case at this point.)
- All of the following conditions hold
- The domain string is a suffix of the string.
- The last character of the string that is not included in the domain string is a %x2E (".") character.
- The string is a host name (i.e., not an IP address).
- Parameters:
host- the host to compare against the cookieDomaincookieDomain- the domain to compare against- Returns:
trueif they domain-match;falseif not- See Also:
-
matchesCookiePath
The utility method to check whether a path is matching a cookie path domain or not. The rules are defined by RFC 6265, section 5.1.4: A request-path path-matches a given cookie-path if at least one of the following conditions holds:- The cookie-path and the request-path are identical.
- The cookie-path is a prefix of the request-path, and the last character of the cookie-path is %x2F ("/").
- The cookie-path is a prefix of the request-path, and the first character of the request-path that is not included in the cookie- path is a %x2F ("/") character.
- Parameters:
path- the path to checkcookiePath- the cookie's path- Returns:
trueif they path-match;falseif not
-
isSmartHttp
-
isGzipContent
-
readSmartHeaders
- Throws:
IOException
-