-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathHttpClient.java
More file actions
156 lines (145 loc) · 6.34 KB
/
HttpClient.java
File metadata and controls
156 lines (145 loc) · 6.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/****************************************************************************/
/* File: HttpClient.java */
/* Author: F. Georges - fgeorges.org */
/* Date: 2009-02-01 */
/* Tags: */
/* Copyright (c) 2009 Florent Georges (see end of file.) */
/* ------------------------------------------------------------------------ */
package org.expath.httpclient;
import java.net.URI;
import java.net.URISyntaxException;
import org.expath.httpclient.impl.ApacheHttpConnection;
import org.expath.httpclient.impl.RequestParser;
import org.expath.httpclient.model.Result;
import org.expath.tools.model.Element;
import org.expath.tools.model.Sequence;
/**
* Facade for the EXPath HTTP Client, generic implementation for Java.
*
* @author Florent Georges
*/
public class HttpClient
{
/**
* Implement the EXPath function {@code http:send-request()}.
*
* <pre>
* http:send-request($request as element(http:request)?) as item()+
* </pre>
*
* @param result The {@link Result} object to send the results to.
* @param request The {@code http:request} element.
* @return The result object.
* @throws HttpClientException If any error occurs.
*/
public static Result sendRequest(Result result, Element request)
throws HttpClientException
{
return sendRequest(result, request, null, null);
}
/**
* Implement the EXPath function {@code http:send-request()}.
*
* <pre>
* http:send-request($request as element(http:request)?,
* $href as xs:string?) as item()+
* </pre>
*
* @param result The {@link Result} object to send the results to.
* @param request The {@code http:request} element.
* @param href The URL to sent the HTTP request to. Overrides the one in
* the request element.
* @return The result object.
* @throws HttpClientException If any error occurs.
*/
public static Result sendRequest(Result result, Element request, String href)
throws HttpClientException
{
return sendRequest(result, request, href, null);
}
/**
* Implement the EXPath function {@code http:send-request()}.
*
* <pre>
* http:send-request($request as element(http:request)?,
* $href as xs:string?,
* $bodies as item()*) as item()+
* </pre>
*
* @param result The {@link Result} object to send the results to.
* @param request The {@code http:request} element.
* @param href The URL to sent the HTTP request to. Overrides the one in
* the request element.
* @param bodies The content of the HTTP request (the entity body, or bodies
* in case of multi-part).
* @return The result object.
* @throws HttpClientException If any error occurs.
*/
public static Result sendRequest(Result result, Element request, String href, Sequence bodies)
throws HttpClientException
{
HttpClient client = new HttpClient();
return client.doSendRequest(result, request, href, bodies);
}
private Result doSendRequest(Result result, Element request, String href, Sequence bodies)
throws HttpClientException
{
RequestParser parser = new RequestParser(request);
HttpRequest req = parser.parse(bodies, href);
// override anyway it href exists
if ( href != null && ! "".equals(href) ) {
req.setHref(href);
}
try {
URI uri = new URI(req.getHref());
return sendOnce(result, uri, req, parser);
}
catch ( URISyntaxException ex ) {
throw new HttpClientException("Href is not valid: " + req.getHref(), ex);
}
}
/**
* Send one request, not following redirect but handling authentication.
*
* Authentication may require to reply to an authentication challenge,
* by sending again the request, with credentials.
*/
private Result sendOnce(Result result, URI uri, HttpRequest request, RequestParser parser)
throws HttpClientException
{
HttpConnection conn = new ApacheHttpConnection(uri);
try {
HttpResponse response = request.send(result, conn, parser.getCredentials());
if ( response.getStatus() == 401 ) {
conn.disconnect();
conn = new ApacheHttpConnection(uri);
// create a new result, and throw the old one away
result = result.makeNewResult();
request.send(result, conn, parser.getCredentials());
}
}
finally {
conn.disconnect();
}
return result;
}
}
/* ------------------------------------------------------------------------ */
/* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS COMMENT. */
/* */
/* The contents of this file are subject to the Mozilla Public License */
/* Version 1.0 (the "License"); you may not use this file except in */
/* compliance with the License. You may obtain a copy of the License at */
/* http://www.mozilla.org/MPL/. */
/* */
/* Software distributed under the License is distributed on an "AS IS" */
/* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See */
/* the License for the specific language governing rights and limitations */
/* under the License. */
/* */
/* The Original Code is: all this file. */
/* */
/* The Initial Developer of the Original Code is Florent Georges. */
/* */
/* Contributor(s): none. */
/* ------------------------------------------------------------------------ */