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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.