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 enum
Accept-Encoding header in the HTTP request (https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html).private static class
(package private) class
(package private) class
Service for maintaining a single long-poll connection.(package private) class
State required to speak multiple HTTP requests with the remote.(package private) class
Basic service for sending and receiving HTTP requests.(package private) class
(package private) class
Nested classes/interfaces inherited from class org.eclipse.jgit.transport.Transport
Transport.Operation
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate HttpAuthMethod
private URL
private final NetscapeCookieFile
All stored cookies bound to this repo (independent of the baseUrl)private URIish
The current URI we're talking to.private HttpConnectionFactory
private boolean
private final HttpConfig
private static final org.slf4j.Logger
private URL
(package private) static final TransportProtocol
(package private) static final TransportProtocol
private final ProxySelector
private final Set<HttpCookie>
The cookies to be sent with each request to the givenbaseUrl
.private boolean
private boolean
private static final String
private static final String
private boolean
private static final byte[]
Fields inherited from class org.eclipse.jgit.transport.HttpTransport
connectionFactory
Fields 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 void
addHeaders
(HttpConnection conn, List<String> headersToAdd) Adds a list of header strings to the connection.private HttpAuthMethod
void
close()
private HttpConnection
private HttpConnection
connect
(String service, TransferConfig.ProtocolVersion protocolVersion) private TransportHttp.CredentialItems
constructSslTrustItems
(Throwable cause) private NoRemoteRepositoryException
createNotFoundException
(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 FetchConnection
getConnection
(HttpConnection c, InputStream in, String service, Collection<RefSpec> refSpecs, String... additionalPatterns) private NetscapeCookieFile
getCookieFileFromConfig
(HttpConfig config) Retrieves theHttpConnectionFactory
used by thisTransportHttp
instance.private URL
getServiceURL
(String service) private void
protected HttpConnection
httpOpen
(String method, URL u, TransportHttp.AcceptEncoding acceptEncoding) Open an HTTP connection.private boolean
private boolean
isSmartHttp
(HttpConnection c, String service) private boolean
isValidRedirect
(URL current, String next, String checkFor) (package private) static boolean
matchesCookieDomain
(String host, String cookieDomain) The utility method to check whether a host name is in a cookie's domain or not.(package private) static boolean
matchesCookiePath
(String path, String cookiePath) The utility method to check whether a path is matching a cookie path domain or not.private WalkFetchConnection
Begins 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 InputStream
openPush()
Begins a new connection for pushing into the remote repository.(package private) void
private void
readSmartHeaders
(InputStream in, String service) private URIish
void
setAdditionalHeaders
(Map<String, String> headers) Set additional headers on the HTTP connectionprivate void
void
setHttpConnectionFactory
(HttpConnectionFactory customFactory) Sets theHttpConnectionFactory
to be used by thisTransportHttp
instance.void
setPreemptiveBasicAuthentication
(String username, String password) Sets preemptive Basic HTTP authentication.protected void
Set uri aURIish
object.void
setUseSmartHttp
(boolean on) Toggle whether or not smart HTTP transport should be used.private PushConnection
smartPush
(String service, HttpConnection c, InputStream in) private BufferedReader
private URL
private boolean
private void
updateSslVerify
(StoredConfig config, boolean value) private void
updateSslVerifyUser
(boolean value) (package private) IOException
wrongContentType
(String expType, String actType) Methods inherited from class org.eclipse.jgit.transport.HttpTransport
getConnectionFactory, setConnectionFactory
Methods 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.uri
stores the original URI;currentUri
may 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 ofcookieFile
where 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 aURIish
object.- Parameters:
uri
- aURIish
object.- 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 theHttpConnectionFactory
to be used by thisTransportHttp
instance.If no factory is set explicitly, the
TransportHttp
instance uses theglobally defined factory
.- Parameters:
customFactory
- theHttpConnectionFactory
to use- Throws:
IllegalStateException
- if an HTTP/HTTPS connection has already been opened on thisTransportHttp
instance- Since:
- 5.11
-
getHttpConnectionFactory
Retrieves theHttpConnectionFactory
used by thisTransportHttp
instance.- Returns:
- the
HttpConnectionFactory
- Since:
- 5.11
-
setPreemptiveBasicAuthentication
Sets preemptive Basic HTTP authentication. If the givenusername
orpassword
is empty ornull
, no preemptive authentication will be done. Ifusername
andpassword
are 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 thisTransportHttp
instance- 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:
openFetch
in 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:Transport
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.
If the server supports git protocol V2, the
RefSpec
s 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:
openFetch
in 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;null
values 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:
IOException
PackProtocolException
-
toBufferedReader
-
openPush
Begins a new connection for pushing into the remote repository.- Specified by:
openPush
in 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:
IOException
TransportException
-
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:
close
in interfaceAutoCloseable
- Specified by:
close
in 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
allCookies
which 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:
true
if they domain-match;false
if 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:
true
if they path-match;false
if not
-
isSmartHttp
-
isGzipContent
-
readSmartHeaders
- Throws:
IOException
-