xref: /JGit/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/Protocol.java (revision 5c5f7c6b146b24f2bd4afae1902df85ad6e57ea3)
194bcde66SMarkus Duft /*
294bcde66SMarkus Duft  * Copyright (C) 2016, Christian Halstrick <christian.halstrick@sap.com>
3*5c5f7c6bSMatthias Sohn  * Copyright (C) 2015, Sasa Zivkov <sasa.zivkov@sap.com> and others
494bcde66SMarkus Duft  *
5*5c5f7c6bSMatthias Sohn  * This program and the accompanying materials are made available under the
6*5c5f7c6bSMatthias Sohn  * terms of the Eclipse Distribution License v. 1.0 which is available at
7*5c5f7c6bSMatthias Sohn  * https://www.eclipse.org/org/documents/edl-v10.php.
894bcde66SMarkus Duft  *
9*5c5f7c6bSMatthias Sohn  * SPDX-License-Identifier: BSD-3-Clause
1094bcde66SMarkus Duft  */
1194bcde66SMarkus Duft package org.eclipse.jgit.lfs;
1294bcde66SMarkus Duft 
1394bcde66SMarkus Duft import java.util.List;
1494bcde66SMarkus Duft import java.util.Map;
1594bcde66SMarkus Duft 
16ea2f7e93SMarkus Duft import com.google.gson.FieldNamingPolicy;
17ea2f7e93SMarkus Duft import com.google.gson.Gson;
18ea2f7e93SMarkus Duft import com.google.gson.GsonBuilder;
19ea2f7e93SMarkus Duft 
2094bcde66SMarkus Duft /**
2194bcde66SMarkus Duft  * This interface describes the network protocol used between lfs client and lfs
2294bcde66SMarkus Duft  * server
2394bcde66SMarkus Duft  *
2494bcde66SMarkus Duft  * @since 4.11
2594bcde66SMarkus Duft  */
2694bcde66SMarkus Duft public interface Protocol {
2794bcde66SMarkus Duft 	/** A request sent to an LFS server */
2894bcde66SMarkus Duft 	class Request {
2994bcde66SMarkus Duft 		/** The operation of this request */
3094bcde66SMarkus Duft 		public String operation;
3194bcde66SMarkus Duft 
3294bcde66SMarkus Duft 		/** The objects of this request */
3394bcde66SMarkus Duft 		public List<ObjectSpec> objects;
3494bcde66SMarkus Duft 	}
3594bcde66SMarkus Duft 
3694bcde66SMarkus Duft 	/** A response received from an LFS server */
3794bcde66SMarkus Duft 	class Response {
3894bcde66SMarkus Duft 		public List<ObjectInfo> objects;
3994bcde66SMarkus Duft 	}
4094bcde66SMarkus Duft 
4194bcde66SMarkus Duft 	/**
4294bcde66SMarkus Duft 	 * MetaData of an LFS object. Needs to be specified when requesting objects
4394bcde66SMarkus Duft 	 * from the LFS server and is also returned in the response
4494bcde66SMarkus Duft 	 */
4594bcde66SMarkus Duft 	class ObjectSpec {
4694bcde66SMarkus Duft 		public String oid; // the objectid
4794bcde66SMarkus Duft 
4894bcde66SMarkus Duft 		public long size; // the size of the object
4994bcde66SMarkus Duft 	}
5094bcde66SMarkus Duft 
5194bcde66SMarkus Duft 	/**
5294bcde66SMarkus Duft 	 * Describes in a response all actions the LFS server offers for a single
5394bcde66SMarkus Duft 	 * object
5494bcde66SMarkus Duft 	 */
5594bcde66SMarkus Duft 	class ObjectInfo extends ObjectSpec {
5694bcde66SMarkus Duft 		public Map<String, Action> actions; // Maps operation to action
5794bcde66SMarkus Duft 
5894bcde66SMarkus Duft 		public Error error;
5994bcde66SMarkus Duft 	}
6094bcde66SMarkus Duft 
6194bcde66SMarkus Duft 	/**
6294bcde66SMarkus Duft 	 * Describes in a Response a single action the client can execute on a
6394bcde66SMarkus Duft 	 * single object
6494bcde66SMarkus Duft 	 */
6594bcde66SMarkus Duft 	class Action {
6694bcde66SMarkus Duft 		public String href;
6794bcde66SMarkus Duft 
6894bcde66SMarkus Duft 		public Map<String, String> header;
6994bcde66SMarkus Duft 	}
7094bcde66SMarkus Duft 
71ea2f7e93SMarkus Duft 	/**
72ea2f7e93SMarkus Duft 	 * An action with an additional expiration timestamp
73ea2f7e93SMarkus Duft 	 *
74ea2f7e93SMarkus Duft 	 * @since 4.11
75ea2f7e93SMarkus Duft 	 */
76ea2f7e93SMarkus Duft 	class ExpiringAction extends Action {
77ea2f7e93SMarkus Duft 		/**
78ea2f7e93SMarkus Duft 		 * Absolute date/time in format "yyyy-MM-dd'T'HH:mm:ss.SSSX"
79ea2f7e93SMarkus Duft 		 */
80ea2f7e93SMarkus Duft 		public String expiresAt;
81ea2f7e93SMarkus Duft 
82ea2f7e93SMarkus Duft 		/**
83ea2f7e93SMarkus Duft 		 * Validity time in milliseconds (preferred over expiresAt as specified:
84ea2f7e93SMarkus Duft 		 * https://github.com/git-lfs/git-lfs/blob/master/docs/api/authentication.md)
85ea2f7e93SMarkus Duft 		 */
86ea2f7e93SMarkus Duft 		public String expiresIn;
87ea2f7e93SMarkus Duft 	}
88ea2f7e93SMarkus Duft 
8994bcde66SMarkus Duft 	/** Describes an error to be returned by the LFS batch API */
9094bcde66SMarkus Duft 	class Error {
9194bcde66SMarkus Duft 		public int code;
9294bcde66SMarkus Duft 
9394bcde66SMarkus Duft 		public String message;
9494bcde66SMarkus Duft 	}
9594bcde66SMarkus Duft 
9694bcde66SMarkus Duft 	/**
9794bcde66SMarkus Duft 	 * The "download" operation
9894bcde66SMarkus Duft 	 */
9994bcde66SMarkus Duft 	String OPERATION_DOWNLOAD = "download"; //$NON-NLS-1$
10094bcde66SMarkus Duft 
10194bcde66SMarkus Duft 	/**
10294bcde66SMarkus Duft 	 * The "upload" operation
10394bcde66SMarkus Duft 	 */
10494bcde66SMarkus Duft 	String OPERATION_UPLOAD = "upload"; //$NON-NLS-1$
10594bcde66SMarkus Duft 
10694bcde66SMarkus Duft 	/**
10794bcde66SMarkus Duft 	 * The contenttype used in LFS requests
10894bcde66SMarkus Duft 	 */
10994bcde66SMarkus Duft 	String CONTENTTYPE_VND_GIT_LFS_JSON = "application/vnd.git-lfs+json; charset=utf-8"; //$NON-NLS-1$
11094bcde66SMarkus Duft 
11194bcde66SMarkus Duft 	/**
11294bcde66SMarkus Duft 	 * Authorization header when auto-discovering via SSH.
11394bcde66SMarkus Duft 	 */
11494bcde66SMarkus Duft 	String HDR_AUTH = "Authorization"; //$NON-NLS-1$
11594bcde66SMarkus Duft 
11694bcde66SMarkus Duft 	/**
11794bcde66SMarkus Duft 	 * Prefix of authentication token obtained through SSH.
11894bcde66SMarkus Duft 	 */
11994bcde66SMarkus Duft 	String HDR_AUTH_SSH_PREFIX = "Ssh: "; //$NON-NLS-1$
12094bcde66SMarkus Duft 
12194bcde66SMarkus Duft 	/**
12294bcde66SMarkus Duft 	 * Path to the LFS info servlet.
12394bcde66SMarkus Duft 	 */
12494bcde66SMarkus Duft 	String INFO_LFS_ENDPOINT = "/info/lfs"; //$NON-NLS-1$
12594bcde66SMarkus Duft 
12694bcde66SMarkus Duft 	/**
12794bcde66SMarkus Duft 	 * Path to the LFS objects servlet.
12894bcde66SMarkus Duft 	 */
12994bcde66SMarkus Duft 	String OBJECTS_LFS_ENDPOINT = "/objects/batch"; //$NON-NLS-1$
130ea2f7e93SMarkus Duft 
131ea2f7e93SMarkus Duft 	/**
132ea2f7e93SMarkus Duft 	 * @return a {@link Gson} instance suitable for handling this
133ea2f7e93SMarkus Duft 	 *         {@link Protocol}
134ea2f7e93SMarkus Duft 	 *
135ea2f7e93SMarkus Duft 	 * @since 4.11
136ea2f7e93SMarkus Duft 	 */
gson()137ea2f7e93SMarkus Duft 	public static Gson gson() {
138ea2f7e93SMarkus Duft 		return new GsonBuilder()
139ea2f7e93SMarkus Duft 				.setFieldNamingPolicy(
140ea2f7e93SMarkus Duft 						FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
141ea2f7e93SMarkus Duft 				.disableHtmlEscaping().create();
142ea2f7e93SMarkus Duft 	}
14394bcde66SMarkus Duft }
144