Swazoo as reverse proxy?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
40 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Re: Swazoo as reverse proxy?

Sophie424
"Ramon Leon" <[hidden email]> wrote

> +1, it's just too easy to install Apache to serve all the static content
> and
> non Smalltalk stuff.

You are certainly right for someone who has done this before, but to us
newbies it seems scary to think of installing, configuring, and managing
Apache.

And if the Seaside app we build is, in turn, not delivered as an
extranet-based web service but instead installed separately by individual
end-users or small groups, it is even more of an issue there.

So while I understand the cons, I definitely see some pros as well.

... Sophie



_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Swazoo as reverse proxy?

Boris Popov, DeepCove Labs (SNN)
In reply to this post by Janko Mivšek
Re: [Seaside] Re: Swazoo as reverse proxy?

Well, for internal deployments of this small scale that don't need ssl and other advanced features Swazoo, Kom and others are already good enough, isn't it?

Cheers!

-Boris (via BlackBerry)

----- Original Message -----
From: [hidden email] <[hidden email]>
To: [hidden email] <[hidden email]>
Sent: Sat Feb 09 14:18:28 2008
Subject: [Seaside] Re: Swazoo as reverse proxy?

"Ramon Leon" <[hidden email]> wrote

> +1, it's just too easy to install Apache to serve all the static content
> and
> non Smalltalk stuff.

You are certainly right for someone who has done this before, but to us
newbies it seems scary to think of installing, configuring, and managing
Apache.

And if the Seaside app we build is, in turn, not delivered as an
extranet-based web service but instead installed separately by individual
end-users or small groups, it is even more of an issue there.

So while I understand the cons, I definitely see some pros as well.

... Sophie



_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside


_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Swazoo as reverse proxy?

Sophie424
"Boris Popov" <[hidden email]> wrote

> Well, for internal deployments of this small scale that don't need ssl and
> other advanced features Swazoo, Kom and others are already good enough,
> isn't it?
>

Dunno. e.g. Does Swazoo server static content? I don't think Kom does. Not
sure what other "features" make or don't make sense, and I do understand the
points about not re-inventing Apache.

Unsure ... Sophie



_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Swazoo as reverse proxy?

Randal L. Schwartz
In reply to this post by Boris Popov, DeepCove Labs (SNN)
>>>>> "Boris" == Boris Popov <[hidden email]> writes:

Boris> Well, for internal deployments of this small scale that don't need ssl
Boris> and other advanced features Swazoo, Kom and others are already good
Boris> enough, isn't it?  Cheers!

Swazoo is fine (I think).  Kom is missing a way to bind only to 127.0.0.1 if
it is indeed only for a personal installation.  I was going to help fix Kom to
bind to specific IPs, but now that I know Swazoo does it, I'm abandoning Kom,
sorry.

--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<[hidden email]> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Re: Swazoo as reverse proxy?

Boris Popov, DeepCove Labs (SNN)
In reply to this post by Janko Mivšek
Re: [Seaside] Re: Re: Swazoo as reverse proxy?

Both serve content from libraries well enough, did you mean some other static content? Dumping those resources to the front end web server is usually done only for larger deployments as an optimization...

Cheers!

-Boris (via BlackBerry)

----- Original Message -----
From: [hidden email] <[hidden email]>
To: [hidden email] <[hidden email]>
Sent: Sat Feb 09 14:28:12 2008
Subject: [Seaside] Re: Re: Swazoo as reverse proxy?

"Boris Popov" <[hidden email]> wrote

> Well, for internal deployments of this small scale that don't need ssl and
> other advanced features Swazoo, Kom and others are already good enough,
> isn't it?
>

Dunno. e.g. Does Swazoo server static content? I don't think Kom does. Not
sure what other "features" make or don't make sense, and I do understand the
points about not re-inventing Apache.

Unsure ... Sophie



_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside


_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Re: Swazoo as reverse proxy?

Sophie424
"Boris Popov" <[hidden email]> wrote

> Both serve content from libraries well enough, did you mean some other
> static content?

