Skip to content

Commit 4c1905b

Browse files
committed
Use Translate method instead of List method, to avoid URI construction limits
Fixes #2957 as far as we can.
1 parent c1ad8cb commit 4c1905b

File tree

6 files changed

+80
-28
lines changed

6 files changed

+80
-28
lines changed

apis/Google.Cloud.Translation.V2/Google.Cloud.Translation.V2.IntegrationTests/AdvancedTranslationClientTest.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
using System.Linq;
1516
using Xunit;
1617

1718
namespace Google.Cloud.Translation.V2.IntegrationTests
1819
{
1920
public class AdvancedTranslationClientTest
2021
{
2122
private static readonly string LargeText = TranslationClientTest.LoadResource("independence.txt");
23+
private const int ApiLimit = 100 * 1024;
24+
private static readonly string VeryLargeText = string.Join("\n", Enumerable.Repeat(LargeText, ApiLimit / LargeText.Length));
2225

2326
[Fact]
2427
public void DetectLanguage_LargeText()
@@ -36,6 +39,14 @@ public void Translate_LargeText()
3639
Assert.Contains("au cours d", translation.TranslatedText);
3740
}
3841

42+
[Fact]
43+
public void Translate_VeryLargeText()
44+
{
45+
var client = AdvancedTranslationClient.Create();
46+
var translation = client.TranslateText(VeryLargeText, LanguageCodes.French);
47+
Assert.Contains("au cours d", translation.TranslatedText);
48+
}
49+
3950
[Fact]
4051
public void Translate_ModelInResult()
4152
{

apis/Google.Cloud.Translation.V2/Google.Cloud.Translation.V2.IntegrationTests/TranslationClientTest.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
using System;
1616
using System.IO;
17+
using System.Linq;
1718
using System.Reflection;
1819
using Xunit;
1920

@@ -22,6 +23,8 @@ namespace Google.Cloud.Translation.V2.IntegrationTests
2223
public class TranslationClientTest
2324
{
2425
private static readonly string LargeText = LoadResource("independence.txt");
26+
private const int ApiLimit = 100 * 1024;
27+
private static readonly string VeryLargeText = string.Join("\n", Enumerable.Repeat(LargeText, ApiLimit / LargeText.Length));
2528

2629
[Fact]
2730
public void DetectLanguage_LargeText()
@@ -43,6 +46,18 @@ public void Translate_LargeText()
4346
Assert.Null(translation.SpecifiedSourceLanguage);
4447
}
4548

49+
[Fact]
50+
public void Translate_VeryLargeText()
51+
{
52+
var client = TranslationClient.Create();
53+
var translation = client.TranslateText(VeryLargeText, LanguageCodes.French);
54+
Assert.Contains("au cours d", translation.TranslatedText);
55+
Assert.Equal(VeryLargeText, translation.OriginalText);
56+
Assert.Equal(LanguageCodes.French, translation.TargetLanguage);
57+
Assert.Equal(LanguageCodes.English, translation.DetectedSourceLanguage);
58+
Assert.Null(translation.SpecifiedSourceLanguage);
59+
}
60+
4661
[Fact]
4762
public void Translate_SpecifyLanguage()
4863
{

apis/Google.Cloud.Translation.V2/Google.Cloud.Translation.V2.Tests/AdvancedTranslationClientImplTest.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,13 @@ public void NonMatchingTranslateResultCount()
8686
var service = new FakeTranslateService();
8787
var client = new AdvancedTranslationClientImpl(service);
8888
var inputs = new string[] { "a", "b" };
89-
var request = service.Translations.List(new Repeatable<string>(inputs), "en");
90-
request.Format = FormatEnum.Text;
89+
var body = new TranslateTextRequest
90+
{
91+
Q = inputs,
92+
Format = "text",
93+
Target = "en"
94+
};
95+
var request = service.Translations.Translate(body);
9196
var response = new TranslationsListResponse
9297
{
9398
// Content is irrelevant; we shouldn't get that far

apis/Google.Cloud.Translation.V2/Google.Cloud.Translation.V2.Tests/TranslationClientImplTest.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,13 @@ public void NonMatchingTranslateResultCount()
8686
var service = new FakeTranslateService();
8787
var client = new TranslationClientImpl(service);
8888
var inputs = new string[] { "a", "b" };
89-
var request = service.Translations.List(new Repeatable<string>(inputs), "en");
90-
request.Format = FormatEnum.Text;
89+
var body = new TranslateTextRequest
90+
{
91+
Q = inputs,
92+
Format = "text",
93+
Target = "en"
94+
};
95+
var request = service.Translations.Translate(body);
9196
var response = new TranslationsListResponse
9297
{
9398
// Content is irrelevant; we shouldn't get that far

apis/Google.Cloud.Translation.V2/Google.Cloud.Translation.V2/AdvancedTranslationClientImpl.cs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ namespace Google.Cloud.Translation.V2
4141
/// </remarks>
4242
public sealed class AdvancedTranslationClientImpl : AdvancedTranslationClient
4343
{
44+
// The Translate method doesn't use the format enum. While we could switch on it, it's simpler to hard-code the values it expects.
45+
private const string HtmlFormat = "html";
46+
private const string TextFormat = "text";
47+
4448
private static readonly object _applicationNameLock = new object();
4549
private static string _applicationName = UserAgentHelper.GetDefaultUserAgent(typeof(AdvancedTranslationClient));
4650
private static Action<HttpRequestMessage> _versionHeaderAction = UserAgentHelper.CreateRequestModifier(typeof(AdvancedTranslationClient));
@@ -94,8 +98,9 @@ public override IList<TranslationResult> TranslateText(IEnumerable<string> textI
9498
{
9599
var items = ConvertToListAndCheckNoNullElements(textItems, nameof(textItems));
96100
GaxPreconditions.CheckNotNull(targetLanguage, nameof(targetLanguage));
97-
var request = Service.Translations.List(new Repeatable<string>(items), targetLanguage);
98-
ModifyRequest(request, sourceLanguage, FormatEnum.Text, model);
101+
var translateRequest = new TranslateTextRequest { Q = items, Target = targetLanguage };
102+
var request = Service.Translations.Translate(translateRequest);
103+
ModifyRequest(request, translateRequest, sourceLanguage, TextFormat, model);
99104
return UnpackTranslationResponse(items, sourceLanguage, targetLanguage, request.Execute());
100105
}
101106

@@ -104,8 +109,9 @@ public override IList<TranslationResult> TranslateHtml(IEnumerable<string> htmlI
104109
{
105110
var items = ConvertToListAndCheckNoNullElements(htmlItems, nameof(htmlItems));
106111
GaxPreconditions.CheckNotNull(targetLanguage, nameof(targetLanguage));
107-
var request = Service.Translations.List(new Repeatable<string>(items), targetLanguage);
108-
ModifyRequest(request, sourceLanguage, FormatEnum.Html, model);
112+
var translateRequest = new TranslateTextRequest { Q = items, Target = targetLanguage };
113+
var request = Service.Translations.Translate(translateRequest);
114+
ModifyRequest(request, translateRequest, sourceLanguage, HtmlFormat, model);
109115
return UnpackTranslationResponse(items, sourceLanguage, targetLanguage, request.Execute());
110116
}
111117

@@ -134,8 +140,9 @@ public override async Task<IList<TranslationResult>> TranslateTextAsync(IEnumera
134140
{
135141
var items = ConvertToListAndCheckNoNullElements(textItems, nameof(textItems));
136142
GaxPreconditions.CheckNotNull(targetLanguage, nameof(targetLanguage));
137-
var request = Service.Translations.List(new Repeatable<string>(items), targetLanguage);
138-
ModifyRequest(request, sourceLanguage, FormatEnum.Text, model);
143+
var translateRequest = new TranslateTextRequest { Q = items, Target = targetLanguage };
144+
var request = Service.Translations.Translate(translateRequest);
145+
ModifyRequest(request, translateRequest, sourceLanguage, TextFormat, model);
139146
var response = await request.ExecuteAsync(cancellationToken).ConfigureAwait(false);
140147
return UnpackTranslationResponse(items, sourceLanguage, targetLanguage, response);
141148
}
@@ -146,8 +153,9 @@ public override async Task<IList<TranslationResult>> TranslateHtmlAsync(IEnumera
146153
{
147154
var items = ConvertToListAndCheckNoNullElements(htmlItems, nameof(htmlItems));
148155
GaxPreconditions.CheckNotNull(targetLanguage, nameof(targetLanguage));
149-
var request = Service.Translations.List(new Repeatable<string>(items), targetLanguage);
150-
ModifyRequest(request, sourceLanguage, FormatEnum.Html, model);
156+
var translateRequest = new TranslateTextRequest { Q = items, Target = targetLanguage };
157+
var request = Service.Translations.Translate(translateRequest);
158+
ModifyRequest(request, translateRequest, sourceLanguage, HtmlFormat, model);
151159
var response = await request.ExecuteAsync(cancellationToken).ConfigureAwait(false);
152160
return UnpackTranslationResponse(items, sourceLanguage, targetLanguage, response);
153161
}
@@ -208,12 +216,12 @@ private static IList<Detection> UnpackDetectResponse(List<string> inputs, Detect
208216
.ToList();
209217
}
210218

211-
private void ModifyRequest(ListRequest request, string sourceLanguage, FormatEnum format, string model)
219+
private void ModifyRequest(TranslateRequest request, TranslateTextRequest body, string sourceLanguage, string format, string model)
212220
{
213221
request.ModifyRequest += _versionHeaderAction;
214-
request.Source = sourceLanguage;
215-
request.Format = format;
216-
request.Model = GetEffectiveModelName(model);
222+
body.Source = sourceLanguage;
223+
body.Format = format;
224+
body.Model = GetEffectiveModelName(model);
217225
}
218226

219227
private string GetEffectiveModelName(string model)

apis/Google.Cloud.Translation.V2/Google.Cloud.Translation.V2/TranslationClientImpl.cs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ namespace Google.Cloud.Translation.V2
4141
/// </remarks>
4242
public sealed class TranslationClientImpl : TranslationClient
4343
{
44+
// The Translate method doesn't use the format enum. While we could switch on it, it's simpler to hard-code the values it expects.
45+
private const string HtmlFormat = "html";
46+
private const string TextFormat = "text";
47+
4448
private static readonly object _applicationNameLock = new object();
4549
private static string _applicationName = UserAgentHelper.GetDefaultUserAgent(typeof(TranslationClient));
4650
private static Action<HttpRequestMessage> _versionHeaderAction = UserAgentHelper.CreateRequestModifier(typeof(TranslationClient));
@@ -95,8 +99,9 @@ public override IList<TranslationResult> TranslateText(IEnumerable<string> textI
9599
{
96100
var items = ConvertToListAndCheckNoNullElements(textItems, nameof(textItems));
97101
GaxPreconditions.CheckNotNull(targetLanguage, nameof(targetLanguage));
98-
var request = Service.Translations.List(new Repeatable<string>(items), targetLanguage);
99-
ModifyRequest(request, sourceLanguage, FormatEnum.Text, model);
102+
var translateRequest = new TranslateTextRequest { Q = items, Target = targetLanguage };
103+
var request = Service.Translations.Translate(translateRequest);
104+
ModifyRequest(request, translateRequest, sourceLanguage, TextFormat, model);
100105
return UnpackTranslationResponse(items, sourceLanguage, targetLanguage, request.Execute());
101106
}
102107

@@ -105,8 +110,9 @@ public override IList<TranslationResult> TranslateHtml(IEnumerable<string> htmlI
105110
{
106111
var items = ConvertToListAndCheckNoNullElements(htmlItems, nameof(htmlItems));
107112
GaxPreconditions.CheckNotNull(targetLanguage, nameof(targetLanguage));
108-
var request = Service.Translations.List(new Repeatable<string>(items), targetLanguage);
109-
ModifyRequest(request, sourceLanguage, FormatEnum.Html, model);
113+
var translateRequest = new TranslateTextRequest { Q = items, Target = targetLanguage };
114+
var request = Service.Translations.Translate(translateRequest);
115+
ModifyRequest(request, translateRequest, sourceLanguage, HtmlFormat, model);
110116
return UnpackTranslationResponse(items, sourceLanguage, targetLanguage, request.Execute());
111117
}
112118

@@ -135,8 +141,9 @@ public override async Task<IList<TranslationResult>> TranslateTextAsync(IEnumera
135141
{
136142
var items = ConvertToListAndCheckNoNullElements(textItems, nameof(textItems));
137143
GaxPreconditions.CheckNotNull(targetLanguage, nameof(targetLanguage));
138-
var request = Service.Translations.List(new Repeatable<string>(items), targetLanguage);
139-
ModifyRequest(request, sourceLanguage, FormatEnum.Text, model);
144+
var translateRequest = new TranslateTextRequest { Q = items, Target = targetLanguage };
145+
var request = Service.Translations.Translate(translateRequest);
146+
ModifyRequest(request, translateRequest, sourceLanguage, TextFormat, model);
140147
var response = await request.ExecuteAsync(cancellationToken).ConfigureAwait(false);
141148
return UnpackTranslationResponse(items, sourceLanguage, targetLanguage, response);
142149
}
@@ -147,8 +154,9 @@ public override async Task<IList<TranslationResult>> TranslateHtmlAsync(IEnumera
147154
{
148155
var items = ConvertToListAndCheckNoNullElements(htmlItems, nameof(htmlItems));
149156
GaxPreconditions.CheckNotNull(targetLanguage, nameof(targetLanguage));
150-
var request = Service.Translations.List(new Repeatable<string>(items), targetLanguage);
151-
ModifyRequest(request, sourceLanguage, FormatEnum.Html, model);
157+
var translateRequest = new TranslateTextRequest { Q = items, Target = targetLanguage };
158+
var request = Service.Translations.Translate(translateRequest);
159+
ModifyRequest(request, translateRequest, sourceLanguage, HtmlFormat, model);
152160
var response = await request.ExecuteAsync(cancellationToken).ConfigureAwait(false);
153161
return UnpackTranslationResponse(items, sourceLanguage, targetLanguage, response);
154162
}
@@ -209,12 +217,12 @@ private static IList<Detection> UnpackDetectResponse(List<string> inputs, Detect
209217
.ToList();
210218
}
211219

212-
private void ModifyRequest(ListRequest request, string sourceLanguage, FormatEnum format, TranslationModel? model)
220+
private void ModifyRequest(TranslateRequest request, TranslateTextRequest body, string sourceLanguage, string format, TranslationModel? model)
213221
{
214222
request.ModifyRequest += _versionHeaderAction;
215-
request.Source = sourceLanguage;
216-
request.Format = format;
217-
request.Model = GetEffectiveModelName(model);
223+
body.Source = sourceLanguage;
224+
body.Format = format;
225+
body.Model = GetEffectiveModelName(model);
218226
}
219227

220228
private string GetEffectiveModelName(TranslationModel? model)

0 commit comments

Comments
 (0)