Hallo Stefan, hallo Rudi,
ich versuche per HTTPMOD einen API Aufruf per POST auf https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/ (https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/)
Allerdings bekomme ich die Meldung, dass die Content-Length im Request-Header wohl fehlt:
HTTP/1.1 411 Length Required
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Mon, 23 Nov 2015 23:11:23 GMT
Connection: close
Content-Length: 344
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML><HEAD><TITLE>Length Required</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> <BODY><h2>Length Required</h2> <hr><p>HTTP Error 411. The request must be chunked or have a content length.</p></BODY></HTML>
Schickt HttpUtils da keine mit? Kann ich das irgendwie beeinflussen?
Gruß
Julian
Wenn ich meine Content-Length selbst berechne und als requestHeader.* "Content-Length: 167" angebe, funktioniert die Abfrage.
Content-Length wird dann gesetzt, falls man Daten uebergibt.
In diesem Fall wird auch Content-Type gesetzt.
Du kannst es selbst mit einem Request nach z.Bsp. http://requestb.in/ verifizieren.
Ich übergebe ja Daten per requestData und laut Logfile werden die auch von HTTPMOD an HttpUtils übergeben.
Das sieht man auch daran, dass die Daten ja auch entsprechend verwendet werden, wenn ich Content-Length selbst explizit setze, denn dann erhalte ich auf meine POST Anfrage auch die erwartete Antwort. Ohne Content-Length selbst zu setzen erhalte ich genannte Fehlermeldung auf meine POST Anfrage.
Mit requestb.in konnte ich das grad nicht nachstellen, weil meine Anfragen dort irgendwie nicht ankommen (obwohl HTTPMOD die erfolgreiche Rückmeldung in den INTERNALS zeigt).
Hier noch ein List:
Internals:
BUSY 0
CHANGED
DEF https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/ 590
GetSeq 0
HTTPHEADER
Interval 590
LASTSEND 1448378271.54588
MainURL https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/
NAME BingTTS
NR 313
STATE intialized
TRIGGERTIME 1448378841.23156
TRIGGERTIME_FMT 2015-11-24 16:27:21
TYPE HTTPMOD
addr https://datamarket.accesscontrol.windows.net:443
buf HTTP/1.1 411 Length Required
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 24 Nov 2015 15:17:50 GMT
Connection: close
Content-Length: 344
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Length Required</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Length Required</h2>
<hr><p>HTTP Error 411. The request must be chunked or have a content length.</p>
</BODY></HTML>
code 411
conn
data grant_type=client_credentials&scope=http%3a%2f%2fapi.microsofttranslator.com&client_id=MEINECLIENTID&client_secret=MEINGEHEIMERKEY%3d
displayurl https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/
header
host datamarket.accesscontrol.windows.net
httpheader HTTP/1.1 411 Length Required
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 24 Nov 2015 15:17:50 GMT
Connection: close
Content-Length: 344
hu_blocking 0
hu_filecount 2
ignoreredirects 0
loglevel 4
path /v2/OAuth2-13/
protocol https
redirects 0
timeout 2
url https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/
CHANGETIME:
QUEUE:
Readings:
Request:
data grant_type=client_credentials&scope=http%3a%2f%2fapi.microsofttranslator.com&client_id=MEINECLIENTID&client_secret=MEINGEHEIMERKEY%3d
header
ignoreredirects 0
retryCount 0
type Update
url https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/
Sslargs:
Attributes:
DbLogExclude .*
enableControlSet 1
event-on-change-reading state
get01HdrExpr return $old . " " . ReadingsVal($name,"access_token","0");
get01Header.* Authorization: Bearer
get01Name tts
get01URL http://api.microsofttranslator.com/V2/Http.svc/Speak?language=de&format=audio/mp3&options=MaxQuality&appid=&text=$val
reading01Name access_token
reading01Regex "access_token"\w*:\w*"([\w%.=\-_&:/]+)
reading02Name expires_in
reading02Regex "expires_in"\w*:\w*"([\w%.=\-_&:/]+)
reading03Expr urlDecode($val)
reading03Name scope
reading03Regex "scope"\w*:\w*"([\w%.=\-_&:/]+)
requestData.* grant_type=client_credentials&scope=http%3a%2f%2fapi.microsofttranslator.com&client_id=MEINECLIENTID&client_secret=MEINGEHEIMERKEY%3d
userattr DbLogExclude enableControlSet event-on-change-reading get01DatExpr get01Data get01HdrExpr get01Header.* get01Name get01URL get01URLExpr reading01Expr reading01Name reading01Regex reading02Expr reading02Name reading02Regex reading03Expr reading03Name reading03Regex reading04Expr reading04Format reading04Name reading04Regex requestData.* requestHeader.*
Wenn man dort das Attribut requestHeader.* "Content-Length: 167" selbst hinzufügt, dann funktioniert die Anfrage.
Solltest du damit also nachstellen können (auch ohne gültige API Daten).
Das Problem ist, dass HTTPMOD einen leeres header mitgibt, und HttpUtils das mit einem \r\n zu den restlichen Daten hinzufuegt. Das Ergebnis ist eine Leerzeile im Header, was nicht regelkonform ist.
Ich habe HttpUtils modifiziert, damit solche header ignoriert werden. Ab morgen per update.
Spitzenmäßig! :)
Ich bin nicht sicher, obs jetzt an dem Fix liegt. Aber ich erhalte jetzt zwar eine Content-Length, aber keine Antwort mehr vom Server:
2015.11.27 19:50:21 3: BingTTS: Read callback: request type was Update,
header: HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
request-id: 64000b19-de4e-4f83-a9be-8343cff29982
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000; includeSubDomains
Date: Fri, 27 Nov 2015 18:40:27 GMT
Connection: close
Content-Length: 604, buffer empty,
Error read from to https://datamarket.accesscontrol.windows.net:443 timed out
Von meinem Rechner aus kann ich den Server per Browser ansprechen.