aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sx-encoding.el29
-rw-r--r--sx-request.el28
2 files changed, 40 insertions, 17 deletions
diff --git a/sx-encoding.el b/sx-encoding.el
index 8ac12ca..98f3a7c 100644
--- a/sx-encoding.el
+++ b/sx-encoding.el
@@ -74,6 +74,35 @@
(substring ss 1))))))))
(replace-regexp-in-string "&[^; ]*;" get-function string)))
+(defun sx-encoding-gzipped-p (data)
+ "Checks for magic bytes in DATA.
+
+Check if the first two bytes of a string in DATA match magic
+numbers identifying the gzip file format. See [1] for the file
+format description.
+
+http://www.gzip.org/zlib/rfc-gzip.html
+
+http://emacs.stackexchange.com/a/2978"
+ (equal (substring (string-as-unibyte data) 0 2)
+ (unibyte-string 31 139)))
+
+(defun sx-encoding-gzipped-buffer-p (filename)
+ "Check if the BUFFER is gzip-compressed.
+
+See `gzip-check-magic' for details."
+ (sx-encoding-gzip-check-magic (buffer-string)))
+
+(defun sx-encoding-gzipped-file-p (file)
+ "Check if the FILE is gzip-compressed.
+
+See `gzip-check-magic' for details."
+ (let ((first-two-bytes (with-temp-buffer
+ (set-buffer-multibyte nil)
+ (insert-file-contents-literally file nil 0 2)
+ (buffer-string))))
+ (gzip-check-magic first-two-bytes)))
+
(provide 'sx-encoding)
;;; sx-encoding.el ends here
diff --git a/sx-request.el b/sx-request.el
index 9d9dca4..12d2b14 100644
--- a/sx-request.el
+++ b/sx-request.el
@@ -92,24 +92,18 @@ number of requests left every time it finishes a call.")
(error "Response headers missing; response corrupt")
(delete-region (point-min) (point))
(buffer-string))))
- (response (ignore-errors
+ (response-zipped-p (sx-encoding-gzipped-p data))
+ (data (if (not response-zipped-p) data
+ (shell-command-on-region
+ (point-min) (point-max)
+ sx-request-unzip-program
+ nil t)
+ (buffer-string)))
+ (response (with-demoted-errors "`json' error: %S"
(json-read-from-string data))))
- ;; If the response isn't nil, the response was in plain text
- (unless response
- ;; try to decompress the response
- (setq response
- (with-demoted-errors "`json-read' error: %S"
- (shell-command-on-region
- (point-min) (point-max)
- sx-request-unzip-program
- nil t)
- (json-read-from-string
- (buffer-substring
- (point-min) (point-max)))))
- ;; if it still fails, error outline
- (unless response
- (sx-message "Unable to parse response: %S" response)
- (error "Response could not be read by `json-read-from-string'")))
+ (unless (not (and (not response) (string-equal data "{}")))
+ (sx-message "Unable to parse response: %S" response)
+ (error "Response could not be read by `json-read-from-string'"))
;; If we get here, the response is a valid data structure
(sx-assoc-let response
(when error_id