View Javadoc
1   /*
2    * Copyright (C) 2016, Christian Halstrick <christian.halstrick@sap.com>
3    * Copyright (C) 2015, Sasa Zivkov <sasa.zivkov@sap.com>
4    * and other copyright owners as documented in the project's IP log.
5    *
6    * This program and the accompanying materials are made available
7    * under the terms of the Eclipse Distribution License v1.0 which
8    * accompanies this distribution, is reproduced below, and is
9    * available at http://www.eclipse.org/org/documents/edl-v10.php
10   *
11   * All rights reserved.
12   *
13   * Redistribution and use in source and binary forms, with or
14   * without modification, are permitted provided that the following
15   * conditions are met:
16   *
17   * - Redistributions of source code must retain the above copyright
18   *   notice, this list of conditions and the following disclaimer.
19   *
20   * - Redistributions in binary form must reproduce the above
21   *   copyright notice, this list of conditions and the following
22   *   disclaimer in the documentation and/or other materials provided
23   *   with the distribution.
24   *
25   * - Neither the name of the Eclipse Foundation, Inc. nor the
26   *   names of its contributors may be used to endorse or promote
27   *   products derived from this software without specific prior
28   *   written permission.
29   *
30   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
31   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
32   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
35   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
37   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
38   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
39   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
42   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43   */
44  package org.eclipse.jgit.lfs;
45  
46  import java.util.List;
47  import java.util.Map;
48  
49  import com.google.gson.FieldNamingPolicy;
50  import com.google.gson.Gson;
51  import com.google.gson.GsonBuilder;
52  
53  /**
54   * This interface describes the network protocol used between lfs client and lfs
55   * server
56   *
57   * @since 4.11
58   */
59  public interface Protocol {
60  	/** A request sent to an LFS server */
61  	class Request {
62  		/** The operation of this request */
63  		public String operation;
64  
65  		/** The objects of this request */
66  		public List<ObjectSpec> objects;
67  	}
68  
69  	/** A response received from an LFS server */
70  	class Response {
71  		public List<ObjectInfo> objects;
72  	}
73  
74  	/**
75  	 * MetaData of an LFS object. Needs to be specified when requesting objects
76  	 * from the LFS server and is also returned in the response
77  	 */
78  	class ObjectSpec {
79  		public String oid; // the objectid
80  
81  		public long size; // the size of the object
82  	}
83  
84  	/**
85  	 * Describes in a response all actions the LFS server offers for a single
86  	 * object
87  	 */
88  	class ObjectInfo extends ObjectSpec {
89  		public Map<String, Action> actions; // Maps operation to action
90  
91  		public Error error;
92  	}
93  
94  	/**
95  	 * Describes in a Response a single action the client can execute on a
96  	 * single object
97  	 */
98  	class Action {
99  		public String href;
100 
101 		public Map<String, String> header;
102 	}
103 
104 	/**
105 	 * An action with an additional expiration timestamp
106 	 *
107 	 * @since 4.11
108 	 */
109 	class ExpiringAction extends Action {
110 		/**
111 		 * Absolute date/time in format "yyyy-MM-dd'T'HH:mm:ss.SSSX"
112 		 */
113 		public String expiresAt;
114 
115 		/**
116 		 * Validity time in milliseconds (preferred over expiresAt as specified:
117 		 * https://github.com/git-lfs/git-lfs/blob/master/docs/api/authentication.md)
118 		 */
119 		public String expiresIn;
120 	}
121 
122 	/** Describes an error to be returned by the LFS batch API */
123 	class Error {
124 		public int code;
125 
126 		public String message;
127 	}
128 
129 	/**
130 	 * The "download" operation
131 	 */
132 	String OPERATION_DOWNLOAD = "download"; //$NON-NLS-1$
133 
134 	/**
135 	 * The "upload" operation
136 	 */
137 	String OPERATION_UPLOAD = "upload"; //$NON-NLS-1$
138 
139 	/**
140 	 * The contenttype used in LFS requests
141 	 */
142 	String CONTENTTYPE_VND_GIT_LFS_JSON = "application/vnd.git-lfs+json; charset=utf-8"; //$NON-NLS-1$
143 
144 	/**
145 	 * Authorization header when auto-discovering via SSH.
146 	 */
147 	String HDR_AUTH = "Authorization"; //$NON-NLS-1$
148 
149 	/**
150 	 * Prefix of authentication token obtained through SSH.
151 	 */
152 	String HDR_AUTH_SSH_PREFIX = "Ssh: "; //$NON-NLS-1$
153 
154 	/**
155 	 * Path to the LFS info servlet.
156 	 */
157 	String INFO_LFS_ENDPOINT = "/info/lfs"; //$NON-NLS-1$
158 
159 	/**
160 	 * Path to the LFS objects servlet.
161 	 */
162 	String OBJECTS_LFS_ENDPOINT = "/objects/batch"; //$NON-NLS-1$
163 
164 	/**
165 	 * @return a {@link Gson} instance suitable for handling this
166 	 *         {@link Protocol}
167 	 *
168 	 * @since 4.11
169 	 */
170 	public static Gson gson() {
171 		return new GsonBuilder()
172 				.setFieldNamingPolicy(
173 						FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
174 				.disableHtmlEscaping().create();
175 	}
176 }