Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FIRStorageUploadTask: fail on invalid file URL #2458

Merged
merged 12 commits into from Mar 4, 2019

Conversation

@maksymmalyhin
Copy link
Contributor

commented Feb 28, 2019

Partial fix for issue #2350.

  • Fail early with an informative error in case of an invalid file URL.

Another part of the fix has to be done in GTMSessionUploadFetcher (following issue)

@bstpierr

This comment has been minimized.

Copy link
Contributor

commented Feb 28, 2019

It looks like the style linter needs to be run.

You might need to overwrite the Google version of clang-format.

@maksymmalyhin

This comment has been minimized.

Copy link
Contributor Author

commented Feb 28, 2019

@bstpierr Thank you, I'll do that. Probably, I'll add the linter to my git hooks to avoid such errors in future.

@ryanwilson ryanwilson requested review from schmidt-sebastian and removed request for asciimike Feb 28, 2019

@ryanwilson
Copy link
Member

left a comment

Please fix the linting error and wait for a review from @schmidt-sebastian, otherwise LGTM.

if (![_fileURL checkResourceIsReachableAndReturnError:&fileReachabilityError]) {
if (outError != NULL) {
NSString *description =
[NSString stringWithFormat:@"File at URL: %@ is not reachable", _fileURL.absoluteString];

This comment has been minimized.

Copy link
@ryanwilson

ryanwilson Feb 28, 2019

Member

Nit: punctuation at the end of the string.

NSString *description =
[NSString stringWithFormat:@"File at URL: %@ is not reachable", _fileURL.absoluteString];
*outError = [NSError errorWithDomain:FIRStorageErrorDomain
code:FIRStorageErrorCodeUnknown

This comment has been minimized.

Copy link
@ryanwilson

ryanwilson Feb 28, 2019

Member

I think this is fine for now, but we probably want to add a case to the to the FIRStorageErrorCode enum.

That will require an API review (I can go over the process with you) so we won't be able to do it this release.

This comment has been minimized.

Copy link
@maksymmalyhin

maksymmalyhin Feb 28, 2019

Author Contributor

I may create an issue for that so we don't forget about it.

This comment has been minimized.

Copy link
@ryanwilson

ryanwilson Feb 28, 2019

Member

Once this is approved by the Storage team and lands, that's a great idea.

This comment has been minimized.

Copy link
@maksymmalyhin

maksymmalyhin Feb 28, 2019

Author Contributor

Created - #2459

This comment has been minimized.

Copy link
@schmidt-sebastian

schmidt-sebastian Mar 2, 2019

Member

Just throwing this out there: Did you consider FIRStorageErrorCodeObjectNotFound? It's used today when a file doesn't exist on the backend, which isn't all that different from a locally missing file.

This comment has been minimized.

Copy link
@maksymmalyhin

maksymmalyhin Mar 3, 2019

Author Contributor

My concern with FIRStorageErrorCodeObjectNotFound is following: a typical file upload operation involves a remote object reference and a file URL, so if we have a single error code for both it may be confusing for users.

@@ -162,4 +162,28 @@ - (void)testCopy {
XCTAssertNotEqual(ref, copiedRef);
}

- (void)test_GivenReferenceWithPath_WhenPutNonExistingFile_ThenCompletionIsCalledWithError {

This comment has been minimized.

Copy link
@ryanwilson

ryanwilson Feb 28, 2019

Member

Although I do think this is a better naming format, it doesn't match the naming for the rest of the file. Maybe something like testReferenceWithNonExistentFileFailsWithCompletion would match better?

This comment has been minimized.

Copy link
@maksymmalyhin

maksymmalyhin Feb 28, 2019

Author Contributor

yeah, sounds good, I'll correct this.

@schmidt-sebastian
Copy link
Member

left a comment

One question about the location of the existence check, but otherwise looks good!

@@ -72,6 +72,13 @@ - (void)dealloc {
- (void)enqueue {
__weak FIRStorageUploadTask *weakSelf = self;

NSError *contentValidationError;

This comment has been minimized.

Copy link
@schmidt-sebastian

schmidt-sebastian Mar 2, 2019

Member

Should this be move to the dispatchAsync block below to execute close to the actual upload?

This comment has been minimized.

Copy link
@maksymmalyhin

maksymmalyhin Mar 3, 2019

Author Contributor

yeah, that makes sense

NSString *description =
[NSString stringWithFormat:@"File at URL: %@ is not reachable", _fileURL.absoluteString];
*outError = [NSError errorWithDomain:FIRStorageErrorDomain
code:FIRStorageErrorCodeUnknown

This comment has been minimized.

Copy link
@schmidt-sebastian

schmidt-sebastian Mar 2, 2019

Member

Just throwing this out there: Did you consider FIRStorageErrorCodeObjectNotFound? It's used today when a file doesn't exist on the backend, which isn't all that different from a locally missing file.

@schmidt-sebastian schmidt-sebastian merged commit 4dfebfc into master Mar 4, 2019

2 checks passed

cla/google All necessary CLAs are signed
continuous-integration/travis-ci/pr The Travis CI build passed
Details
@schmidt-sebastian

This comment has been minimized.

Copy link
Member

commented Mar 4, 2019

Thanks for your contribution @maksymmalyhin!

@maksymmalyhin

This comment has been minimized.

Copy link
Contributor Author

commented Mar 4, 2019

@schmidt-sebastian I'm happy to help!

@maksymmalyhin maksymmalyhin deleted the mm-2350-putFileCompletion branch Mar 4, 2019

@maksymmalyhin maksymmalyhin self-assigned this Mar 15, 2019

*outError = [NSError errorWithDomain:FIRStorageErrorDomain
code:FIRStorageErrorCodeUnknown
userInfo:@{
NSUnderlyingErrorKey : fileReachabilityError,

This comment has been minimized.

Copy link
@LinusU

LinusU Apr 17, 2019

I'm trying to upload an mp4 file from Flutter with firebase_storage (got the file from image_picker, seems to work fine with jpeg from image_picker) and I'm hitting an app crash here.

fileReachabilityError is nil and thus I'm getting an NSInvalidException since you cannot add nil values to an NSDitctionary.

For some reason _fileURL is nil, which makes [_fileURL checkResourceIsReachableAndReturnError:&fileReachabilityError] return just nil, which triggers the if (!...) branch.

Sorry for not providing too much info, I'm still in the process of tracking it down but thought it would be good to see if anyone had any ideas ☺️

ping @maksymmalyhin

edit: the problem is that both _uploadData and _fileURL is null, because it was created with a nil data from Flutter

edit2: the problem is that image_picker returns a File object with a path like /file:///foo/bar/baz.mp4...

This comment has been minimized.

Copy link
@maksymmalyhin

maksymmalyhin Apr 17, 2019

Author Contributor

@LinusU Thank you for the report. That's a good case. Yeah, this part of code definitely does not expect _fileURL to be nil. We will fix it.

In the meanwhile, would you be able to post a comment about it to #2350 or create a separate ticket, so it is not lost.

As a workaround you should check the fileURL != nil before passing it to the putFile method.

This comment has been minimized.

Copy link
@LinusU

LinusU Apr 17, 2019

I've submitted flutter/plugins#1504 and flutter/plugins#1505 to fix this in Flutter, but would be great to see a fix here as well ☺️

I'll put a comment in the issue you linked open a new issue about it here as well!

edit: here we go 👉 #2852

This comment has been minimized.

Copy link
@maksymmalyhin

maksymmalyhin Apr 17, 2019

Author Contributor

@LinusU thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.