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 }