001: package com.meterware.httpunit;
002:
003: /********************************************************************************************************************
004: * $Id: PostMethodWebRequest.java,v 1.27 2004/09/29 17:15:24 russgold Exp $
005: *
006: * Copyright (c) 2000-2002, 2004, Russell Gold
007: *
008: * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
009: * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
010: * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
011: * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
012: *
013: * The above copyright notice and this permission notice shall be included in all copies or substantial portions
014: * of the Software.
015: *
016: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
017: * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
018: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
019: * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
020: * DEALINGS IN THE SOFTWARE.
021: *
022: *******************************************************************************************************************/
023: import java.io.IOException;
024: import java.io.InputStream;
025: import java.io.OutputStream;
026: import java.net.URL;
027:
028: /**
029: * An HTTP request using the POST method.
030: **/
031: public class PostMethodWebRequest extends MessageBodyWebRequest {
032:
033: /**
034: * Constructs a web request using a specific absolute url string.
035: **/
036: public PostMethodWebRequest(String urlString) {
037: super (urlString);
038: }
039:
040: /**
041: * Constructs a web request using a specific absolute url string and input stream.
042: * @param urlString the URL to which the request should be issued
043: * @param source an input stream which will provide the body of this request
044: * @param contentType the MIME content type of the body, including any character set
045: **/
046: public PostMethodWebRequest(String urlString, InputStream source,
047: String contentType) {
048: super (urlString);
049: _body = new InputStreamMessageBody(this , source, contentType);
050: }
051:
052: /**
053: * Constructs a web request with a specific target.
054: **/
055: public PostMethodWebRequest(URL urlBase, String urlString,
056: String target) {
057: super (urlBase, urlString, target);
058: }
059:
060: /**
061: * Selects whether MIME-encoding will be used for this request. MIME-encoding changes the way the request is sent
062: * and is required for requests which include file parameters. This method may only be called for a request
063: * which was not created from a form.
064: **/
065: public void setMimeEncoded(boolean mimeEncoded) {
066: super .setMimeEncoded(mimeEncoded);
067: }
068:
069: /**
070: * Returns the HTTP method defined for this request.
071: **/
072: public String getMethod() {
073: return "POST";
074: }
075:
076: /**
077: * Returns the query string defined for this request.
078: **/
079: public String getQueryString() {
080: try {
081: URLEncodedString encoder = new URLEncodedString();
082: getParameterHolder().recordPredefinedParameters(encoder);
083: return encoder.getString();
084: } catch (IOException e) {
085: throw new RuntimeException("Programming error: " + e); // should never happen
086: }
087: }
088:
089: /**
090: * Returns true if selectFile may be called with this parameter.
091: */
092: protected boolean maySelectFile(String parameterName) {
093: return isMimeEncoded() && isFileParameter(parameterName);
094: }
095:
096: //----------------------------- MessageBodyWebRequest methods ---------------------------
097:
098: protected MessageBody getMessageBody() {
099: if (_body == null) {
100: _body = isMimeEncoded() ? (MessageBody) new MimeEncodedMessageBody(
101: this )
102: : (MessageBody) new URLEncodedMessageBody(this );
103: }
104: return _body;
105: }
106:
107: //----------------------------------- package members -----------------------------------
108:
109: /**
110: * Constructs a web request for a form submitted by clicking a button.
111: **/
112: PostMethodWebRequest(WebForm sourceForm, SubmitButton button,
113: int x, int y) {
114: super (sourceForm, button, x, y);
115: }
116:
117: PostMethodWebRequest(WebForm sourceForm,
118: ParameterHolder parameterHolder, SubmitButton button,
119: int x, int y) {
120: super (sourceForm, parameterHolder, button, x, y);
121: }
122:
123: /**
124: * Constructs a web request for a form submitted via a script.
125: **/
126: PostMethodWebRequest(WebForm sourceForm) {
127: super (sourceForm);
128: }
129:
130: //---------------------------------- private members -------------------------------------
131:
132: private MessageBody _body;
133:
134: }
135:
136: //============================= class URLEncodedMessageBody ======================================
137:
138: /**
139: * A POST method request message body which uses the default URL encoding.
140: **/
141: class URLEncodedMessageBody extends MessageBody {
142:
143: URLEncodedMessageBody(PostMethodWebRequest request) {
144: super (request);
145: }
146:
147: /**
148: * Returns the content type of this message body.
149: **/
150: String getContentType() {
151: return "application/x-www-form-urlencoded"
152: + (!HttpUnitOptions.isPostIncludesCharset() ? ""
153: : "; charset=" + getRequest().getCharacterSet());
154: }
155:
156: /**
157: * Transmits the body of this request as a sequence of bytes.
158: **/
159: void writeTo(OutputStream outputStream) throws IOException {
160: outputStream.write(getParameterString().getBytes());
161: }
162:
163: private String getParameterString() {
164: try {
165: URLEncodedString encoder = new URLEncodedString();
166: getRequest().getParameterHolder().recordParameters(encoder);
167: return encoder.getString();
168: } catch (IOException e) {
169: throw new RuntimeException("Programming error: " + e); // should never happen
170: }
171: }
172: }
|