WAFileLIbrary? I meant static file-system content. I see that as a feature,
not an optimization.

Sophie



_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Re: Re: Swazoo as reverse proxy?

Lukas Renggli
> > Both serve content from libraries well enough, did you mean some other
> > static content?
>
> WAFileLIbrary? I meant static file-system content. I see that as a feature,
> not an optimization.

Seaside will be able to do that in 2.9.

Lukas

--
Lukas Renggli
http://www.lukas-renggli.ch
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Swazoo as reverse proxy?

Avi Bryant-2
In reply to this post by Randal L. Schwartz
On 2/9/08, Randal L. Schwartz <[hidden email]> wrote:

> Swazoo is fine (I think).  Kom is missing a way to bind only to 127.0.0.1 if
> it is indeed only for a personal installation.  I was going to help fix Kom to
> bind to specific IPs, but now that I know Swazoo does it, I'm abandoning Kom,
> sorry.

This is a one line change to Kom.  Look at #pvtNewListener: .  The
send to #listenOn:backlogSize: can be changed to
#listenOn:backlogSize:interface: .  For example:

pvtNewListener: backlogSize
        "Create a new socket that listens on our port.  The backlog is how
many simultaneous
        connections to accept at the same time"

        | listener |
        listener := self socketClass newTCP.
        self socketsToDestroy add: listener.
        listener listenOn: portNumber backlogSize: backlogSize interface:
#(127 0 0 1) asByteArray.
        ^listener
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Swazoo as reverse proxy?

Randal L. Schwartz
>>>>> "Avi" == Avi Bryant <[hidden email]> writes:

Avi> This is a one line change to Kom.  Look at #pvtNewListener: .  The
Avi> send to #listenOn:backlogSize: can be changed to
Avi> #listenOn:backlogSize:interface: .  For example:

Well, I was looking on what it would take to propogate that all the way up to
the WAKom level, which is still about three layers above that.

--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<[hidden email]> <URL:http://www.stonehenge.com/merlyn/>
Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Re: Re: Swazoo as reverse proxy?

Sophie424
In reply to this post by Lukas Renggli
"Lukas Renggli" <[hidden email]> wrote in message

>> WAFileLIbrary? I meant static file-system content. I see that as a
>> feature,
>> not an optimization.
>
> Seaside will be able to do that in 2.9.

That's great to hear. Would navigating that file-system content be:
- done within a Seaside session (would be good, I believe)
- optionally embeddable within a Seaside component (iframe-ish)?
- otherwise free of overhead across fwd/back buttons etc.? (continuations?
component trees?)

Any guess on weeks/months/years until 2.9 is an option?

Thanks - Sophie



_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Re: Re: Re: Swazoo as reverse proxy?

Lukas Renggli
> >> WAFileLIbrary? I meant static file-system content. I see that as a
> >> feature,
> >> not an optimization.
> >
> > Seaside will be able to do that in 2.9.
>
> That's great to hear. Would navigating that file-system content be:
> - done within a Seaside session (would be good, I believe)

We have all the tools. It is just a matter of adding it. And since so
many people request it we will have to do it ;-)

The idea is to have a special FileLibrary that provides its resources
from a freely configurable file-system path, instead of using its
methods. It will be slow and inefficient (like the FileLibrary already
is), but it will make file serving easy. And, since it only builds on
top of Seaside, it will work with whatever Server you are using Kom,
Listener, Swazoo, FastCGI, ... on whatever Smalltalk platform you
want.

> - optionally embeddable within a Seaside component (iframe-ish)?
> - otherwise free of overhead across fwd/back buttons etc.? (continuations?
> component trees?)

Yes, like the FileLibrary.

> Any guess on weeks/months/years until 2.9 is an option?

ESUG is usually a good time to announce things ... ;-)

Lukas

--
Lukas Renggli
http://www.lukas-renggli.ch
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Swazoo as reverse proxy?

Zulq Alam-2
Lukas Renggli wrote:

