2010-06-04 12 views
6

मैं यहां पढ़ रहा हूं http://groovy.codehaus.org/modules/http-builder/doc/handlers.html "जिन मामलों में प्रतिक्रिया एक रीडायरेक्ट स्थिति कोड भेजती है, इन्हें आंतरिक रूप से अपाचे एचटीपी क्लाइंट द्वारा नियंत्रित किया जाता है, जो डिफ़ॉल्ट रूप से नए यूआरएल को अनुरोध दोबारा भेजकर रीडायरेक्ट का पालन करेगा। 302 प्रतिक्रियाओं का पालन करने के लिए कुछ भी विशेष करने की आवश्यकता नहीं है। "HTTP बिल्डर/ग्रोवी - 302 (रीडायरेक्ट) हैंडलिंग खो गया?

यह ठीक काम करने के लिए जब मैं बस एक बंद के बिना प्राप्त() या पोस्ट() तरीकों का उपयोग लगता है।

हालांकि, जब मैं एक बंद का उपयोग करें, मैं 302 से निपटने के कम करने के लिए लग रहे हैं। क्या मैं इसे स्वयं संभाल सकता हूं? धन्यवाद

पेज।

#!/usr/bin/env groovy 

import groovyx.net.http.HTTPBuilder 
import groovyx.net.http.Method 
import static groovyx.net.http.ContentType.URLENC 

import java.util.logging.ConsoleHandler 
import java.util.logging.Level 
import java.util.logging.Logger 

// MUST ENTER VALID FACEBOOK EMAIL AND PASSWORD BELOW !!! 
def email='' 
def pass='' 

// Remove default loggers 
def logger=Logger.getLogger('') 
def handlers=logger.handlers 
handlers.each() { handler->logger.removeHandler(handler) } 

// Log ALL to Console 
logger.setLevel Level.ALL 
def consoleHandler=new ConsoleHandler() 
consoleHandler.setLevel Level.ALL 
logger.addHandler(consoleHandler) 

// Facebook - need to get main page to capture cookies 
def http = new HTTPBuilder() 
http.get(uri:'http://www.facebook.com') 

// Login 
def html=http.post(uri:'https://login.facebook.com/login.php?login_attempt=1',body:[email:email,pass:pass]) 
assert html==null 

// Why null? 
html=http.post(uri:'https://login.facebook.com/login.php?login_attempt=1',body:[email:email,pass:pass]) { resp,reader-> 
    assert resp.statusLine.statusCode==302 

    // Shouldn't we be redirected??? 
    // http://groovy.codehaus.org/modules/http-builder/doc/handlers.html 
    // "In cases where a response sends a redirect status code, this is handled internally by Apache HttpClient, which by default will simply follow the redirect by re-sending the request to the new URL. You do not need to do anything special in order to follow 302 responses. " 
} 

यहाँ प्रासंगिक लॉग हैं::

// Copyright (C) 2010 Misha Koshelev. All Rights Reserved. 
package com.mksoft.fbbday.main 

import groovyx.net.http.ContentType 

import java.util.logging.Level 
import java.util.logging.Logger 

class HTTPBuilder { 
    def dataDirectory 
    HTTPBuilder(dataDirectory) { 
    this.dataDirectory=dataDirectory 
    } 

    // Main logic 
    def logger=Logger.getLogger(this.class.name) 
    def closure={resp,reader-> 
    logger.finer("resp.statusLine: \"${resp.statusLine}\"") 
    if (logger.isLoggable(Level.FINEST)) { 
     def respHeadersString='Headers:'; 
     resp.headers.each() { header->respHeadersString+="\n\t${header.name}=\"${header.value}\"" } 
     logger.finest(respHeadersString) 
    } 

    def text=reader.text 
    def lastHtml=new File("${dataDirectory}${File.separator}last.html") 
    if (lastHtml.exists()) { 
     lastHtml.delete() 
    } 
    lastHtml<<text 
    new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parseText(text)   
    } 
    def processArgs(args) { 
    if (logger.isLoggable(Level.FINER)) { 
     def argsString='Args:'; 
     args.each() { arg->argsString+="\n\t${arg.key}=\"${arg.value}\"" } 
     logger.finer(argsString) 
    } 
    args.contentType=groovyx.net.http.ContentType.TEXT 
    args 
    } 

    // HTTPBuilder methods 
    def httpBuilder=new groovyx.net.http.HTTPBuilder() 
    def get(args) { 
    httpBuilder.get(processArgs(args),closure) 
    } 
    def post(args) { 
    args.contentType=groovyx.net.http.ContentType.TEXT 
    httpBuilder.post(processArgs(args),closure) 
    } 
} 

