Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(414)

Side by Side Diff: components/cronet/android/java/src/org/chromium/net/urlconnection/CronetFixedModeOutputStream.java

Issue 2131323002: [Cronet] Check whether request is done before spinning up message loop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: self review Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.net.urlconnection; 5 package org.chromium.net.urlconnection;
6 6
7 import org.chromium.base.VisibleForTesting; 7 import org.chromium.base.VisibleForTesting;
8 import org.chromium.net.UploadDataProvider; 8 import org.chromium.net.UploadDataProvider;
9 import org.chromium.net.UploadDataSink; 9 import org.chromium.net.UploadDataSink;
10 10
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 mContentLength = contentLength; 66 mContentLength = contentLength;
67 int bufferSize = (int) Math.min(mContentLength, sDefaultBufferLength); 67 int bufferSize = (int) Math.min(mContentLength, sDefaultBufferLength);
68 mBuffer = ByteBuffer.allocate(bufferSize); 68 mBuffer = ByteBuffer.allocate(bufferSize);
69 mConnection = connection; 69 mConnection = connection;
70 mMessageLoop = messageLoop; 70 mMessageLoop = messageLoop;
71 mBytesWritten = 0; 71 mBytesWritten = 0;
72 } 72 }
73 73
74 @Override 74 @Override
75 public void write(int oneByte) throws IOException { 75 public void write(int oneByte) throws IOException {
76 super.write(oneByte);
76 checkNotExceedContentLength(1); 77 checkNotExceedContentLength(1);
77 ensureBufferHasRemaining(); 78 ensureBufferHasRemaining();
78 mBuffer.put((byte) oneByte); 79 mBuffer.put((byte) oneByte);
79 mBytesWritten++; 80 mBytesWritten++;
80 uploadIfComplete(); 81 uploadIfComplete();
81 } 82 }
82 83
83 @Override 84 @Override
84 public void write(byte[] buffer, int offset, int count) throws IOException { 85 public void write(byte[] buffer, int offset, int count) throws IOException {
86 super.write(buffer, offset, count);
85 if (buffer.length - offset < count || offset < 0 || count < 0) { 87 if (buffer.length - offset < count || offset < 0 || count < 0) {
86 throw new IndexOutOfBoundsException(); 88 throw new IndexOutOfBoundsException();
87 } 89 }
88 checkNotExceedContentLength(count); 90 checkNotExceedContentLength(count);
89 int toSend = count; 91 int toSend = count;
90 while (toSend > 0) { 92 while (toSend > 0) {
91 ensureBufferHasRemaining(); 93 ensureBufferHasRemaining();
92 int sent = Math.min(toSend, mBuffer.remaining()); 94 int sent = Math.min(toSend, mBuffer.remaining());
93 mBuffer.put(buffer, offset + count - toSend, sent); 95 mBuffer.put(buffer, offset + count - toSend, sent);
94 toSend -= sent; 96 toSend -= sent;
(...skipping 24 matching lines...) Expand all
119 uploadBufferInternal(); 121 uploadBufferInternal();
120 } 122 }
121 } 123 }
122 124
123 /** 125 /**
124 * Helper function to upload {@code mBuffer} to the native stack. This 126 * Helper function to upload {@code mBuffer} to the native stack. This
125 * function blocks until {@code mBuffer} is consumed and there is space to 127 * function blocks until {@code mBuffer} is consumed and there is space to
126 * write more data. 128 * write more data.
127 */ 129 */
128 private void uploadBufferInternal() throws IOException { 130 private void uploadBufferInternal() throws IOException {
131 checkNotClosed();
129 mBuffer.flip(); 132 mBuffer.flip();
130 mMessageLoop.loop(); 133 mMessageLoop.loop();
131 } 134 }
132 135
133 /** 136 /**
134 * Throws {@link java.net.ProtocolException} if adding {@code numBytes} will 137 * Throws {@link java.net.ProtocolException} if adding {@code numBytes} will
135 * exceed content length. 138 * exceed content length.
136 */ 139 */
137 private void checkNotExceedContentLength(int numBytes) throws ProtocolExcept ion { 140 private void checkNotExceedContentLength(int numBytes) throws ProtocolExcept ion {
138 if (mBytesWritten + numBytes > mContentLength) { 141 if (mBytesWritten + numBytes > mContentLength) {
139 throw new ProtocolException("expected " 142 throw new ProtocolException("expected "
140 + (mContentLength - mBytesWritten) + " bytes but received " 143 + (mContentLength - mBytesWritten) + " bytes but received "
141 + numBytes); 144 + numBytes);
142 } 145 }
143 } 146 }
144 147
145 // TODO(xunjieli): implement close().
146
147 // Below are CronetOutputStream implementations: 148 // Below are CronetOutputStream implementations:
148 149
149 @Override 150 @Override
150 void setConnected() throws IOException { 151 void setConnected() throws IOException {
151 // Do nothing. 152 // Do nothing.
152 } 153 }
153 154
154 @Override 155 @Override
155 void checkReceivedEnoughContent() throws IOException { 156 void checkReceivedEnoughContent() throws IOException {
156 if (mBytesWritten < mContentLength) { 157 if (mBytesWritten < mContentLength) {
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 } 196 }
196 197
197 /** 198 /**
198 * Sets the default buffer length for use in tests. 199 * Sets the default buffer length for use in tests.
199 */ 200 */
200 @VisibleForTesting 201 @VisibleForTesting
201 static void setDefaultBufferLengthForTesting(int length) { 202 static void setDefaultBufferLengthForTesting(int length) {
202 sDefaultBufferLength = length; 203 sDefaultBufferLength = length;
203 } 204 }
204 } 205 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698