> The idea is to have a special FileLibrary that provides its resources
> from a freely configurable file-system path, instead of using its
> methods. It will be slow and inefficient (like the FileLibrary already
> is), but it will make file serving easy.

I find myself doing this whenever I have a large script or file:

MyFileLibrary>>scriptJs
   ^ (StandardFileStream fileNamed: 'script.js')
     contentsOfEntireFile

It makes no noticeable difference during development.

Do you mean something like this but better managed?

Regards,
Zulq.

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Swazoo as reverse proxy?

Lukas Renggli
> Do you mean something like this but better managed?

Yes.

Lukas

--
Lukas Renggli
http://www.lukas-renggli.ch
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Swazoo as reverse proxy?

Colin Putney
In reply to this post by Zulq Alam-2

On 10-Feb-08, at 3:38 AM, Zulq Alam wrote:

Lukas Renggli wrote:

The idea is to have a special FileLibrary that provides its resources
from a freely configurable file-system path, instead of using its
methods. It will be slow and inefficient (like the FileLibrary already
is), but it will make file serving easy.

I find myself doing this whenever I have a large script or file:

MyFileLibrary>>scriptJs
 ^ (StandardFileStream fileNamed: 'script.js')
   contentsOfEntireFile

Personally, I like to go in the other direction. The point of this is to be able to work with the library files using tools more suited to other languages - Javascript, CSS and whatnot, yes?

I've hacked the Squeak FTP server[1] to serve the library methods as files. It #performs them for a download and recompiles them for an upload. Most text editors can handle editing remote files over FTP, so it works nicely.

Colin



_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Swazoo as reverse proxy?

Sophie424
"Colin Putney" <[hidden email]> wrote

> I've hacked the Squeak FTP server[1] to serve the library methods as
> files. It #performs them for a download and recompiles them for an
> upload. Most text editors can handle editing remote files over FTP, so
> it works nicely.

Neat!

I got it loaded (after getting FastSocketStream) and can connect into "/"
with no directory contents.

How do I point it at MyFileLibrary?

Thanks - Sophie



_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Re: Swazoo as reverse proxy?

Colin Putney

On 10-Feb-08, at 2:19 PM, itsme213 wrote:

> "Colin Putney" <[hidden email]> wrote
>
>> I've hacked the Squeak FTP server[1] to serve the library methods as
>> files. It #performs them for a download and recompiles them for an
>> upload. Most text editors can handle editing remote files over FTP,  
>> so
>> it works nicely.
>
> Neat!
>
> I got it loaded (after getting FastSocketStream) and can connect  
> into "/"
> with no directory contents.
>
> How do I point it at MyFileLibrary?

I actually use it for OB-Web, which is not Seaside based, but it  
probably wouldn't be much effort to adapt to WAFileLibrary. You can  
see the code here:

http://source.wiresong.ca/ob/OB-Web-lr.56.mcz
http://source.wiresong.ca/ob/OB-Dev-FTP-cwp.3.mcz

FTPInternalFile wraps an instance of OBInternalFile, and implements  
the protocol that the web server expects.

Colin
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Swazoo as reverse proxy?

Brian Brown-2
In reply to this post by Janko Mivšek
Avi> This is a one line change to Kom.  Look at #pvtNewListener: .  The
Avi> send to #listenOn:backlogSize: can be changed to
Avi> #listenOn:backlogSize:interface: .  For example:

Ha!

I just spent about an hour trying to see my seaside app running in
Parallels on XP from other machines on my network, trying various network
configs and finally just booted into windows to try it from there. I still
couldn't see it except on localhost, and thought... "No, I didn't put that
Kom change in there..." and found:

pvtNewListener: backlogSize
        "Create a new socket that listens on our port.  The backlog is how many
simultaneous
        connections to accept at the same time"

        | listener |
        listener := self socketClass newTCP.
        self socketsToDestroy add: listener.
        listener listenOn: portNumber backlogSize: backlogSize interface: #(127 0
0 1) asByteArray.
        ^listener

... from avi 2/5/2006 18:23