यहाँ एक विशिष्ट परीक्षक है: यहाँ मेरी लॉग उत्पादन यह एक 302 प्रतिक्रिया

[java] FINER: resp.statusLine: "HTTP/1.1 302 Found" 

यहाँ दिखाया जा रहा है प्रासंगिक कोड है

FINE: Receiving response: HTTP/1.1 302 Found 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << HTTP/1.1 302 Found 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Expires: Sat, 01 Jan 2000 00:00:00 GMT 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Location: http://www.facebook.com/home.php? 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << P3P: CP="DSP LAW" 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Pragma: no-cache 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Set-Cookie: datr=1275687438-9ff6ae60a89d444d0fd9917abf56e085d370277a6e9ed50c1ba79; expires=Sun, 03-Jun-2012 21:37:24 GMT; path=/; domain=.facebook.com 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Set-Cookie: lxe=koshelev%40post.harvard.edu; expires=Tue, 28-Sep-2010 15:24:04 GMT; path=/; domain=.facebook.com; httponly 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Set-Cookie: lxr=deleted; expires=Thu, 04-Jun-2009 21:37:23 GMT; path=/; domain=.facebook.com; httponly 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Set-Cookie: pk=183883c0a9afab1608e95d59164cc7dd; path=/; domain=.facebook.com; httponly 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Content-Type: text/html; charset=utf-8 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << X-Cnection: close 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Date: Fri, 04 Jun 2010 21:37:24 GMT 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.DefaultClientConnection receiveResponseHeader 
FINE: << Content-Length: 0 
Jun 4, 2010 4:37:22 PM org.apache.http.client.protocol.ResponseProcessCookies processCookies 
FINE: Cookie accepted: "[version: 0][name: datr][value: 1275687438-9ff6ae60a89d444d0fd9917abf56e085d370277a6e9ed50c1ba79][domain: .facebook.com][path: /][expiry: Sun Jun 03 16:37:24 CDT 2012]". 
Jun 4, 2010 4:37:22 PM org.apache.http.client.protocol.ResponseProcessCookies processCookies 
FINE: Cookie accepted: "[version: 0][name: lxe][value: koshelev%40post.harvard.edu][domain: .facebook.com][path: /][expiry: Tue Sep 28 10:24:04 CDT 2010]". 
Jun 4, 2010 4:37:22 PM org.apache.http.client.protocol.ResponseProcessCookies processCookies 
FINE: Cookie accepted: "[version: 0][name: lxr][value: deleted][domain: .facebook.com][path: /][expiry: Thu Jun 04 16:37:23 CDT 2009]". 
Jun 4, 2010 4:37:22 PM org.apache.http.client.protocol.ResponseProcessCookies processCookies 
FINE: Cookie accepted: "[version: 0][name: pk][value: 183883c0a9afab1608e95d59164cc7dd][domain: .facebook.com][path: /][expiry: null]". 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.client.DefaultRequestDirector execute 
FINE: Connection can be kept alive indefinitely 
Jun 4, 2010 4:37:22 PM groovyx.net.http.HTTPBuilder doRequest 
FINE: Response code: 302; found handler: [email protected] 
Jun 4, 2010 4:37:22 PM groovyx.net.http.HTTPBuilder doRequest 
FINEST: response handler result: null 
Jun 4, 2010 4:37:22 PM org.apache.http.impl.conn.SingleClientConnManager releaseConnection 
FINE: Releasing connection [email protected]5b28c9 

आप देख सकते हैं स्पष्ट रूप से एक स्थान तर्क है।

आप Misha धन्यवाद

उत्तर

11

मैं HTTPBuilder साथ एक ही समस्या लिया है जब तक मुझे एहसास हुआ कि the HTTP/1.1 spec states:

पुनर्निर्देशन 3xx

[..] स्थिति कोड के इस वर्ग को इंगित करता है कि आगे की कार्रवाई
होने की जरूरत है के अनुरोध के लिए उपयोगकर्ता एजेंट द्वारा लिया गया अनुरोध पूरा करें। कार्रवाई
उपयोगकर्ता एजेंट उपयोगकर्ता के साथ बातचीत के बिना आवश्यक हो सकता है यदि उपयोगकर्ता और केवल यदि अनुरोध दूसरे अनुरोध में उपयोग किया गया है तो या HEAD प्राप्त करें।

302 मिली

