How should I record `HttpServletRequest`s that are sent to `doPost` in an `HttpServlet` for later playback?
I want to dump some requests (of type javax.servlet.http.HttpServletRequest
) into a file and then later replay them from the file, so that I can test future changes to the HttpServlet
. What's the best way to accomplish this?
So far, I'm trying to pull data out of the input stream associated with the request, and save this binary data into a file. Ultimately, this may require something like storing a byte-count prior to each saved input stream, so that I know where one request ends and the other begins.
Is there a simpler way to do this?
**EDIT: to clarify, these are not requests involving a browser. So far none of the开发者_高级运维 answers solves my particular problem, which I suppose boils down to serializing and deserializing an HttpServletRequest. I've tried just pulling the bytes from the input stream returned by request.getInputStream(). Unfortunately, if I turn this into a string, it seems that the resulting bytes cannot be parsed by Message.Builder.mergeFrom(bytes).
I'm putting up a bounty for anyone who knows how to solve my problem.
Perhaps you should have a look at Selenium ( http://seleniumhq.org/ ).
I say this because I am presuming that the reason you want to play back the requests is for testing purposes. Selenium records what you do in your browser, and can then play it back.
If you're trying to accomplish something else, perhaps you could explain what you're ultimately trying to do.
There are many local reverse-proxy tools that can 'record-and-playback' a HTTP session. Typically you setup your browser to use a localhost proxy server, perform the actions, save the session, then replay it. JMeter and Charles are two tools that are Java based.
Another option would be to use HttpClient to programmatically exercise your servlet. Using JUnit to execute the tests has an advantage in that it's easier to verify you are getting the 'correct' response.
In my particular case, I eventually solved the problem by using a CodedOutputStream
to write the com.google.protobuf.GeneratedMessage
(foo
below):
ByteArrayOutputStream bos = new ByteArrayOutputStream();
CodedOutputStream cos = CodedOutputStream.newInstance(bos);
foo.writeTo(cos);
This can be read in using a CodedInputStream
with something like:
byte[] ba = readBytesFromOutputFile();
CodedInputStream cis = CodedInputStream.newInstance(ba);
The CodedInputStream
can then be passed to a message builder to complete the deserialization.
精彩评论