so it was only binding to localhost (127.0.0.1).

Very, very strange :)

- Brian

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

RE: Re: Re: Swazoo as reverse proxy?

Boris Popov, DeepCove Labs (SNN)
Lesson: next time you have an issue just grep the image for 'avi' first.

;)

-Boris

--
+1.604.689.0322
DeepCove Labs Ltd.
4th floor 595 Howe Street
Vancouver, Canada V6C 2T5
http://tinyurl.com/r7uw4

[hidden email]

CONFIDENTIALITY NOTICE

This email is intended only for the persons named in the message
header. Unless otherwise indicated, it contains information that is
private and confidential. If you have received it in error, please
notify the sender and delete the entire message including any
attachments.

Thank you.

> -----Original Message-----
> From: [hidden email] [mailto:seaside-
> [hidden email]] On Behalf Of Brian Brown
> Sent: Wednesday, February 13, 2008 11:24 AM
> To: Seaside List
> Subject: [Seaside] Re: Re: Swazoo as reverse proxy?
>
> Avi> This is a one line change to Kom.  Look at #pvtNewListener: .
The
> Avi> send to #listenOn:backlogSize: can be changed to
> Avi> #listenOn:backlogSize:interface: .  For example:
>
> Ha!
>
> I just spent about an hour trying to see my seaside app running in
> Parallels on XP from other machines on my network, trying various
network
> configs and finally just booted into windows to try it from there. I
still
> couldn't see it except on localhost, and thought... "No, I didn't put
that
> Kom change in there..." and found:
>
> pvtNewListener: backlogSize
> "Create a new socket that listens on our port.  The backlog is
how
> many
> simultaneous
> connections to accept at the same time"
>
> | listener |
> listener := self socketClass newTCP.
> self socketsToDestroy add: listener.
> listener listenOn: portNumber backlogSize: backlogSize
interface:

> #(127 0
> 0 1) asByteArray.
> ^listener
>
> ... from avi 2/5/2006 18:23
>
> so it was only binding to localhost (127.0.0.1).
>
> Very, very strange :)
>
> - Brian
>
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: Re: Re: Swazoo as reverse proxy?

Philippe Marschall
SeasidePlatformSupport methodsOf: 'avi'

2008/2/13, Boris Popov <[hidden email]>:

> Lesson: next time you have an issue just grep the image for 'avi' first.
>
> ;)
>
> -Boris
>
> --
> +1.604.689.0322
> DeepCove Labs Ltd.
> 4th floor 595 Howe Street
> Vancouver, Canada V6C 2T5
> http://tinyurl.com/r7uw4
>
> [hidden email]
>
> CONFIDENTIALITY NOTICE
>
> This email is intended only for the persons named in the message
> header. Unless otherwise indicated, it contains information that is
> private and confidential. If you have received it in error, please
> notify the sender and delete the entire message including any
> attachments.
>
> Thank you.
>
> > -----Original Message-----
> > From: [hidden email] [mailto:seaside-
> > [hidden email]] On Behalf Of Brian Brown
> > Sent: Wednesday, February 13, 2008 11:24 AM
> > To: Seaside List
> > Subject: [Seaside] Re: Re: Swazoo as reverse proxy?
> >
> > Avi> This is a one line change to Kom.  Look at #pvtNewListener: .
> The
> > Avi> send to #listenOn:backlogSize: can be changed to
> > Avi> #listenOn:backlogSize:interface: .  For example:
> >
> > Ha!
> >
> > I just spent about an hour trying to see my seaside app running in
> > Parallels on XP from other machines on my network, trying various
> network
> > configs and finally just booted into windows to try it from there. I
> still
> > couldn't see it except on localhost, and thought... "No, I didn't put
> that
> > Kom change in there..." and found:
> >
> > pvtNewListener: backlogSize
> >       "Create a new socket that listens on our port.  The backlog is
> how
> > many
> > simultaneous
> >       connections to accept at the same time"
> >
> >       | listener |
> >       listener := self socketClass newTCP.
> >       self socketsToDestroy add: listener.
> >       listener listenOn: portNumber backlogSize: backlogSize
> interface:
> > #(127 0
> > 0 1) asByteArray.
> >       ^listener
> >
> > ... from avi 2/5/2006 18:23
> >
> > so it was only binding to localhost (127.0.0.1).
> >
> > Very, very strange :)
> >
> > - Brian
> >
> > _______________________________________________
> > seaside mailing list
> > [hidden email]
> > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