[..] 302 स्थिति कोड अन्य GET या HEAD की तुलना में एक अनुरोध के जवाब में प्राप्त होता है, तो उपयोगकर्ता एजेंट नहीं स्वचालित रूप से अनुरोध को रीडायरेक्ट करना चाहिए जब तक यह द्वारा की पुष्टि की जा सकती है उपयोगकर्ता, क्योंकि यह उन स्थितियों को बदल सकता है जिनके तहत अनुरोध जारी किया गया था।

अनिवार्य रूप से इसका मतलब है कि अनुरोध एक पोस्ट और 302 रीडायरेक्ट निम्नलिखित स्वचालित रूप से काम नहीं करेगा और अगर HTTP/1.1 कल्पना पत्र द्वारा पीछा किया जाता उपयोगकर्ता के हस्तक्षेप की आवश्यकता होगी। सभी एचटीपी ग्राहक इस अभ्यास का पालन नहीं करते हैं, वास्तव में अधिकांश ब्राउज़र नहीं करते हैं। हालांकि अपाचे एचटीपी क्लाइंट (जो एचटीपीबिल्डर के लिए अंतर्निहित एचटीपी क्लाइंट है) is spec compliant। एक issue in the Apache Http Client bugtracker है जिसमें समस्या के लिए अधिक जानकारी और संभावित समाधान शामिल है।

+0

वाह। बहुत जानकारीपूर्ण आपको बहुत धन्यवाद! –

0

क्या अन्य हेडर आप देख पा रहे हैं जब आप 302 प्रतिक्रिया पर कार्रवाई? यदि आप http client logging चालू करना चाहते हैं तो आप 302 प्रतिक्रिया की HttpClient प्रक्रिया को देखने की उम्मीद करेंगे और स्वचालित रूप से Location शीर्षलेख में URL का अनुरोध करेंगे। जब आप उस यूआरएल को संसाधित करते हैं तो आप क्या देखते हैं? क्या यह किसी भी यूआरएल के लिए काम करता है?

कोशिश http://www.sun.com (यह Oracle करने के लिए अब पुनर्निर्देश।) मैं बस सोच रहा हूँ अगर सर्वर आप के साथ कुछ नहीं स्थान हेडर के साथ एक 302 भेजने जैसी wonky कर रही है काम कर रहे हैं।

+0

असल में मैंने www.sun.com की जांच की। यह एक 301 है। मिशा @ मिशा-डी 630:/टीएमपी $ टेलनेट www.sun.com 80 137.254.16.57 की कोशिश कर रहा है ... www.sun.com से कनेक्ट किया गया। एस्केप कैरेक्टर '^]' है। प्राप्त/HTTP/1.1 HTTP/1.1 301 स्थायी रूप से स्थानांतरित सर्वर: सूर्य जावा प्रणाली वेब सर्वर/7.0 तिथि: शुक्र, 04 जून 2010 21:36:01 GMT P3P: policyref = "http: //www.sun.com/p3p/Sun_P3P_Policy.xml ", सी.पी. =" मुख्य लेखा अधिकारी डीएसपी COR CUR ADMA देवा Taia PSAa PSDa Coni तेली हमारे सामी PUBi आईएनडी PHY ONL पुर कॉम एनएवी INT डीईएम CNT एसटीए पीओएल पूर्व GOV " स्थान : http://www.oracle.com/us/sun कनेक्शन: बंद –

1
void test_myPage_shouldRedirectToLogin() { 
    def baseURI = "http://servername" 
    def httpBuilder = new HTTPBuilder(baseURI) 
    // Make sure that HttpClient doesn't perform a redirect 
    def dontHandleRedirectStrategy = [ 
    getRedirect : { request, response, context -> null}, 
    isRedirected : { request, response, context -> false} 
    ] 
    httpBuilder.client.setRedirectStrategy(dontHandleRedirectStrategy as RedirectStrategy) 

    // Execute a GET request and expect a redirect 
    httpBuilder.request(Method.GET, ContentType.TEXT) { 
    req -> 
     uri.path = '/webapp/de/de/myPage' 
     response.success = { response, reader -> 
     assertThat response.statusLine.statusCode, is(302) 
     assertThat response.headers['Location'].value, startsWith("${baseURI}/webapp/login") 
     } 
     response.failure = { response, reader -> 
     fail("Expected redirect but received ${response.statusLine} \n ${reader}") 
     } 
    } 
    } 

302 स्थिति आ रहा है, क्योंकि किसी भी लिंक पर पुनः निर्देशित यूआरएल पर कार्रवाई के बाद HttpBuilder द्वारा पालन नहीं तो हम "RedirectStrategy" स्पष्ट रूप से जोड़ने की जरूरत है।

संबंधित मुद्दे