View Javadoc
1   /*
2    * Copyright (C) 2016, Christian Halstrick <christian.halstrick@sap.com>
3    * Copyright (C) 2015, Sasa Zivkov <sasa.zivkov@sap.com> and others
4    *
5    * This program and the accompanying materials are made available under the
6    * terms of the Eclipse Distribution License v. 1.0 which is available at
7    * https://www.eclipse.org/org/documents/edl-v10.php.
8    *
9    * SPDX-License-Identifier: BSD-3-Clause
10   */
11  package org.eclipse.jgit.lfs;
12  
13  import java.util.List;
14  import java.util.Map;
15  
16  import com.google.gson.FieldNamingPolicy;
17  import com.google.gson.Gson;
18  import com.google.gson.GsonBuilder;
19  
20  /**
21   * This interface describes the network protocol used between lfs client and lfs
22   * server
23   *
24   * @since 4.11
25   */
26  public interface Protocol {
27  	/** A request sent to an LFS server */
28  	class Request {
29  		/** The operation of this request */
30  		public String operation;
31  
32  		/** The objects of this request */
33  		public List<ObjectSpec> objects;
34  	}
35  
36  	/** A response received from an LFS server */
37  	class Response {
38  		public List<ObjectInfo> objects;
39  	}
40  
41  	/**
42  	 * MetaData of an LFS object. Needs to be specified when requesting objects
43  	 * from the LFS server and is also returned in the response
44  	 */
45  	class ObjectSpec {
46  		public String oid; // the objectid
47  
48  		public long size; // the size of the object
49  	}
50  
51  	/**
52  	 * Describes in a response all actions the LFS server offers for a single
53  	 * object
54  	 */
55  	class ObjectInfo extends ObjectSpec {
56  		public Map<String, Action> actions; // Maps operation to action
57  
58  		public Error error;
59  	}
60  
61  	/**
62  	 * Describes in a Response a single action the client can execute on a
63  	 * single object
64  	 */
65  	class Action {
66  		public String href;
67  
68  		public Map<String, String> header;
69  	}
70  
71  	/**
72  	 * An action with an additional expiration timestamp
73  	 *
74  	 * @since 4.11
75  	 */
76  	class ExpiringAction extends Action {
77  		/**
78  		 * Absolute date/time in format "yyyy-MM-dd'T'HH:mm:ss.SSSX"
79  		 */
80  		public String expiresAt;
81  
82  		/**
83  		 * Validity time in milliseconds (preferred over expiresAt as specified:
84  		 * https://github.com/git-lfs/git-lfs/blob/master/docs/api/authentication.md)
85  		 */
86  		public String expiresIn;
87  	}
88  
89  	/** Describes an error to be returned by the LFS batch API */
90  	class Error {
91  		public int code;
92  
93  		public String message;
94  	}
95  
96  	/**
97  	 * The "download" operation
98  	 */
99  	String OPERATION_DOWNLOAD = "download"; //$NON-NLS-1$
100 
101 	/**
102 	 * The "upload" operation
103 	 */
104 	String OPERATION_UPLOAD = "upload"; //$NON-NLS-1$
105 
106 	/**
107 	 * The contenttype used in LFS requests
108 	 */
109 	String CONTENTTYPE_VND_GIT_LFS_JSON = "application/vnd.git-lfs+json; charset=utf-8"; //$NON-NLS-1$
110 
111 	/**
112 	 * Authorization header when auto-discovering via SSH.
113 	 */
114 	String HDR_AUTH = "Authorization"; //$NON-NLS-1$
115 
116 	/**
117 	 * Prefix of authentication token obtained through SSH.
118 	 */
119 	String HDR_AUTH_SSH_PREFIX = "Ssh: "; //$NON-NLS-1$
120 
121 	/**
122 	 * Path to the LFS info servlet.
123 	 */
124 	String INFO_LFS_ENDPOINT = "/info/lfs"; //$NON-NLS-1$
125 
126 	/**
127 	 * Path to the LFS objects servlet.
128 	 */
129 	String OBJECTS_LFS_ENDPOINT = "/objects/batch"; //$NON-NLS-1$
130 
131 	/**
132 	 * @return a {@link Gson} instance suitable for handling this
133 	 *         {@link Protocol}
134 	 *
135 	 * @since 4.11
136 	 */
137 	public static Gson gson() {
138 		return new GsonBuilder()
139 				.setFieldNamingPolicy(
140 						FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
141 				.disableHtmlEscaping().create();
142 	}
143 }