Index: native_client_sdk/src/libraries/nacl_io/mount_node_http.cc |
diff --git a/native_client_sdk/src/libraries/nacl_io/mount_node_http.cc b/native_client_sdk/src/libraries/nacl_io/mount_node_http.cc |
index 5a65d413de36d04fe4e7078f97c6ee8ce48aa517..25135e4faeae6a498788cd712c05a0963f85f2db 100644 |
--- a/native_client_sdk/src/libraries/nacl_io/mount_node_http.cc |
+++ b/native_client_sdk/src/libraries/nacl_io/mount_node_http.cc |
@@ -151,14 +151,14 @@ void MountNodeHttp::SetCachedSize(off_t size) { |
stat_.st_size = size; |
} |
-Error MountNodeHttp::FSync() { return ENOSYS; } |
+Error MountNodeHttp::FSync() { return EACCES; } |
Error MountNodeHttp::GetDents(size_t offs, |
struct dirent* pdir, |
size_t count, |
int* out_bytes) { |
*out_bytes = 0; |
- return ENOSYS; |
+ return EACCES; |
} |
Error MountNodeHttp::GetStat(struct stat* stat) { |
@@ -193,10 +193,8 @@ Error MountNodeHttp::GetStat(struct stat* stat) { |
SetCachedSize(static_cast<off_t>(entity_length)); |
} else if (cache_content_ && !has_cached_size_) { |
error = DownloadToCache(); |
- // TODO(binji): this error should not be dropped, but it requires a bit |
- // of a refactor of the tests. See crbug.com/245431 |
- // if (error) |
- // return error; |
+ if (error) |
+ return error; |
} else { |
// Don't use SetCachedSize here -- it is actually unknown. |
stat_.st_size = 0; |
@@ -230,13 +228,13 @@ Error MountNodeHttp::Read(const HandleAttr& attr, |
return error; |
} |
- return ReadPartialFromCache(attr.offs, buf, count, out_bytes); |
+ return ReadPartialFromCache(attr, buf, count, out_bytes); |
} |
- return DownloadPartial(attr.offs, buf, count, out_bytes); |
+ return DownloadPartial(attr, buf, count, out_bytes); |
} |
-Error MountNodeHttp::FTruncate(off_t size) { return ENOSYS; } |
+Error MountNodeHttp::FTruncate(off_t size) { return EACCES; } |
Error MountNodeHttp::Write(const HandleAttr& attr, |
const void* buf, |
@@ -244,7 +242,7 @@ Error MountNodeHttp::Write(const HandleAttr& attr, |
int* out_bytes) { |
// TODO(binji): support POST? |
*out_bytes = 0; |
- return ENOSYS; |
+ return EACCES; |
} |
Error MountNodeHttp::GetSize(size_t* out_size) { |
@@ -342,6 +340,8 @@ Error MountNodeHttp::OpenUrl(const char* method, |
*out_response_headers = |
ParseHeaders(response_headers_str, response_headers_length); |
+ var_interface->Release(response_headers_var); |
+ |
return 0; |
} |
@@ -404,23 +404,25 @@ Error MountNodeHttp::DownloadToCache() { |
} |
} |
-Error MountNodeHttp::ReadPartialFromCache(size_t offs, |
+Error MountNodeHttp::ReadPartialFromCache(const HandleAttr& attr, |
void* buf, |
int count, |
int* out_bytes) { |
*out_bytes = 0; |
+ size_t size = cached_data_.size(); |
- if (offs > cached_data_.size()) |
- return EINVAL; |
+ if (attr.offs + count > size) |
+ count = size - attr.offs; |
- count = std::min(count, static_cast<int>(cached_data_.size() - offs)); |
- memcpy(buf, &cached_data_.data()[offs], count); |
+ if (count <= 0) |
+ return 0; |
+ memcpy(buf, &cached_data_.data()[attr.offs], count); |
*out_bytes = count; |
return 0; |
} |
-Error MountNodeHttp::DownloadPartial(size_t offs, |
+Error MountNodeHttp::DownloadPartial(const HandleAttr& attr, |
void* buf, |
size_t count, |
int* out_bytes) { |
@@ -433,8 +435,8 @@ Error MountNodeHttp::DownloadPartial(size_t offs, |
snprintf(&buffer[0], |
sizeof(buffer), |
"bytes=%" PRIuS "-%" PRIuS, |
- offs, |
- offs + count - 1); |
+ attr.offs, |
+ attr.offs + count - 1); |
headers["Range"] = buffer; |
PP_Resource loader; |
@@ -462,12 +464,12 @@ Error MountNodeHttp::DownloadPartial(size_t offs, |
// No partial result, read everything starting from the part we care about. |
size_t content_length; |
if (ParseContentLength(response_headers, &content_length)) { |
- if (offs >= content_length) |
+ if (attr.offs >= content_length) |
return EINVAL; |
// Clamp count, if trying to read past the end of the file. |
- if (offs + count > content_length) { |
- count = content_length - offs; |
+ if (attr.offs + count > content_length) { |
+ count = content_length - attr.offs; |
} |
} |
} else if (statuscode == STATUSCODE_PARTIAL_CONTENT) { |
@@ -476,7 +478,7 @@ Error MountNodeHttp::DownloadPartial(size_t offs, |
size_t entity_length; |
if (ParseContentRange( |
response_headers, &read_start, &read_end, &entity_length)) { |
- if (read_start > offs || read_start > read_end) { |
+ if (read_start > attr.offs || read_start > read_end) { |
// If this error occurs, the server is returning bogus values. |
return EINVAL; |
} |
@@ -488,14 +490,14 @@ Error MountNodeHttp::DownloadPartial(size_t offs, |
// exactly what we asked for. This can happen even when the server |
// returns 200 -- the cache may return 206 in this case, but not modify |
// the headers. |
- read_start = offs; |
+ read_start = attr.offs; |
} |
} |
- if (read_start < offs) { |
+ if (read_start < attr.offs) { |
// We aren't yet at the location where we want to start reading. Read into |
// our dummy buffer until then. |
- size_t bytes_to_read = offs - read_start; |
+ size_t bytes_to_read = attr.offs - read_start; |
if (buffer_.size() < bytes_to_read) |
buffer_.resize(std::min(bytes_to_read, MAX_READ_BUFFER_SIZE)); |