Re: random maddening bug - "corrupted" file upload contents
Sven Van Caekenberghe <[email protected]>
| Newsgroups | gmane.comp.lang.smalltalk.squeak.seaside |
|---|---|
| Message-ID | <[email protected]> |
Cyrille, I wrote a file like this: FileLocator temp / 'myzip.zip' writeStreamDo: [ :out | out binary; nextPutAll: #[80 75 3 4 10 0 0 0 0 0 125 83 67 73 0 0 0 0 0 0] ]. Which I can read as follows: FileLocator temp / 'myzip.zip' binaryReadStreamDo: [ :in | in upToEnd ]. => #[80 75 3 4 10 0 0 0 0 0 125 83 67 73 0 0 0 0 0 0] If I upload this file to http://localhost:1701/form-test-3 this works perfectly (macOS 10.13.2 Pharo #60402, Safari. Firefox & Chrome), first time and second time. Maybe you should try on a co-workers machine just to make sure it is not a local problem on your machine ? Sven > On 22 Dec 2017, at 15:44, Cyrille Delaunay <[email protected]> wrote: > > Thank you sven for the advice. > I think have been able to reproduce the issue by only playing with > > http://localhost:1701/form-test-3 > > First of all, here are several ways I can retrieve the expected bytes constituting my file: > - From terminal: > "od -t x1 myfile.zip " > => gives me: 50 4b 03 04 0a 00 00 00 00 00 7d 53 43 49 00 00 ... > (which matches in decimal: 80 75 3 4 10 0 0 0 0 0 125 83 67 73 ... ) > > - From Pharo: > 'myfile.zip' asFileReference binaryReadStreamDo: [ :in | encoding := (ZnCharacterEncoder detectEncoding: in upToEnd) ]. > (('myfile.zip' asFileReference binaryReadStreamDo: > [ :in | (ZnCharacterReadStream on: in encoding: encoding) upToEnd ]) copyFrom: 1 to: 40) asOrderedCollection collect: #codePoint" > => gives me: an OrderedCollection(80 75 3 4 10 0 0 0 0 0 125 83 67 73 0 0 0 0 0 0) > > > Now, after triggering the upload of this file from http://localhost:1701/form-test-3, > I have been able to halt in method #executeOneRequestResponseOn:, > and to notice again something that looks wrong regarding the first four bytes: > > <Screen Shot 2017-12-22 at 9.48.17 AM.png> > > The web interface displayed something confirming this "strange" first bytes > > <Screen Shot 2017-12-22 at 3.32.19 PM.png> > > > Right after, I did the exact same upload test again and halt at the same location. > And this time: > > <Screen Shot 2017-12-22 at 3.35.43 PM.png> > > > <Screen Shot 2017-12-22 at 3.38.39 PM.png> > > > Problem is gone ! > I am starting to pull out my hair from my head :) > > 2017-12-22 11:54 GMT+01:00 Sven Van Caekenberghe <[email protected]>: > Cyril, > > If you think something is wrong with the low level Zinc implementation, you could try without Seaside. > > ZnServer startDefaultOn: 1701. > > http://localhost:1701/form-test-3 > > You could try to debug/inspect from #formTest3: > > HTH, > > Sven > > > On 22 Dec 2017, at 11:38, Cyrille Delaunay <[email protected]> wrote: > > > > Hi everyone, > > > > Since some times, we are experimenting a random bug while using seaside file upload. > > Not sure at all about the exact origin of this issue (Application specific, Zinc, Seaside, Pharo ?). > > But as it start to drive us mad, I'm sharing our problem with you. > > Maybe someone would already have experimented something similar or would have a good feeling about the issue. > > > > High level description: > > > > We have a file upload element rendered with seaside. > > The callback of this file upload element is triggered when the form is submitted via a submit button. > > Problem: Within this callback, the raw contents of the WAFile does not match the expected contents of the selected file. > > The first 4 bytes are "wrong", and rest of the byte array seems ok. > > This issue occurs randomly and we haven't been able to determine / guess any context criteria. > > > > > > Debugging: > > > > In order to figure out what was wrong, we tried to catch a place in pharo where file contents started to differ from the expected file contents. > > > > The earlier upload step in which we have been able to notice this delta, is method > > > > ZnMultiThreadedServer >> executeOneRequestResponseOn: > > > > In this method, a http request is read and materialized from an input stream, > > From my naive point of vue, this stream looks like a kind of communication entry point between the web browser and pharo. > > > > The zip input file I am trying to upload is expected to begin with the following bytes: > > #[80 75 3 4 10 0 0 0 0 0 125 83 67 73 ... > > > > The request object built within #executeOneRequestResponseOn: points to an"entity" variable, which points to a "parts" variable, which points to a single ZnMimePart. > > This ZnMimePart points to a byte array beginning with: > > #[0 0 0 0 10 0 0 0 0 0 125 83 67 73 ... > > > > I also experimented another case where > > The request object built within #executeOneRequestResponseOn: points to an"entity" variable, which points to a "parts" variable, which points to multiple ZnMimePart. > > One of the ZnMimePart points to a byte array beginning with: > > #[138 67 80 75 10 0 0 0 0 0 125 83 67 73 > > > > We can see that in both cases the first 4 bytes do not match the expected first 4 bytes of the file. > > As a consequence, later in our process, > > pharo gets a error while trying to unzip this upload file, complaining about a "'bad LH signature at 0'". > > > > > > Does this speak to anyone ? > > > > > > > > -- > > Cyrille Delaunay > > _______________________________________________ > > seaside mailing list > > [email protected] > > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > > _______________________________________________ > seaside mailing list > [email protected] > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside > > > > -- > Cyrille Delaunay > _______________________________________________ > seaside mailing list > [email protected] > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside _______________________________________________ seaside mailing list [email protected] http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside