-
Notifications
You must be signed in to change notification settings - Fork 451
/
AbstractHttpContent.java
134 lines (119 loc) · 4.09 KB
/
AbstractHttpContent.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
* Copyright (c) 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.api.client.http;
import com.google.api.client.util.IOUtils;
import com.google.api.client.util.StreamingContent;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
/**
* Abstract implementation of an HTTP content with typical options.
*
* <p>Implementation is not thread-safe.
*
* @since 1.5
* @author Yaniv Inbar
*/
public abstract class AbstractHttpContent implements HttpContent {
/** Media type used for the Content-Type header or {@code null} for none. */
private HttpMediaType mediaType;
/** Cached value for the computed length from {@link #computeLength()}. */
private long computedLength = -1;
/**
* @param mediaType Media type string (for example "type/subtype") this content represents or
* {@code null} to leave out. Can also contain parameters like {@code "charset=utf-8"}
* @since 1.10
*/
protected AbstractHttpContent(String mediaType) {
this(mediaType == null ? null : new HttpMediaType(mediaType));
}
/**
* @param mediaType Media type this content represents or {@code null} to leave out
* @since 1.10
*/
protected AbstractHttpContent(HttpMediaType mediaType) {
this.mediaType = mediaType;
}
/**
* Default implementation calls {@link #computeLength()} once and caches it for future
* invocations, but subclasses may override.
*/
public long getLength() throws IOException {
if (computedLength == -1) {
computedLength = computeLength();
}
return computedLength;
}
/**
* Returns the media type to use for the Content-Type header, or {@code null} if unspecified.
*
* @since 1.10
*/
public final HttpMediaType getMediaType() {
return mediaType;
}
/**
* Sets the media type to use for the Content-Type header, or {@code null} if unspecified.
*
* <p>This will also overwrite any previously set parameter of the media type (for example {@code
* "charset"}), and therefore might change other properties as well.
*
* @since 1.10
*/
public AbstractHttpContent setMediaType(HttpMediaType mediaType) {
this.mediaType = mediaType;
return this;
}
/**
* Returns the charset specified in the media type or ISO_8859_1 if not specified.
*
* @since 1.10
*/
protected final Charset getCharset() {
return mediaType == null || mediaType.getCharsetParameter() == null
? StandardCharsets.ISO_8859_1
: mediaType.getCharsetParameter();
}
public String getType() {
return mediaType == null ? null : mediaType.build();
}
/**
* Computes and returns the content length or less than zero if not known.
*
* <p>Subclasses may override, but by default this computes the length by calling {@link
* #computeLength(HttpContent)}.
*/
protected long computeLength() throws IOException {
return computeLength(this);
}
/** Default implementation returns {@code true}, but subclasses may override. */
public boolean retrySupported() {
return true;
}
/**
* Returns the computed content length based using {@link IOUtils#computeLength(StreamingContent)}
* or instead {@code -1} if {@link HttpContent#retrySupported()} is {@code false} because the
* stream must not be read twice.
*
* @param content HTTP content
* @return computed content length or {@code -1} if retry is not supported
* @since 1.14
*/
public static long computeLength(HttpContent content) throws IOException {
if (!content.retrySupported()) {
return -1;
}
return IOUtils.computeLength(content);
}
}