RE: Re: Re: Swazoo as reverse proxy?

Boris Popov, DeepCove Labs (SNN)
Even better,

-Boris

--
+1.604.689.0322
DeepCove Labs Ltd.
4th floor 595 Howe Street
Vancouver, Canada V6C 2T5
http://tinyurl.com/r7uw4

[hidden email]

CONFIDENTIALITY NOTICE

This email is intended only for the persons named in the message
header. Unless otherwise indicated, it contains information that is
private and confidential. If you have received it in error, please
notify the sender and delete the entire message including any
attachments.

Thank you.

> -----Original Message-----
> From: [hidden email] [mailto:seaside-
> [hidden email]] On Behalf Of Philippe Marschall
> Sent: Wednesday, February 13, 2008 12:40 PM
> To: Seaside - general discussion
> Subject: Re: [Seaside] Re: Re: Swazoo as reverse proxy?
>
> SeasidePlatformSupport methodsOf: 'avi'
>
> 2008/2/13, Boris Popov <[hidden email]>:
> > Lesson: next time you have an issue just grep the image for 'avi'
first.

> >
> > ;)
> >
> > -Boris
> >
> > --
> > +1.604.689.0322
> > DeepCove Labs Ltd.
> > 4th floor 595 Howe Street
> > Vancouver, Canada V6C 2T5
> > http://tinyurl.com/r7uw4
> >
> > [hidden email]
> >
> > CONFIDENTIALITY NOTICE
> >
> > This email is intended only for the persons named in the message
> > header. Unless otherwise indicated, it contains information that is
> > private and confidential. If you have received it in error, please
> > notify the sender and delete the entire message including any
> > attachments.
> >
> > Thank you.
> >
> > > -----Original Message-----
> > > From: [hidden email] [mailto:seaside-
> > > [hidden email]] On Behalf Of Brian Brown
> > > Sent: Wednesday, February 13, 2008 11:24 AM
> > > To: Seaside List
> > > Subject: [Seaside] Re: Re: Swazoo as reverse proxy?
> > >
> > > Avi> This is a one line change to Kom.  Look at #pvtNewListener: .
> > The
> > > Avi> send to #listenOn:backlogSize: can be changed to
> > > Avi> #listenOn:backlogSize:interface: .  For example:
> > >
> > > Ha!
> > >
> > > I just spent about an hour trying to see my seaside app running in
> > > Parallels on XP from other machines on my network, trying various
> > network
> > > configs and finally just booted into windows to try it from there.
I
> > still
> > > couldn't see it except on localhost, and thought... "No, I didn't
put
> > that
> > > Kom change in there..." and found:
> > >
> > > pvtNewListener: backlogSize
> > >       "Create a new socket that listens on our port.  The backlog
is

> > how
> > > many
> > > simultaneous
> > >       connections to accept at the same time"
> > >
> > >       | listener |
> > >       listener := self socketClass newTCP.
> > >       self socketsToDestroy add: listener.
> > >       listener listenOn: portNumber backlogSize: backlogSize
> > interface:
> > > #(127 0
> > > 0 1) asByteArray.
> > >       ^listener
> > >
> > > ... from avi 2/5/2006 18:23
> > >
> > > so it was only binding to localhost (127.0.0.1).
> > >
> > > Very, very strange :)
> > >
> > > - Brian
> > >
> > > _______________________________________________
> > > seaside mailing list
> > > [hidden email]
> > > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> > _______________________________________________
> > seaside mailing list
> > [hidden email]
> > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

detection.png (33K) Download Attachment
12